lapacke.h(3)

📦 version 3.9.0, in centos-stream 9

🎀 NAME 🎀

lapacke.h — bestie, this is the header for the LAPACK C interface, and it lives in the LAPACK section 3 of the manual. Say hi 👋


✨ SYNOPSIS ✨

Okay so before you can even talk to this header, you gotta bring its friends along. Like, the vibe check requires these exact lines, no cap:

#include <stdlib.h>
#include <complex.h>
#include 'lapacke_mangling.h'

That's it, that's the intro 🫶 — stdlib.h for the standard-library basics, complex.h because LAPACK is very into complex numbers 💅, and 'lapacke_mangling.h' (yes, with the single quotes, keep them exactly like that, don't come for me 🙈) handling the name-mangling situation so everything links up pretty.

Lowkey iconic already, and there's so much more coming 👑

🎀 Macros 🎀

Okay bestie, this is the part where lapacke.h just goes off with the #defines. Buckle in, because there are a LOT. And the way it's structured is actually so satisfying once you see it. 💅

First, the foundational ones — the type definitions and the little helper macros that everything else stands on:

#define lapack_int   int
#define lapack_logical   lapack_int
#define lapack_complex_float   float _Complex
#define lapack_complex_float_real(z)   (creal(z))
#define lapack_complex_float_imag(z)   (cimag(z))
#define lapack_complex_double   double _Complex
#define lapack_complex_double_real(z)   (creal(z))
#define lapack_complex_double_imag(z)   (cimag(z))
#define LAPACKE_malloc(size)   malloc( size )
#define LAPACKE_free(p)   free( p )
#define LAPACK_C2INT(x)   (lapack_int)(*((float*)&x ))
#define LAPACK_Z2INT(x)   (lapack_int)(*((double*)&x ))
#define LAPACK_ROW_MAJOR   101
#define LAPACK_COL_MAJOR   102
#define LAPACK_WORK_MEMORY_ERROR   -1010
#define LAPACK_TRANSPOSE_MEMORY_ERROR   -1011

So lapack_int is literally just int, and lapack_logical is literally just lapack_int. The complex types are float _Complex and double _Complex (C complex numbers, periodt), and <pink>_real<//>/_imagjust grab the components viacreal(z)andcimag(z). Then you've got LAPACKE_mallocandLAPACKE_freewrapped around plainmalloc( size )andfree( p ). And those two error codes? LAPACK_WORK_MEMORY_ERRORis-1010andLAPACK_TRANSPOSE_MEMORY_ERRORis-1011` — negative, so if you see them in your return value you already know something went sideways. 🫶

LAPACK_ROW_MAJOR is 101 and LAPACK_COL_MAJOR is 102, in case you were wondering which way the numbers go. 💀


✨ The LAPACK_ Aliases ✨

Then comes the parade. Every single entry is the same shape: #define LAPACK_something LAPACK_GLOBAL(something,SOMETHING). Lowercase real name, uppercase shouty name. So basically it's the same function, just wearing two name tags. 😭 Go off.

Starting with lsame and the ?getrf / ?getrf2 crew:

#define LAPACK_lsame   LAPACK_GLOBAL(lsame,LSAME)
#define LAPACK_sgetrf   LAPACK_GLOBAL(sgetrf,SGETRF)
#define LAPACK_dgetrf   LAPACK_GLOBAL(dgetrf,DGETRF)
#define LAPACK_cgetrf   LAPACK_GLOBAL(cgetrf,CGETRF)
#define LAPACK_zgetrf   LAPACK_GLOBAL(zgetrf,ZGETRF)
#define LAPACK_sgetrf2   LAPACK_GLOBAL(sgetrf2,SGETRF2)
#define LAPACK_dgetrf2   LAPACK_GLOBAL(dgetrf2,DGETRF2)
#define LAPACK_cgetrf2   LAPACK_GLOBAL(cgetrf2,CGETRF2)
#define LAPACK_zgetrf2   LAPACK_GLOBAL(zgetrf2,ZGETRF2)

See the pattern? s, d, c, z — four flavors, every time. Cute.

Band and tridiagonal vibes next:

#define LAPACK_sgbtrf   LAPACK_GLOBAL(sgbtrf,SGBTRF)
#define LAPACK_dgbtrf   LAPACK_GLOBAL(dgbtrf,DGBTRF)
#define LAPACK_cgbtrf   LAPACK_GLOBAL(cgbtrf,CGBTRF)
#define LAPACK_zgbtrf   LAPACK_GLOBAL(zgbtrf,ZGBTRF)
#define LAPACK_sgttrf   LAPACK_GLOBAL(sgttrf,SGTTRF)
#define LAPACK_dgttrf   LAPACK_GLOBAL(dgttrf,DGTTRF)
#define LAPACK_cgttrf   LAPACK_GLOBAL(cgttrf,CGTTRF)
#define LAPACK_zgttrf   LAPACK_GLOBAL(zgttrf,ZGTTRF)

Then the positive-definite factorization squad, including the 2 variants:

#define LAPACK_spotrf   LAPACK_GLOBAL(spotrf,SPOTRF)
#define LAPACK_dpotrf   LAPACK_GLOBAL(dpotrf,DPOTRF)
#define LAPACK_cpotrf   LAPACK_GLOBAL(cpotrf,CPOTRF)
#define LAPACK_zpotrf   LAPACK_GLOBAL(zpotrf,ZPOTRF)
#define LAPACK_spotrf2   LAPACK_GLOBAL(spotrf2,SPOTRF2)
#define LAPACK_dpotrf2   LAPACK_GLOBAL(dpotrf2,DPOTRF2)
#define LAPACK_cpotrf2   LAPACK_GLOBAL(cpotrf2,CPOTRF2)
#define LAPACK_zpotrf2   LAPACK_GLOBAL(zpotrf2,ZPOTRF2)

And here's where the alphabet starts getting ✨unhinged✨ — note the ordering flips around, so stay awake bestie:

#define LAPACK_dpstrf   LAPACK_GLOBAL(dpstrf,DPSTRF)
#define LAPACK_spstrf   LAPACK_GLOBAL(spstrf,SPSTRF)
#define LAPACK_zpstrf   LAPACK_GLOBAL(zpstrf,ZPSTRF)
#define LAPACK_cpstrf   LAPACK_GLOBAL(cpstrf,CPSTRF)
#define LAPACK_dpftrf   LAPACK_GLOBAL(dpftrf,DPFTRF)
#define LAPACK_spftrf   LAPACK_GLOBAL(spftrf,SPFTRF)
#define LAPACK_zpftrf   LAPACK_GLOBAL(zpftrf,ZPFTRF)
#define LAPACK_cpftrf   LAPACK_GLOBAL(cpftrf,CPFTRF)

Packed storage era:

#define LAPACK_spptrf   LAPACK_GLOBAL(spptrf,SPPTRF)
#define LAPACK_dpptrf   LAPACK_GLOBAL(dpptrf,DPPTRF)
#define LAPACK_cpptrf   LAPACK_GLOBAL(cpptrf,CPPTRF)
#define LAPACK_zpptrf   LAPACK_GLOBAL(zpptrf,ZPPTRF)
#define LAPACK_spbtrf   LAPACK_GLOBAL(spbtrf,SPBTRF)
#define LAPACK_dpbtrf   LAPACK_GLOBAL(dpbtrf,DPBTRF)
#define LAPACK_cpbtrf   LAPACK_GLOBAL(cpbtrf,CPBTRF)
#define LAPACK_zpbtrf   LAPACK_GLOBAL(zpbtrf,ZPBTRF)
#define LAPACK_spttrf   LAPACK_GLOBAL(spttrf,SPTTRF)
#define LAPACK_dpttrf   LAPACK_GLOBAL(dpttrf,DPTTRF)
#define LAPACK_cpttrf   LAPACK_GLOBAL(cpttrf,CPTTRF)
#define LAPACK_zpttrf   LAPACK_GLOBAL(zpttrf,ZPTTRF)

Now the symmetric and Hermitian ones — oh and hey, look, the _rook variants pulled up 🎀:

#define LAPACK_ssytrf   LAPACK_GLOBAL(ssytrf,SSYTRF)
#define LAPACK_ssytrf_rook   LAPACK_GLOBAL(ssytrf_rook,SSYTRF_ROOK)
#define LAPACK_dsytrf   LAPACK_GLOBAL(dsytrf,DSYTRF)
#define LAPACK_dsytrf_rook   LAPACK_GLOBAL(dsytrf_rook,DSYTRF_ROOK)
#define LAPACK_csytrf   LAPACK_GLOBAL(csytrf,CSYTRF)
#define LAPACK_csytrf_rook   LAPACK_GLOBAL(csytrf_rook,CSYTRF_ROOK)
#define LAPACK_zsytrf   LAPACK_GLOBAL(zsytrf,ZSYTRF)
#define LAPACK_zsytrf_rook   LAPACK_GLOBAL(zsytrf_rook,ZSYTRF_ROOK)
#define LAPACK_chetrf   LAPACK_GLOBAL(chetrf,CHETRF)
#define LAPACK_chetrf_rook   LAPACK_GLOBAL(chetrf_rook,CHETRF_ROOK)
#define LAPACK_zhetrf   LAPACK_GLOBAL(zhetrf,ZHETRF)
#define LAPACK_zhetrf_rook   LAPACK_GLOBAL(zhetrf_rook,ZHETRF_ROOK)
#define LAPACK_ssptrf   LAPACK_GLOBAL(ssptrf,SSPTRF)
#define LAPACK_dsptrf   LAPACK_GLOBAL(dsptrf,DSPTRF)
#define LAPACK_csptrf   LAPACK_GLOBAL(csptrf,CSPTRF)
#define LAPACK_zsptrf   LAPACK_GLOBAL(zsptrf,ZSPTRF)
#define LAPACK_chptrf   LAPACK_GLOBAL(chptrf,CHPTRF)
#define LAPACK_zhptrf   LAPACK_GLOBAL(zhptrf,ZHPTRF)

Note chetrf / zhetrf only come in c and z (no s/d for the Hermitian ones), and same for chptrf / zhptrf. Not every family gets all four letters — that's just how it is. 🙈


🌸 Solve Phase: ?trs 🌸

Okay so everything above was the factorize side, and now we get the matching trs crowd. Same names, trf swapped for trs. It's giving "matching set". 💖

#define LAPACK_sgetrs   LAPACK_GLOBAL(sgetrs,SGETRS)
#define LAPACK_dgetrs   LAPACK_GLOBAL(dgetrs,DGETRS)
#define LAPACK_cgetrs   LAPACK_GLOBAL(cgetrs,CGETRS)
#define LAPACK_zgetrs   LAPACK_GLOBAL(zgetrs,ZGETRS)
#define LAPACK_sgbtrs   LAPACK_GLOBAL(sgbtrs,SGBTRS)
#define LAPACK_dgbtrs   LAPACK_GLOBAL(dgbtrs,DGBTRS)
#define LAPACK_cgbtrs   LAPACK_GLOBAL(cgbtrs,CGBTRS)
#define LAPACK_zgbtrs   LAPACK_GLOBAL(zgbtrs,ZGBTRS)
#define LAPACK_sgttrs   LAPACK_GLOBAL(sgttrs,SGTTRS)
#define LAPACK_dgttrs   LAPACK_GLOBAL(dgttrs,DGTTRS)
#define LAPACK_cgttrs   LAPACK_GLOBAL(cgttrs,CGTTRS)
#define LAPACK_zgttrs   LAPACK_GLOBAL(zgttrs,ZGTTRS)
#define LAPACK_spotrs   LAPACK_GLOBAL(spotrs,SPOTRS)
#define LAPACK_dpotrs   LAPACK_GLOBAL(dpotrs,DPOTRS)
#define LAPACK_cpotrs   LAPACK_GLOBAL(cpotrs,CPOTRS)
#define LAPACK_zpotrs   LAPACK_GLOBAL(zpotrs,ZPOTRS)
#define LAPACK_dpftrs   LAPACK_GLOBAL(dpftrs,DPFTRS)
#define LAPACK_spftrs   LAPACK_GLOBAL(spftrs,SPFTRS)
#define LAPACK_zpftrs   LAPACK_GLOBAL(zpftrs,ZPFTRS)
#define LAPACK_cpftrs   LAPACK_GLOBAL(cpftrs,CPFTRS)
#define LAPACK_spptrs   LAPACK_GLOBAL(spptrs,SPPTRS)
#define LAPACK_dpptrs   LAPACK_GLOBAL(dpptrs,DPPTRS)
#define LAPACK_cpptrs   LAPACK_GLOBAL(cpptrs,CPPTRS)
#define LAPACK_zpptrs   LAPACK_GLOBAL(zpptrs,ZPPTRS)
#define LAPACK_spbtrs   LAPACK_GLOBAL(spbtrs,SPBTRS)
#define LAPACK_dpbtrs   LAPACK_GLOBAL(dpbtrs,DPBTRS)
#define LAPACK_cpbtrs   LAPACK_GLOBAL(cpbtrs,CPBTRS)
#define LAPACK_zpbtrs   LAPACK_GLOBAL(zpbtrs,ZPBTRS)
#define LAPACK_spttrs   LAPACK_GLOBAL(spttrs,SPTTRS)
#define LAPACK_dpttrs   LAPACK_GLOBAL(dpttrs,DPTTRS)
#define LAPACK_cpttrs   LAPACK_GLOBAL(cpttrs,CPTTRS)
#define LAPACK_zpttrs   LAPACK_GLOBAL(zpttrs,ZPTTRS)

And the symmetric/Hermitian trs crew (rook versions included, of course):

#define LAPACK_ssytrs   LAPACK_GLOBAL(ssytrs,SSYTRS)
#define LAPACK_ssytrs_rook   LAPACK_GLOBAL(ssytrs_rook,SSYTRS_ROOK)
#define LAPACK_dsytrs   LAPACK_GLOBAL(dsytrs,DSYTRS)
#define LAPACK_dsytrs_rook   LAPACK_GLOBAL(dsytrs_rook,DSYTRS_ROOK)
#define LAPACK_csytrs   LAPACK_GLOBAL(csytrs,CSYTRS)
#define LAPACK_csytrs_rook   LAPACK_GLOBAL(csytrs_rook,CSYTRS_ROOK)
#define LAPACK_zsytrs   LAPACK_GLOBAL(zsytrs,ZSYTRS)
#define LAPACK_zsytrs_rook   LAPACK_GLOBAL(zsytrs_rook,ZSYTRS_ROOK)
#define LAPACK_chetrs   LAPACK_GLOBAL(chetrs,CHETRS)
#define LAPACK_chetrs_rook   LAPACK_GLOBAL(chetrs_rook,CHETRS_ROOK)
#define LAPACK_zhetrs   LAPACK_GLOBAL(zhetrs,ZHETRS)
#define LAPACK_zhetrs_rook   LAPACK_GLOBAL(zhetrs_rook,ZHETRS_ROOK)
#define LAPACK_ssptrs   LAPACK_GLOBAL(ssptrs,SSPTRS)
#define LAPACK_dsptrs   LAPACK_GLOBAL(dsptrs,DSPTRS)
#define LAPACK_csptrs   LAPACK_GLOBAL(csptrs,CSPTRS)
#define LAPACK_zsptrs   LAPACK_GLOBAL(zsptrs,ZSPTRS)
#define LAPACK_chptrs   LAPACK_GLOBAL(chptrs,CHPTRS)
#define LAPACK_zhptrs   LAPACK_GLOBAL(zhptrs,ZHPTRS)

And a whole t* cluster that you did clock correctly, don't worry:

#define LAPACK_strtrs   LAPACK_GLOBAL(strtrs,STRTRS)
#define LAPACK_dtrtrs   LAPACK_GLOBAL(dtrtrs,DTRTRS)
#define LAPACK_ctrtrs   LAPACK_GLOBAL(ctrtrs,CTRTRS)
#define LAPACK_ztrtrs   LAPACK_GLOBAL(ztrtrs,ZTRTRS)
#define LAPACK_stptrs   LAPACK_GLOBAL(stptrs,STPTRS)
#define LAPACK_dtptrs   LAPACK_GLOBAL(dtptrs,DTPTRS)
#define LAPACK_ctptrs   LAPACK_GLOBAL(ctptrs,CTPTRS)
#define LAPACK_ztptrs   LAPACK_GLOBAL(ztptrs,ZTPTRS)
#define LAPACK_stbtrs   LAPACK_GLOBAL(stbtrs,STBTRS)
#define LAPACK_dtbtrs   LAPACK_GLOBAL(dtbtrs,DTBTRS)
#define LAPACK_ctbtrs   LAPACK_GLOBAL(ctbtrs,CTBTRS)
#define LAPACK_ztbtrs   LAPACK_GLOBAL(ztbtrs,ZTBTRS)

🦋 Condition Numbers: ?con 🦋

Now the con family, i.e. the LAPACK_*gecon, *gbcon, *gtcon, *pocon, *ppcon, *pbcon, *ptcon, *sycon, *hecon, *spcon, *hpcon, *trcon, *tpcon, *tbcon block. Big block. Big slay.

#define LAPACK_sgecon   LAPACK_GLOBAL(sgecon,SGECON)
#define LAPACK_dgecon   LAPACK_GLOBAL(dgecon,DGECON)
#define LAPACK_cgecon   LAPACK_GLOBAL(cgecon,CGECON)
#define LAPACK_zgecon   LAPACK_GLOBAL(zgecon,ZGECON)
#define LAPACK_sgbcon   LAPACK_GLOBAL(sgbcon,SGBCON)
#define LAPACK_dgbcon   LAPACK_GLOBAL(dgbcon,DGBCON)
#define LAPACK_cgbcon   LAPACK_GLOBAL(cgbcon,CGBCON)
#define LAPACK_zgbcon   LAPACK_GLOBAL(zgbcon,ZGBCON)
#define LAPACK_sgtcon   LAPACK_GLOBAL(sgtcon,SGTCON)
#define LAPACK_dgtcon   LAPACK_GLOBAL(dgtcon,DGTCON)
#define LAPACK_cgtcon   LAPACK_GLOBAL(cgtcon,CGTCON)
#define LAPACK_zgtcon   LAPACK_GLOBAL(zgtcon,ZGTCON)
#define LAPACK_spocon   LAPACK_GLOBAL(spocon,SPOCON)
#define LAPACK_dpocon   LAPACK_GLOBAL(dpocon,DPOCON)
#define LAPACK_cpocon   LAPACK_GLOBAL(cpocon,CPOCON)
#define LAPACK_zpocon   LAPACK_GLOBAL(zpocon,ZPOCON)
#define LAPACK_sppcon   LAPACK_GLOBAL(sppcon,SPPCON)
#define LAPACK_dppcon   LAPACK_GLOBAL(dppcon,DPPCON)
#define LAPACK_cppcon   LAPACK_GLOBAL(cppcon,CPPCON)
#define LAPACK_zppcon   LAPACK_GLOBAL(zppcon,ZPPCON)
#define LAPACK_spbcon   LAPACK_GLOBAL(spbcon,SPBCON)
#define LAPACK_dpbcon   LAPACK_GLOBAL(dpbcon,DPBCON)
#define LAPACK_cpbcon   LAPACK_GLOBAL(cpbcon,CPBCON)
#define LAPACK_zpbcon   LAPACK_GLOBAL(zpbcon,ZPBCON)
#define LAPACK_sptcon   LAPACK_GLOBAL(sptcon,SPTCON)
#define LAPACK_dptcon   LAPACK_GLOBAL(dptcon,DPTCON)
#define LAPACK_cptcon   LAPACK_GLOBAL(cptcon,CPTCON)
#define LAPACK_zptcon   LAPACK_GLOBAL(zptcon,ZPTCON)

Sym / Hermitian / packed / triangular continuation:

#define LAPACK_ssycon   LAPACK_GLOBAL(ssycon,SSYCON)
#define LAPACK_dsycon   LAPACK_GLOBAL(dsycon,DSYCON)
#define LAPACK_csycon   LAPACK_GLOBAL(csycon,CSYCON)
#define LAPACK_zsycon   LAPACK_GLOBAL(zsycon,ZSYCON)
#define LAPACK_checon   LAPACK_GLOBAL(checon,CHECON)
#define LAPACK_zhecon   LAPACK_GLOBAL(zhecon,ZHECON)
#define LAPACK_sspcon   LAPACK_GLOBAL(sspcon,SSPCON)
#define LAPACK_dspcon   LAPACK_GLOBAL(dspcon,DSPCON)
#define LAPACK_cspcon   LAPACK_GLOBAL(cspcon,CSPCON)
#define LAPACK_zspcon   LAPACK_GLOBAL(zspcon,ZSPCON)
#define LAPACK_chpcon   LAPACK_GLOBAL(chpcon,CHPCON)
#define LAPACK_zhpcon   LAPACK_GLOBAL(zhpcon,ZHPCON)
#define LAPACK_strcon   LAPACK_GLOBAL(strcon,STRCON)
#define LAPACK_dtrcon   LAPACK_GLOBAL(dtrcon,DTRCON)
#define LAPACK_ctrcon   LAPACK_GLOBAL(ctrcon,CTRCON)
#define LAPACK_ztrcon   LAPACK_GLOBAL(ztrcon,ZTRCON)
#define LAPACK_stpcon   LAPACK_GLOBAL(stpcon,STPCON)
#define LAPACK_dtpcon   LAPACK_GLOBAL(dtpcon,DTPCON)
#define LAPACK_ctpcon   LAPACK_GLOBAL(ctpcon,CTPCON)
#define LAPACK_ztpcon   LAPACK_GLOBAL(ztpcon,ZTPCON)
#define LAPACK_stbcon   LAPACK_GLOBAL(stbcon,STBCON)
#define LAPACK_dtbcon   LAPACK_GLOBAL(dtbcon,DTBCON)
#define LAPACK_ctbcon   LAPACK_GLOBAL(ctbcon,CTBCON)
#define LAPACK_ztbcon   LAPACK_GLOBAL(ztbcon,ZTBCON)

Notice again: checon / zhecon and chpcon / zhpcon only exist for c and z. The Hermitian ones don't do s/d. That's not me being lazy, that's literally the header. 💀


🧚 Refinement: ?rfs & friends 🧚

And we close out this chunk with the rfs crew, plus one very special dgerfsx getting its own moment at the end:

#define LAPACK_sgerfs   LAPACK_GLOBAL(sgerfs,SGERFS)
#define LAPACK_dgerfs   LAPACK_GLOBAL(dgerfs,DGERFS)
#define LAPACK_cgerfs   LAPACK_GLOBAL(cgerfs,CGERFS)
#define LAPACK_zgerfs   LAPACK_GLOBAL(zgerfs,ZGERFS)
#define LAPACK_dgerfsx   LAPACK_GLOBAL(dgerfsx,DGERFSX)

Yes, this part really does just end on dgerfsx mid-thought. No wrap-up, no bow on top — the list keeps going in the next part. Stay with me bestie, we're literally so close to being done with the macros. 🌈

okay so this next stretch is a lot of #defines and I need you to not panic 💖 it's literally just the pattern repeating — lowercase C name on the left, LAPACK_GLOBAL wrapping that same name plus its ALL-CAPS Fortran twin on the right. Your girl is just gonna walk you through them in the exact order they appear, because that order matters and I'm not out here reorganizing someone's header file 💅

First little batch: the gerfsx crew, then the banded gbrfs squad, then the tridiagonal girlies. Notice the order goes s, z, c at the top — yes it's a little chaotic, no we're not fixing it 🌸

       #define LAPACK_sgerfsx   LAPACK_GLOBAL(sgerfsx,SGERFSX)
       #define LAPACK_zgerfsx   LAPACK_GLOBAL(zgerfsx,ZGERFSX)
       #define LAPACK_cgerfsx   LAPACK_GLOBAL(cgerfsx,CGERFSX)
       #define LAPACK_sgbrfs   LAPACK_GLOBAL(sgbrfs,SGBRFS)
       #define LAPACK_dgbrfs   LAPACK_GLOBAL(dgbrfs,DGBRFS)
       #define LAPACK_cgbrfs   LAPACK_GLOBAL(cgbrfs,CGBRFS)
       #define LAPACK_zgbrfs   LAPACK_GLOBAL(zgbrfs,ZGBRFS)
       #define LAPACK_dgbrfsx   LAPACK_GLOBAL(dgbrfsx,DGBRFSX)
       #define LAPACK_sgbrfsx   LAPACK_GLOBAL(sgbrfsx,SGBRFSX)
       #define LAPACK_zgbrfsx   LAPACK_GLOBAL(zgbrfsx,ZGBRFSX)
       #define LAPACK_cgbrfsx   LAPACK_GLOBAL(cgbrfsx,CGBRFSX)
       #define LAPACK_sgtrfs   LAPACK_GLOBAL(sgtrfs,SGTRFS)
       #define LAPACK_dgtrfs   LAPACK_GLOBAL(dgtrfs,DGTRFS)
       #define LAPACK_cgtrfs   LAPACK_GLOBAL(cgtrfs,CGTRFS)
       #define LAPACK_zgtrfs   LAPACK_GLOBAL(zgtrfs,ZGTRFS)

next up: positive-definite porfs, the packed pprfs besties, and the pbrfs crew that live down in band-storage land. also catch that dporfsx and sporfsx are flipped relative to the first line of their block — the header did that, not me, and I refuse to take the blame 🙈

       #define LAPACK_sporfs   LAPACK_GLOBAL(sporfs,SPORFS)
       #define LAPACK_dporfs   LAPACK_GLOBAL(dporfs,DPORFS)
       #define LAPACK_cporfs   LAPACK_GLOBAL(cporfs,CPORFS)
       #define LAPACK_zporfs   LAPACK_GLOBAL(zporfs,ZPORFS)
       #define LAPACK_dporfsx   LAPACK_GLOBAL(dporfsx,DPORFSX)
       #define LAPACK_sporfsx   LAPACK_GLOBAL(sporfsx,SPORFSX)
       #define LAPACK_zporfsx   LAPACK_GLOBAL(zporfsx,ZPORFSX)
       #define LAPACK_cporfsx   LAPACK_GLOBAL(cporfsx,CPORFSX)
       #define LAPACK_spprfs   LAPACK_GLOBAL(spprfs,SPPRFS)
       #define LAPACK_dpprfs   LAPACK_GLOBAL(dpprfs,DPPRFS)
       #define LAPACK_cpprfs   LAPACK_GLOBAL(cpprfs,CPPRFS)
       #define LAPACK_zpprfs   LAPACK_GLOBAL(zpprfs,ZPPRFS)
       #define LAPACK_spbrfs   LAPACK_GLOBAL(spbrfs,SPBRFS)
       #define LAPACK_dpbrfs   LAPACK_GLOBAL(dpbrfs,DPBRFS)
       #define LAPACK_cpbrfs   LAPACK_GLOBAL(cpbrfs,CPBRFS)
       #define LAPACK_zpbrfs   LAPACK_GLOBAL(zpbrfs,ZPBRFS)

then we got ptrfs (packed tridiagonal, she's niche but she's serving), the symmetric syrfs block with its syrfsx glow-up, and then — hold on — the Hermitian ones drop the s/d because Hermitian is inherently complex, so all you get is cherfs, zherfs, zherfsx, cherfsx and honestly? iconic of them 👑

       #define LAPACK_sptrfs   LAPACK_GLOBAL(sptrfs,SPTRFS)
       #define LAPACK_dptrfs   LAPACK_GLOBAL(dptrfs,DPTRFS)
       #define LAPACK_cptrfs   LAPACK_GLOBAL(cptrfs,CPTRFS)
       #define LAPACK_zptrfs   LAPACK_GLOBAL(zptrfs,ZPTRFS)
       #define LAPACK_ssyrfs   LAPACK_GLOBAL(ssyrfs,SSYRFS)
       #define LAPACK_dsyrfs   LAPACK_GLOBAL(dsyrfs,DSYRFS)
       #define LAPACK_csyrfs   LAPACK_GLOBAL(csyrfs,CSYRFS)
       #define LAPACK_zsyrfs   LAPACK_GLOBAL(zsyrfs,ZSYRFS)
       #define LAPACK_dsyrfsx   LAPACK_GLOBAL(dsyrfsx,DSYRFSX)
       #define LAPACK_ssyrfsx   LAPACK_GLOBAL(ssyrfsx,SSYRFSX)
       #define LAPACK_zsyrfsx   LAPACK_GLOBAL(zsyrfsx,ZSYRFSX)
       #define LAPACK_csyrfsx   LAPACK_GLOBAL(csyrfsx,CSYRFSX)
       #define LAPACK_cherfs   LAPACK_GLOBAL(cherfs,CHERFS)
       #define LAPACK_zherfs   LAPACK_GLOBAL(zherfs,ZHERFS)
       #define LAPACK_zherfsx   LAPACK_GLOBAL(zherfsx,ZHERFSX)
       #define LAPACK_cherfsx   LAPACK_GLOBAL(cherfsx,CHERFSX)
quick vibe check bestie: don't "tidy" any of these up. That flipped casing on the Fortran side (SSYRFS vs zsyrfsx,ZSYRFSX) is exactly what LAPACK_GLOBAL expects — copy it verbatim or the linker will simply not be your friend 💀

last chunk of the rfs saga: packed symmetric sprfs, packed Hermitian hprfs, triangular trrfs, packed triangular tprfs, and the triangular-band tbrfs four. Four precisions each, no drama, no notes 🎀

       #define LAPACK_ssprfs   LAPACK_GLOBAL(ssprfs,SSPRFS)
       #define LAPACK_dsprfs   LAPACK_GLOBAL(dsprfs,DSPRFS)
       #define LAPACK_csprfs   LAPACK_GLOBAL(csprfs,CSPRFS)
       #define LAPACK_zsprfs   LAPACK_GLOBAL(zsprfs,ZSPRFS)
       #define LAPACK_chprfs   LAPACK_GLOBAL(chprfs,CHPRFS)
       #define LAPACK_zhprfs   LAPACK_GLOBAL(zhprfs,ZHPRFS)
       #define LAPACK_strrfs   LAPACK_GLOBAL(strrfs,STRRFS)
       #define LAPACK_dtrrfs   LAPACK_GLOBAL(dtrrfs,DTRRFS)
       #define LAPACK_ctrrfs   LAPACK_GLOBAL(ctrrfs,CTRRFS)
       #define LAPACK_ztrrfs   LAPACK_GLOBAL(ztrrfs,ZTRRFS)
       #define LAPACK_stprfs   LAPACK_GLOBAL(stprfs,STPRFS)
       #define LAPACK_dtprfs   LAPACK_GLOBAL(dtprfs,DTPRFS)
       #define LAPACK_ctprfs   LAPACK_GLOBAL(ctprfs,CTPRFS)
       #define LAPACK_ztprfs   LAPACK_GLOBAL(ztprfs,ZTPRFS)
       #define LAPACK_stbrfs   LAPACK_GLOBAL(stbrfs,STBRFS)
       #define LAPACK_dtbrfs   LAPACK_GLOBAL(dtbrfs,DTBRFS)
       #define LAPACK_ctbrfs   LAPACK_GLOBAL(ctbrfs,CTBRFS)
       #define LAPACK_ztbrfs   LAPACK_GLOBAL(ztbrfs,ZTBRFS)

okay new theme, new era: inverses. getri is general, potri is positive definite, pftri is the same energy but packed in a triangular... wait no, packed in that "pf" storage, pptri is the packed version, sytri is symmetric, hetri is complex Hermitian only so it only ships in c and z (fr fr, look — no shetri, no dhetri 😭), then packed sptri, packed Hermitian hptri, and the triangular trtri with its tftri and tptri variants. Click your heels, invert your matrix 💅

       #define LAPACK_sgetri   LAPACK_GLOBAL(sgetri,SGETRI)
       #define LAPACK_dgetri   LAPACK_GLOBAL(dgetri,DGETRI)
       #define LAPACK_cgetri   LAPACK_GLOBAL(cgetri,CGETRI)
       #define LAPACK_zgetri   LAPACK_GLOBAL(zgetri,ZGETRI)
       #define LAPACK_spotri   LAPACK_GLOBAL(spotri,SPOTRI)
       #define LAPACK_dpotri   LAPACK_GLOBAL(dpotri,DPOTRI)
       #define LAPACK_cpotri   LAPACK_GLOBAL(cpotri,CPOTRI)
       #define LAPACK_zpotri   LAPACK_GLOBAL(zpotri,ZPOTRI)
       #define LAPACK_dpftri   LAPACK_GLOBAL(dpftri,DPFTRI)
       #define LAPACK_spftri   LAPACK_GLOBAL(spftri,SPFTRI)
       #define LAPACK_zpftri   LAPACK_GLOBAL(zpftri,ZPFTRI)
       #define LAPACK_cpftri   LAPACK_GLOBAL(cpftri,CPFTRI)
       #define LAPACK_spptri   LAPACK_GLOBAL(spptri,SPPTRI)
       #define LAPACK_dpptri   LAPACK_GLOBAL(dpptri,DPPTRI)
       #define LAPACK_cpptri   LAPACK_GLOBAL(cpptri,CPPTRI)
       #define LAPACK_zpptri   LAPACK_GLOBAL(zpptri,ZPPTRI)
       #define LAPACK_ssytri   LAPACK_GLOBAL(ssytri,SSYTRI)
       #define LAPACK_dsytri   LAPACK_GLOBAL(dsytri,DSYTRI)
       #define LAPACK_csytri   LAPACK_GLOBAL(csytri,CSYTRI)
       #define LAPACK_zsytri   LAPACK_GLOBAL(zsytri,ZSYTRI)
       #define LAPACK_chetri   LAPACK_GLOBAL(chetri,CHETRI)
       #define LAPACK_zhetri   LAPACK_GLOBAL(zhetri,ZHETRI)
       #define LAPACK_ssptri   LAPACK_GLOBAL(ssptri,SSPTRI)
       #define LAPACK_dsptri   LAPACK_GLOBAL(dsptri,DSPTRI)
       #define LAPACK_csptri   LAPACK_GLOBAL(csptri,CSPTRI)
       #define LAPACK_zsptri   LAPACK_GLOBAL(zsptri,ZSPTRI)
       #define LAPACK_chptri   LAPACK_GLOBAL(chptri,CHPTRI)
       #define LAPACK_zhptri   LAPACK_GLOBAL(zhptri,ZHPTRI)
       #define LAPACK_strtri   LAPACK_GLOBAL(strtri,STRTRI)
       #define LAPACK_dtrtri   LAPACK_GLOBAL(dtrtri,DTRTRI)
       #define LAPACK_ctrtri   LAPACK_GLOBAL(ctrtri,CTRTRI)
       #define LAPACK_ztrtri   LAPACK_GLOBAL(ztrtri,ZTRTRI)
       #define LAPACK_dtftri   LAPACK_GLOBAL(dtftri,DTFTRI)
       #define LAPACK_stftri   LAPACK_GLOBAL(stftri,STFTRI)
       #define LAPACK_ztftri   LAPACK_GLOBAL(ztftri,ZTFTRI)
       #define LAPACK_ctftri   LAPACK_GLOBAL(ctftri,CTFTRI)
       #define LAPACK_stptri   LAPACK_GLOBAL(stptri,STPTRI)
       #define LAPACK_dtptri   LAPACK_GLOBAL(dtptri,DTPTRI)
       #define LAPACK_ctptri   LAPACK_GLOBAL(ctptri,CTPTRI)
       #define LAPACK_ztptri   LAPACK_GLOBAL(ztptri,ZTPTRI)

and now, the equilibration girls 🌈 every one of these is about scaling your matrix so the numbers behave. It's giving "wash your face before you do your makeup" energy, and honestly? correct.

  • geequ / geequb — general matrices, plain and the b variant
  • gbequ / gbequb — banded
  • poequ / poequb — positive definite
  • ppequ — packed positive definite
  • pbequ — banded positive definite
  • syequb — symmetric, and it only exists in the b flavor
  • heequb — Hermitian, also b-only, and again c/z only because complex 💜
       #define LAPACK_sgeequ   LAPACK_GLOBAL(sgeequ,SGEEQU)
       #define LAPACK_dgeequ   LAPACK_GLOBAL(dgeequ,DGEEQU)
       #define LAPACK_cgeequ   LAPACK_GLOBAL(cgeequ,CGEEQU)
       #define LAPACK_zgeequ   LAPACK_GLOBAL(zgeequ,ZGEEQU)
       #define LAPACK_dgeequb   LAPACK_GLOBAL(dgeequb,DGEEQUB)
       #define LAPACK_sgeequb   LAPACK_GLOBAL(sgeequb,SGEEQUB)
       #define LAPACK_zgeequb   LAPACK_GLOBAL(zgeequb,ZGEEQUB)
       #define LAPACK_cgeequb   LAPACK_GLOBAL(cgeequb,CGEEQUB)
       #define LAPACK_sgbequ   LAPACK_GLOBAL(sgbequ,SGBEQU)
       #define LAPACK_dgbequ   LAPACK_GLOBAL(dgbequ,DGBEQU)
       #define LAPACK_cgbequ   LAPACK_GLOBAL(cgbequ,CGBEQU)
       #define LAPACK_zgbequ   LAPACK_GLOBAL(zgbequ,ZGBEQU)
       #define LAPACK_dgbequb   LAPACK_GLOBAL(dgbequb,DGBEQUB)
       #define LAPACK_sgbequb   LAPACK_GLOBAL(sgbequb,SGBEQUB)
       #define LAPACK_zgbequb   LAPACK_GLOBAL(zgbequb,ZGBEQUB)
       #define LAPACK_cgbequb   LAPACK_GLOBAL(cgbequb,CGBEQUB)
       #define LAPACK_spoequ   LAPACK_GLOBAL(spoequ,SPOEQU)
       #define LAPACK_dpoequ   LAPACK_GLOBAL(dpoequ,DPOEQU)
       #define LAPACK_cpoequ   LAPACK_GLOBAL(cpoequ,CPOEQU)
       #define LAPACK_zpoequ   LAPACK_GLOBAL(zpoequ,ZPOEQU)
       #define LAPACK_dpoequb   LAPACK_GLOBAL(dpoequb,DPOEQUB)
       #define LAPACK_spoequb   LAPACK_GLOBAL(spoequb,SPOEQUB)
       #define LAPACK_zpoequb   LAPACK_GLOBAL(zpoequb,ZPOEQUB)
       #define LAPACK_cpoequb   LAPACK_GLOBAL(cpoequb,CPOEQUB)
       #define LAPACK_sppequ   LAPACK_GLOBAL(sppequ,SPPEQU)
       #define LAPACK_dppequ   LAPACK_GLOBAL(dppequ,DPPEQU)
       #define LAPACK_cppequ   LAPACK_GLOBAL(cppequ,CPPEQU)
       #define LAPACK_zppequ   LAPACK_GLOBAL(zppequ,ZPPEQU)
       #define LAPACK_spbequ   LAPACK_GLOBAL(spbequ,SPBEQU)
       #define LAPACK_dpbequ   LAPACK_GLOBAL(dpbequ,DPBEQU)
       #define LAPACK_cpbequ   LAPACK_GLOBAL(cpbequ,CPBEQU)
       #define LAPACK_zpbequ   LAPACK_GLOBAL(zpbequ,ZPBEQU)
       #define LAPACK_dsyequb   LAPACK_GLOBAL(dsyequb,DSYEQUB)
       #define LAPACK_ssyequb   LAPACK_GLOBAL(ssyequb,SSYEQUB)
       #define LAPACK_zsyequb   LAPACK_GLOBAL(zsyequb,ZSYEQUB)
       #define LAPACK_csyequb   LAPACK_GLOBAL(csyequb,CSYEQUB)
       #define LAPACK_zheequb   LAPACK_GLOBAL(zheequb,ZHEEQUB)
       #define LAPACK_cheequb   LAPACK_GLOBAL(cheequb,CHEEQUB)

solvers. this is the main character section, truly 🔥 gesv is your general "solve this for me" and she comes in s, d, c, z — plus dsgesv and zcgesv, which are the mixed-precision extra-credit versions (only two of them, that's the whole family, don't go looking for more).

Then gesvx (the x glow-up) for all four precisions, then gesvxx for all four but listed d, s, z, c because we stay chaotic 🫶

       #define LAPACK_sgesv   LAPACK_GLOBAL(sgesv,SGESV)
       #define LAPACK_dgesv   LAPACK_GLOBAL(dgesv,DGESV)
       #define LAPACK_cgesv   LAPACK_GLOBAL(cgesv,CGESV)
       #define LAPACK_zgesv   LAPACK_GLOBAL(zgesv,ZGESV)
       #define LAPACK_dsgesv   LAPACK_GLOBAL(dsgesv,DSGESV)
       #define LAPACK_zcgesv   LAPACK_GLOBAL(zcgesv,ZCGESV)
       #define LAPACK_sgesvx   LAPACK_GLOBAL(sgesvx,SGESVX)
       #define LAPACK_dgesvx   LAPACK_GLOBAL(dgesvx,DGESVX)
       #define LAPACK_cgesvx   LAPACK_GLOBAL(cgesvx,CGESVX)
       #define LAPACK_zgesvx   LAPACK_GLOBAL(zgesvx,ZGESVX)
       #define LAPACK_dgesvxx   LAPACK_GLOBAL(dgesvxx,DGESVXX)
       #define LAPACK_sgesvxx   LAPACK_GLOBAL(sgesvxx,SGESVXX)
       #define LAPACK_zgesvxx   LAPACK_GLOBAL(zgesvxx,ZGESVXX)
       #define LAPACK_cgesvxx   LAPACK_GLOBAL(cgesvxx,CGESVXX)

banded solvers next — gbsv, gbsvx, gbsvxx, four precisions each, same structure as the general ones, just narrower. then the tridiagonal girlies gtsv / gtsvx, also four apiece. yes bestie, the pattern is the pattern, and the pattern is eating every time 💅

       #define LAPACK_sgbsv   LAPACK_GLOBAL(sgbsv,SGBSV)
       #define LAPACK_dgbsv   LAPACK_GLOBAL(dgbsv,DGBSV)
       #define LAPACK_cgbsv   LAPACK_GLOBAL(cgbsv,CGBSV)
       #define LAPACK_zgbsv   LAPACK_GLOBAL(zgbsv,ZGBSV)
       #define LAPACK_sgbsvx   LAPACK_GLOBAL(sgbsvx,SGBSVX)
       #define LAPACK_dgbsvx   LAPACK_GLOBAL(dgbsvx,DGBSVX)
       #define LAPACK_cgbsvx   LAPACK_GLOBAL(cgbsvx,CGBSVX)
       #define LAPACK_zgbsvx   LAPACK_GLOBAL(zgbsvx,ZGBSVX)
       #define LAPACK_dgbsvxx   LAPACK_GLOBAL(dgbsvxx,DGBSVXX)
       #define LAPACK_sgbsvxx   LAPACK_GLOBAL(sgbsvxx,SGBSVXX)
       #define LAPACK_zgbsvxx   LAPACK_GLOBAL(zgbsvxx,ZGBSVXX)
       #define LAPACK_cgbsvxx   LAPACK_GLOBAL(cgbsvxx,CGBSVXX)
       #define LAPACK_sgtsv   LAPACK_GLOBAL(sgtsv,SGTSV)
       #define LAPACK_dgtsv   LAPACK_GLOBAL(dgtsv,DGTSV)
       #define LAPACK_cgtsv   LAPACK_GLOBAL(cgtsv,CGTSV)
       #define LAPACK_zgtsv   LAPACK_GLOBAL(zgtsv,ZGTSV)
       #define LAPACK_sgtsvx   LAPACK_GLOBAL(sgtsvx,SGTSVX)
       #define LAPACK_dgtsvx   LAPACK_GLOBAL(dgtsvx,DGTSVX)
       #define LAPACK_cgtsvx   LAPACK_GLOBAL(cgtsvx,CGTSVX)
       #define LAPACK_zgtsvx   LAPACK_GLOBAL(zgtsvx,ZGTSVX)

and the positive-definite solvers to close out this batch: posv ×4, the mixed-precision dsposv and zcposv (again, just those two 🍓), posvx ×4, posvxx ×4, packed ppsv ×4, and the packed expert ppsvx ×4 — which is exactly where this part runs out of road, mid-family, so don't you dare think we're done 😭

       #define LAPACK_sposv   LAPACK_GLOBAL(sposv,SPOSV)
       #define LAPACK_dposv   LAPACK_GLOBAL(dposv,DPOSV)
       #define LAPACK_cposv   LAPACK_GLOBAL(cposv,CPOSV)
       #define LAPACK_zposv   LAPACK_GLOBAL(zposv,ZPOSV)
       #define LAPACK_dsposv   LAPACK_GLOBAL(dsposv,DSPOSV)
       #define LAPACK_zcposv   LAPACK_GLOBAL(zcposv,ZCPOSV)
       #define LAPACK_sposvx   LAPACK_GLOBAL(sposvx,SPOSVX)
       #define LAPACK_dposvx   LAPACK_GLOBAL(dposvx,DPOSVX)
       #define LAPACK_cposvx   LAPACK_GLOBAL(cposvx,CPOSVX)
       #define LAPACK_zposvx   LAPACK_GLOBAL(zposvx,ZPOSVX)
       #define LAPACK_dposvxx   LAPACK_GLOBAL(dposvxx,DPOSVXX)
       #define LAPACK_sposvxx   LAPACK_GLOBAL(sposvxx,SPOSVXX)
       #define LAPACK_zposvxx   LAPACK_GLOBAL(zposvxx,ZPOSVXX)
       #define LAPACK_cposvxx   LAPACK_GLOBAL(cposvxx,CPOSVXX)
       #define LAPACK_sppsv   LAPACK_GLOBAL(sppsv,SPPSV)
       #define LAPACK_dppsv   LAPACK_GLOBAL(dppsv,DPPSV)
       #define LAPACK_cppsv   LAPACK_GLOBAL(cppsv,CPPSV)
       #define LAPACK_zppsv   LAPACK_GLOBAL(zppsv,ZPPSV)
       #define LAPACK_sppsvx   LAPACK_GLOBAL(sppsvx,SPPSVX)
       #define LAPACK_dppsvx   LAPACK_GLOBAL(dppsvx,DPPSVX)
       #define LAPACK_cppsvx   LAPACK_GLOBAL(cppsvx,CPPSVX)
#define LAPACK_zppsvx   LAPACK_GLOBAL(zppsvx,ZPPSVX)
#define LAPACK_spbsv   LAPACK_GLOBAL(spbsv,SPBSV)
#define LAPACK_dpbsv   LAPACK_GLOBAL(dpbsv,DPBSV)
#define LAPACK_cpbsv   LAPACK_GLOBAL(cpbsv,CPBSV)
#define LAPACK_zpbsv   LAPACK_GLOBAL(zpbsv,ZPBSV)
#define LAPACK_spbsvx   LAPACK_GLOBAL(spbsvx,SPBSVX)
#define LAPACK_dpbsvx   LAPACK_GLOBAL(dpbsvx,DPBSVX)
#define LAPACK_cpbsvx   LAPACK_GLOBAL(cpbsvx,CPBSVX)
#define LAPACK_zpbsvx   LAPACK_GLOBAL(zpbsvx,ZPBSVX)
#define LAPACK_sptsv   LAPACK_GLOBAL(sptsv,SPTSV)
#define LAPACK_dptsv   LAPACK_GLOBAL(dptsv,DPTSV)
#define LAPACK_cptsv   LAPACK_GLOBAL(cptsv,CPTSV)
#define LAPACK_zptsv   LAPACK_GLOBAL(zptsv,ZPTSV)
#define LAPACK_sptsvx   LAPACK_GLOBAL(sptsvx,SPTSVX)
#define LAPACK_dptsvx   LAPACK_GLOBAL(dptsvx,DPTSVX)
#define LAPACK_cptsvx   LAPACK_GLOBAL(cptsvx,CPTSVX)
#define LAPACK_zptsvx   LAPACK_GLOBAL(zptsvx,ZPTSVX)

okay so that little run right there is the "my matrix is special-shaped and I still wanna solve it" clique 💅 — positive-definite packed (p?svx), symmetric/hermitian banded (pbsv, pbsvx), and good old tridiagonal (ptsv, ptsvx). Notice the pattern bestie: s, d, c, z — single, double, complex, complex-double. That's the whole personality of this header, no cap. every LAPACK routine comes in that exact four-flavour flight ✨

#define LAPACK_ssysv   LAPACK_GLOBAL(ssysv,SSYSV)
#define LAPACK_dsysv   LAPACK_GLOBAL(dsysv,DSYSV)
#define LAPACK_csysv   LAPACK_GLOBAL(csysv,CSYSV)
#define LAPACK_zsysv   LAPACK_GLOBAL(zsysv,ZSYSV)
#define LAPACK_ssysvx   LAPACK_GLOBAL(ssysvx,SSYSVX)
#define LAPACK_dsysvx   LAPACK_GLOBAL(dsysvx,DSYSVX)
#define LAPACK_csysvx   LAPACK_GLOBAL(csysvx,CSYSVX)
#define LAPACK_zsysvx   LAPACK_GLOBAL(zsysvx,ZSYSVX)
#define LAPACK_dsysvxx   LAPACK_GLOBAL(dsysvxx,DSYSVXX)
#define LAPACK_ssysvxx   LAPACK_GLOBAL(ssysvxx,SSYSVXX)
#define LAPACK_zsysvxx   LAPACK_GLOBAL(zsysvxx,ZSYSVXX)
#define LAPACK_csysvxx   LAPACK_GLOBAL(csysvxx,CSYSVXX)
#define LAPACK_chesv   LAPACK_GLOBAL(chesv,CHESV)
#define LAPACK_zhesv   LAPACK_GLOBAL(zhesv,ZHESV)
#define LAPACK_chesvx   LAPACK_GLOBAL(chesvx,CHESVX)
#define LAPACK_zhesvx   LAPACK_GLOBAL(zhesvx,ZHESVX)
#define LAPACK_zhesvxx   LAPACK_GLOBAL(zhesvxx,ZHESVXX)
#define LAPACK_chesvxx   LAPACK_GLOBAL(chesvxx,CHESVXX)

bestie look closely 👀 the xx ones are extra — dsysvxx, ssysvxx, zsysvxx, csysvxx, plus zhesvxx / chesvxx. Also clock that these are not in strict s/d/c/z order in the source — dsysvxx comes before ssysvxx, and zhesvxx before chesvxx. Do not reorder them, that's just how they're written and we respect the original 🫶

#define LAPACK_sspsv   LAPACK_GLOBAL(sspsv,SSPSV)
#define LAPACK_dspsv   LAPACK_GLOBAL(dspsv,DSPSV)
#define LAPACK_cspsv   LAPACK_GLOBAL(cspsv,CSPSV)
#define LAPACK_zspsv   LAPACK_GLOBAL(zspsv,ZSPSV)
#define LAPACK_sspsvx   LAPACK_GLOBAL(sspsvx,SSPSVX)
#define LAPACK_dspsvx   LAPACK_GLOBAL(dspsvx,DSPSVX)
#define LAPACK_cspsvx   LAPACK_GLOBAL(cspsvx,CSPSVX)
#define LAPACK_zspsvx   LAPACK_GLOBAL(zspsvx,ZSPSVX)
#define LAPACK_chpsv   LAPACK_GLOBAL(chpsv,CHPSV)
#define LAPACK_zhpsv   LAPACK_GLOBAL(zhpsv,ZHPSV)
#define LAPACK_chpsvx   LAPACK_GLOBAL(chpsvx,CHPSVX)
#define LAPACK_zhpsvx   LAPACK_GLOBAL(zhpsvx,ZHPSVX)

Packed symmetric (spsv, spsvx) and packed hermitian (hpsv, hpsvx) — the "I saved memory and now my indices look like a riddle" squad 🎀


🌀 still SYNOPSIS (we're in our QR era)

#define LAPACK_sgeqrf   LAPACK_GLOBAL(sgeqrf,SGEQRF)
#define LAPACK_dgeqrf   LAPACK_GLOBAL(dgeqrf,DGEQRF)
#define LAPACK_cgeqrf   LAPACK_GLOBAL(cgeqrf,CGEQRF)
#define LAPACK_zgeqrf   LAPACK_GLOBAL(zgeqrf,ZGEQRF)
#define LAPACK_sgeqpf   LAPACK_GLOBAL(sgeqpf,SGEQPF)
#define LAPACK_dgeqpf   LAPACK_GLOBAL(dgeqpf,DGEQPF)
#define LAPACK_cgeqpf   LAPACK_GLOBAL(cgeqpf,CGEQPF)
#define LAPACK_zgeqpf   LAPACK_GLOBAL(zgeqpf,ZGEQPF)
#define LAPACK_sgeqp3   LAPACK_GLOBAL(sgeqp3,SGEQP3)
#define LAPACK_dgeqp3   LAPACK_GLOBAL(dgeqp3,DGEQP3)
#define LAPACK_cgeqp3   LAPACK_GLOBAL(cgeqp3,CGEQP3)
#define LAPACK_zgeqp3   LAPACK_GLOBAL(zgeqp3,ZGEQP3)
#define LAPACK_sorgqr   LAPACK_GLOBAL(sorgqr,SORGQR)
#define LAPACK_dorgqr   LAPACK_GLOBAL(dorgqr,DORGQR)
#define LAPACK_sormqr   LAPACK_GLOBAL(sormqr,SORMQR)
#define LAPACK_dormqr   LAPACK_GLOBAL(dormqr,DORMQR)
#define LAPACK_cungqr   LAPACK_GLOBAL(cungqr,CUNGQR)
#define LAPACK_zungqr   LAPACK_GLOBAL(zungqr,ZUNGQR)
#define LAPACK_cunmqr   LAPACK_GLOBAL(cunmqr,CUNMQR)
#define LAPACK_zunmqr   LAPACK_GLOBAL(zunmqr,ZUNMQR)

the QR block!! 🔥 geqrf (plain QR), geqpf (QR with column pivoting), geqp3 (QR with column pivoting, the newer one). Then the "gimme the Q" crowd: orgqr / ungqr (generate Q), ormqr / unmqr (multiply by Q). Note the naming tea ☕ — real routines get org, complex ones get ung, and multiply variants get orm / unm. iykyk 💅

#define LAPACK_sgelqf   LAPACK_GLOBAL(sgelqf,SGELQF)
#define LAPACK_dgelqf   LAPACK_GLOBAL(dgelqf,DGELQF)
#define LAPACK_cgelqf   LAPACK_GLOBAL(cgelqf,CGELQF)
#define LAPACK_zgelqf   LAPACK_GLOBAL(zgelqf,ZGELQF)
#define LAPACK_sorglq   LAPACK_GLOBAL(sorglq,SORGLQ)
#define LAPACK_dorglq   LAPACK_GLOBAL(dorglq,DORGLQ)
#define LAPACK_sormlq   LAPACK_GLOBAL(sormlq,SORMLQ)
#define LAPACK_dormlq   LAPACK_GLOBAL(dormlq,DORMLQ)
#define LAPACK_cunglq   LAPACK_GLOBAL(cunglq,CUNGLQ)
#define LAPACK_zunglq   LAPACK_GLOBAL(zunglq,ZUNGLQ)
#define LAPACK_cunmlq   LAPACK_GLOBAL(cunmlq,CUNMLQ)
#define LAPACK_zunmlq   LAPACK_GLOBAL(zunmlq,ZUNMLQ)

That's LQ — same energy, different factor order 🌸 lq instead of qr, and yeah, ormlq/unmlq are the multiply ones. the consistency is honestly iconic

#define LAPACK_sgeqlf   LAPACK_GLOBAL(sgeqlf,SGEQLF)
#define LAPACK_dgeqlf   LAPACK_GLOBAL(dgeqlf,DGEQLF)
#define LAPACK_cgeqlf   LAPACK_GLOBAL(cgeqlf,CGEQLF)
#define LAPACK_zgeqlf   LAPACK_GLOBAL(zgeqlf,ZGEQLF)
#define LAPACK_sorgql   LAPACK_GLOBAL(sorgql,SORGQL)
#define LAPACK_dorgql   LAPACK_GLOBAL(dorgql,DORGQL)
#define LAPACK_cungql   LAPACK_GLOBAL(cungql,CUNGQL)
#define LAPACK_zungql   LAPACK_GLOBAL(zungql,ZUNGQL)
#define LAPACK_sormql   LAPACK_GLOBAL(sormql,SORMQL)
#define LAPACK_dormql   LAPACK_GLOBAL(dormql,DORMQL)
#define LAPACK_cunmql   LAPACK_GLOBAL(cunmql,CUNMQL)
#define LAPACK_zunmql   LAPACK_GLOBAL(zunmql,ZUNMQL)

QL gang 🦋 — and yes, orgql comes in real-only flavours here, ungql for complex, ormql / unmql for the multiply versions. exactly what you'd expect, and yet somehow still satisfying

#define LAPACK_sgerqf   LAPACK_GLOBAL(sgerqf,SGERQF)
#define LAPACK_dgerqf   LAPACK_GLOBAL(dgerqf,DGERQF)
#define LAPACK_cgerqf   LAPACK_GLOBAL(cgerqf,CGERQF)
#define LAPACK_zgerqf   LAPACK_GLOBAL(zgerqf,ZGERQF)
#define LAPACK_sorgrq   LAPACK_GLOBAL(sorgrq,SORGRQ)
#define LAPACK_dorgrq   LAPACK_GLOBAL(dorgrq,DORGRQ)
#define LAPACK_cungrq   LAPACK_GLOBAL(cungrq,CUNGRQ)
#define LAPACK_zungrq   LAPACK_GLOBAL(zungrq,ZUNGRQ)
#define LAPACK_sormrq   LAPACK_GLOBAL(sormrq,SORMRQ)
#define LAPACK_dormrq   LAPACK_GLOBAL(dormrq,DORMQR)
#define LAPACK_cunmrq   LAPACK_GLOBAL(cunmrq,CUNMRQ)
#define LAPACK_zunmrq   LAPACK_GLOBAL(zunmrq,ZUNMRQ)

RQ rounding out the four factorisations 🍓 wait, hold up — peep LAPACK_dormrq on line... it maps to LAPACK_GLOBAL(dormrq,DORMQR). The second argument is DORMQR, not DORMRQ. That's literally what's written in the page, so that's what you get. Not me trying to "fix" it 🙈 — we reproduce, we don't edit. 👑

#define LAPACK_stzrzf   LAPACK_GLOBAL(stzrzf,STZRZF)
#define LAPACK_dtzrzf   LAPACK_GLOBAL(dtzrzf,DTZRZF)
#define LAPACK_ctzrzf   LAPACK_GLOBAL(ctzrzf,CTZRZF)
#define LAPACK_ztzrzf   LAPACK_GLOBAL(ztzrzf,ZTZRZF)
#define LAPACK_sormrz   LAPACK_GLOBAL(sormrz,SORMRZ)
#define LAPACK_dormrz   LAPACK_GLOBAL(dormrz,DORMRZ)
#define LAPACK_cunmrz   LAPACK_GLOBAL(cunmrz,CUNMRZ)
#define LAPACK_zunmrz   LAPACK_GLOBAL(zunmrz,ZUNMRZ)

Trapezoidal, bestie 🎀 tzrzf + ormrz/unmrz to actually use those reflectors. Fancy.

#define LAPACK_sggqrf   LAPACK_GLOBAL(sggqrf,SGGQRF)
#define LAPACK_dggqrf   LAPACK_GLOBAL(dggqrf,DGGQRF)
#define LAPACK_cggqrf   LAPACK_GLOBAL(cggqrf,CGGQRF)
#define LAPACK_zggqrf   LAPACK_GLOBAL(zggqrf,ZGGQRF)
#define LAPACK_sggrqf   LAPACK_GLOBAL(sggrqf,SGGRQF)
#define LAPACK_dggrqf   LAPACK_GLOBAL(dggrqf,DGGRQF)
#define LAPACK_cggrqf   LAPACK_GLOBAL(cggrqf,CGGRQF)
#define LAPACK_zggrqf   LAPACK_GLOBAL(zggrqf,ZGGRQF)

The generalised QR pair 🌈 ggqrf and ggrqf — two matrices, two factorisations, one call. main character energy fr fr ✨


💜 SYNOPSIS: bidiagonal arc

#define LAPACK_sgebrd   LAPACK_GLOBAL(sgebrd,SGEBRD)
#define LAPACK_dgebrd   LAPACK_GLOBAL(dgebrd,DGEBRD)
#define LAPACK_cgebrd   LAPACK_GLOBAL(cgebrd,CGEBRD)
#define LAPACK_zgebrd   LAPACK_GLOBAL(zgebrd,ZGEBRD)
#define LAPACK_sgbbrd   LAPACK_GLOBAL(sgbbrd,SGBBRD)
#define LAPACK_dgbbrd   LAPACK_GLOBAL(dgbbrd,DGBBRD)
#define LAPACK_cgbbrd   LAPACK_GLOBAL(cgbbrd,CGBBRD)
#define LAPACK_zgbbrd   LAPACK_GLOBAL(zgbbrd,ZGBBRD)
#define LAPACK_sorgbr   LAPACK_GLOBAL(sorgbr,SORGBR)
#define LAPACK_dorgbr   LAPACK_GLOBAL(dorgbr,DORGBR)
#define LAPACK_sormbr   LAPACK_GLOBAL(sormbr,SORMBR)
#define LAPACK_dormbr   LAPACK_GLOBAL(dormbr,DORMBR)
#define LAPACK_cungbr   LAPACK_GLOBAL(cungbr,CUNGBR)
#define LAPACK_zungbr   LAPACK_GLOBAL(zungbr,ZUNGBR)
#define LAPACK_cunmbr   LAPACK_GLOBAL(cunmbr,CUNMBR)
#define LAPACK_zunmbr   LAPACK_GLOBAL(zunmbr,ZUNMBR)

gebrd → bidiagonalise a general matrix. gbbrd → same, but for band matrices (extra ✨spice✨). Then orgbr/ungbr generate the bidiagonal's Q or P, and ormbr/unmbr apply them. the naming is giving "you already know" 💅

#define LAPACK_sbdsqr   LAPACK_GLOBAL(sbdsqr,SBDSQR)
#define LAPACK_dbdsqr   LAPACK_GLOBAL(dbdsqr,DBDSQR)
#define LAPACK_cbdsqr   LAPACK_GLOBAL(cbdsqr,CBDSQR)
#define LAPACK_zbdsqr   LAPACK_GLOBAL(zbdsqr,ZBDSQR)
#define LAPACK_sbdsdc   LAPACK_GLOBAL(sbdsdc,SBDSDC)
#define LAPACK_dbdsdc   LAPACK_GLOBAL(dbdsdc,DBDSDC)
#define LAPACK_sbdsvdx   LAPACK_GLOBAL(sbdsvdx,SBDSVDX)
#define LAPACK_dbdsvdx   LAPACK_GLOBAL(dbdsvdx,DBDSVDX)

SVD trio alert 🚨 bdsqr (bidiagonal SVD), bdsdc (divide-and-conquer), bdsvdx. And clock it — bdsdc and bdsvdx only exist in s and d. No c/z versions here. That's not me skipping them, that's just the list 🫶


🌸 SYNOPSIS: tridiagonal reduction & friends

#define LAPACK_ssytrd   LAPACK_GLOBAL(ssytrd,SSYTRD)
#define LAPACK_dsytrd   LAPACK_GLOBAL(dsytrd,DSYTRD)
#define LAPACK_sorgtr   LAPACK_GLOBAL(sorgtr,SORGTR)
#define LAPACK_dorgtr   LAPACK_GLOBAL(dorgtr,DORGTR)
#define LAPACK_sormtr   LAPACK_GLOBAL(sormtr,SORMTR)
#define LAPACK_dormtr   LAPACK_GLOBAL(dormtr,DORMTR)
#define LAPACK_chetrd   LAPACK_GLOBAL(chetrd,CHETRD)
#define LAPACK_zhetrd   LAPACK_GLOBAL(zhetrd,ZHETRD)
#define LAPACK_cungtr   LAPACK_GLOBAL(cungtr,CUNGTR)
#define LAPACK_zungtr   LAPACK_GLOBAL(zungtr,ZUNGTR)
#define LAPACK_cunmtr   LAPACK_GLOBAL(cunmtr,CUNMTR)
#define LAPACK_zunmtr   LAPACK_GLOBAL(zunmtr,ZUNMTR)

Symmetric → tridiagonal (sytrd) and hermitian → tridiagonal (hetrd), plus the orgtr/ungtr/ormtr/unmtr crew to build and apply the transformation 💖

#define LAPACK_ssptrd   LAPACK_GLOBAL(ssptrd,SSPTRD)
#define LAPACK_dsptrd   LAPACK_GLOBAL(dsptrd,DSPTRD)
#define LAPACK_sopgtr   LAPACK_GLOBAL(sopgtr,SOPGTR)
#define LAPACK_dopgtr   LAPACK_GLOBAL(dopgtr,DOPGTR)
#define LAPACK_sopmtr   LAPACK_GLOBAL(sopmtr,SOPMTR)
#define LAPACK_dopmtr   LAPACK_GLOBAL(dopmtr,DOPMTR)
#define LAPACK_chptrd   LAPACK_GLOBAL(chptrd,CHPTRD)
#define LAPACK_zhptrd   LAPACK_GLOBAL(zhptrd,ZHPTRD)
#define LAPACK_cupgtr   LAPACK_GLOBAL(cupgtr,CUPGTR)
#define LAPACK_zupgtr   LAPACK_GLOBAL(zupgtr,ZUPGTR)
#define LAPACK_cupmtr   LAPACK_GLOBAL(cupmtr,CUPMTR)
#define LAPACK_zupmtr   LAPACK_GLOBAL(zupmtr,ZUPMTR)

Packed versions of the same story 🎀 sptrd/hptrd reduce, opgtr/upgtr generate, opmtr/upmtr multiply. packed storage is lowkey unhinged but we love her 💀

#define LAPACK_ssbtrd   LAPACK_GLOBAL(ssbtrd,SSBTRD)
#define LAPACK_dsbtrd   LAPACK_GLOBAL(dsbtrd,DSBTRD)
#define LAPACK_chbtrd   LAPACK_GLOBAL(chbtrd,CHBTRD)
#define LAPACK_zhbtrd   LAPACK_GLOBAL(zhbtrd,ZHBTRD)

Banded → tridiagonal, symmetric (sbtrd) and hermitian (hbtrd). Four flavours, no org/ung companions listed. Simple, clean, slay 🌈


👑 SYNOPSIS: the eigenvalue finale

#define LAPACK_ssterf   LAPACK_GLOBAL(ssterf,SSTERF)
#define LAPACK_dsterf   LAPACK_GLOBAL(dsterf,DSTERF)
#define LAPACK_ssteqr   LAPACK_GLOBAL(ssteqr,SSTEQR)
#define LAPACK_dsteqr   LAPACK_GLOBAL(dsteqr,DSTEQR)
#define LAPACK_csteqr   LAPACK_GLOBAL(csteqr,CSTEQR)
#define LAPACK_zsteqr   LAPACK_GLOBAL(zsteqr,ZSTEQR)
#define LAPACK_sstemr   LAPACK_GLOBAL(sstemr,SSTEMR)
#define LAPACK_dstemr   LAPACK_GLOBAL(dstemr,DSTEMR)
#define LAPACK_cstemr   LAPACK_GLOBAL(cstemr,CSTEMR)
#define LAPACK_zstemr   LAPACK_GLOBAL(zstemr,ZSTEMR)
#define LAPACK_sstedc   LAPACK_GLOBAL(sstedc,SSTEDC)
#define LAPACK_dstedc   LAPACK_GLOBAL(dstedc,DSTEDC)
#define LAPACK_cstedc   LAPACK_GLOBAL(cstedc,CSTEDC)
#define LAPACK_zstedc   LAPACK_GLOBAL(zstedc,ZSTEDC)
#define LAPACK_sstegr   LAPACK_GLOBAL(sstegr,SSTEGR)
#define LAPACK_dstegr   LAPACK_GLOBAL(dstegr,DSTEGR)
#define LAPACK_cstegr   LAPACK_GLOBAL(cstegr,CSTEGR)
#define LAPACK_zstegr   LAPACK_GLOBAL(zstegr,ZSTEGR)
#define LAPACK_spteqr   LAPACK_GLOBAL(spteqr,SPTEQR)
#define LAPACK_dpteqr   LAPACK_GLOBAL(dpteqr,DPTEQR)
#define LAPACK_cpteqr   LAPACK_GLOBAL(cpteqr,CPTEQR)
#define LAPACK_zpteqr   LAPACK_GLOBAL(zpteqr,ZPTEQR)

Bestie this is the block 🔥 sterf (tridiagonal eigenvalues, QR-ish), steqr (tridiagonal eigen, QR), stemr (tridiagonal eigen via MRRR — palindrome name, obsessed), stedc (divide & conquer), stegr (MRRR), pteqr (positive-definite tridiagonal eigen).

hot tip that is literally in the list: sterf is s and d only. No complex. Everyone else gets all four. 💅

#define LAPACK_sstebz   LAPACK_GLOBAL(sstebz,SSTEBZ)
#define LAPACK_dstebz   LAPACK_GLOBAL(dstebz,DSTEBZ)
#define LAPACK_sstein   LAPACK_GLOBAL(sstein,SSTEIN)
#define LAPACK_dstein   LAPACK_GLOBAL(dstein,DSTEIN)
#define LAPACK_cstein   LAPACK_GLOBAL(cstein,CSTEIN)
#define LAPACK_zstein   LAPACK_GLOBAL(zstein,ZSTEIN)
#define LAPACK_sdisna   LAPACK_GLOBAL(sdisna,SDISNA)

stebz (eigenvalues in a selected range — real only, s and d), stein (eigenvectors for those, all four flavours), and disna (compute the reciprocal condition numbers of the eigenvectors — real only, s and d). and that's the last line of the block, so...


and that's where this part wraps, bestie 🫶 more #defines are literally right behind this one, so don't you dare close the tab 😭

...and the macro wall keeps going, bestie. Around 190 more #defines in this stretch alone, and every single one is LAPACK_ + the routine name + LAPACK_GLOBAL(name,NAME). That's the whole pattern, no cap 💅

First up: the generalized symmetric-definite crew — gst and pbstf girlies, all four flavours (s, d, c, z) showing up like clockwork:

#define LAPACK_ddisna   LAPACK_GLOBAL(ddisna,DDISNA)
#define LAPACK_ssygst   LAPACK_GLOBAL(ssygst,SSYGST)
#define LAPACK_dsygst   LAPACK_GLOBAL(dsygst,DSYGST)
#define LAPACK_chegst   LAPACK_GLOBAL(chegst,CHEGST)
#define LAPACK_zhegst   LAPACK_GLOBAL(zhegst,ZHEGST)
#define LAPACK_sspgst   LAPACK_GLOBAL(sspgst,SSPGST)
#define LAPACK_dspgst   LAPACK_GLOBAL(dspgst,DSPGST)
#define LAPACK_chpgst   LAPACK_GLOBAL(chpgst,CHPGST)
#define LAPACK_zhpgst   LAPACK_GLOBAL(zhpgst,ZHPGST)
#define LAPACK_ssbgst   LAPACK_GLOBAL(ssbgst,SSBGST)
#define LAPACK_dsbgst   LAPACK_GLOBAL(dsbgst,DSBGST)
#define LAPACK_chbgst   LAPACK_GLOBAL(chbgst,CHBGST)
#define LAPACK_zhbgst   LAPACK_GLOBAL(zhbgst,ZHBGST)
#define LAPACK_spbstf   LAPACK_GLOBAL(spbstf,SPBSTF)
#define LAPACK_dpbstf   LAPACK_GLOBAL(dpbstf,DPBSTF)
#define LAPACK_cpbstf   LAPACK_GLOBAL(cpbstf,CPBSTF)
#define LAPACK_zpbstf   LAPACK_GLOBAL(zpbstf,ZPBSTF)

Then the Hessenberg household 🏠✨ — gehrd for the reduction and the orghr/ormhr/unghr/unmhr gang for building and applying Q:

#define LAPACK_sgehrd   LAPACK_GLOBAL(sgehrd,SGEHRD)
#define LAPACK_dgehrd   LAPACK_GLOBAL(dgehrd,DGEHRD)
#define LAPACK_cgehrd   LAPACK_GLOBAL(cgehrd,CGEHRD)
#define LAPACK_zgehrd   LAPACK_GLOBAL(zgehrd,ZGEHRD)
#define LAPACK_sorghr   LAPACK_GLOBAL(sorghr,SORGHR)
#define LAPACK_dorghr   LAPACK_GLOBAL(dorghr,DORGHR)
#define LAPACK_sormhr   LAPACK_GLOBAL(sormhr,SORMHR)
#define LAPACK_dormhr   LAPACK_GLOBAL(dormhr,DORMHR)
#define LAPACK_cunghr   LAPACK_GLOBAL(cunghr,CUNGHR)
#define LAPACK_zunghr   LAPACK_GLOBAL(zunghr,ZUNGHR)
#define LAPACK_cunmhr   LAPACK_GLOBAL(cunmhr,CUNMHR)
#define LAPACK_zunmhr   LAPACK_GLOBAL(zunmhr,ZUNMHR)

Balancing + back-transforming, entering the chat 🎀 (gebal/gebak, every flavour, no gatekeeping):

#define LAPACK_sgebal   LAPACK_GLOBAL(sgebal,SGEBAL)
#define LAPACK_dgebal   LAPACK_GLOBAL(dgebal,DGEBAL)
#define LAPACK_cgebal   LAPACK_GLOBAL(cgebal,CGEBAL)
#define LAPACK_zgebal   LAPACK_GLOBAL(zgebal,ZGEBAL)
#define LAPACK_sgebak   LAPACK_GLOBAL(sgebak,SGEBAK)
#define LAPACK_dgebak   LAPACK_GLOBAL(dgebak,DGEBAK)
#define LAPACK_cgebak   LAPACK_GLOBAL(cgebak,CGEBAK)
#define LAPACK_zgebak   LAPACK_GLOBAL(zgebak,ZGEBAK)

Schur decomposition era 🔥 — hseqr and hsein, and yes, the complex ones lowkey swap s/d for c/z like the icons they are:

#define LAPACK_shseqr   LAPACK_GLOBAL(shseqr,SHSEQR)
#define LAPACK_dhseqr   LAPACK_GLOBAL(dhseqr,DHSEQR)
#define LAPACK_chseqr   LAPACK_GLOBAL(chseqr,CHSEQR)
#define LAPACK_zhseqr   LAPACK_GLOBAL(zhseqr,ZHSEQR)
#define LAPACK_shsein   LAPACK_GLOBAL(shsein,SHSEIN)
#define LAPACK_dhsein   LAPACK_GLOBAL(dhsein,DHSEIN)
#define LAPACK_chsein   LAPACK_GLOBAL(chsein,CHSEIN)
#define LAPACK_zhsein   LAPACK_GLOBAL(zhsein,ZHSEIN)

Eigenvector + condition number + reorder + Sylvester, aka the triangular tr multiverse 🌈 — trevc, trsna, trexc, trsen, trsyl:

#define LAPACK_strevc   LAPACK_GLOBAL(strevc,STREVC)
#define LAPACK_dtrevc   LAPACK_GLOBAL(dtrevc,DTREVC)
#define LAPACK_ctrevc   LAPACK_GLOBAL(ctrevc,CTREVC)
#define LAPACK_ztrevc   LAPACK_GLOBAL(ztrevc,ZTREVC)
#define LAPACK_strsna   LAPACK_GLOBAL(strsna,STRSNA)
#define LAPACK_dtrsna   LAPACK_GLOBAL(dtrsna,DTRSNA)
#define LAPACK_ctrsna   LAPACK_GLOBAL(ctrsna,CTRSNA)
#define LAPACK_ztrsna   LAPACK_GLOBAL(ztrsna,ZTRSNA)
#define LAPACK_strexc   LAPACK_GLOBAL(strexc,STREXC)
#define LAPACK_dtrexc   LAPACK_GLOBAL(dtrexc,DTREXC)
#define LAPACK_ctrexc   LAPACK_GLOBAL(ctrexc,CTREXC)
#define LAPACK_ztrexc   LAPACK_GLOBAL(ztrexc,ZTREXC)
#define LAPACK_strsen   LAPACK_GLOBAL(strsen,STRSEN)
#define LAPACK_dtrsen   LAPACK_GLOBAL(dtrsen,DTRSEN)
#define LAPACK_ctrsen   LAPACK_GLOBAL(ctrsen,CTRSEN)
#define LAPACK_ztrsen   LAPACK_GLOBAL(ztrsen,ZTRSEN)
#define LAPACK_strsyl   LAPACK_GLOBAL(strsyl,STRSYL)
#define LAPACK_dtrsyl   LAPACK_GLOBAL(dtrsyl,DTRSYL)
#define LAPACK_ctrsyl   LAPACK_GLOBAL(ctrsyl,CTRSYL)
#define LAPACK_ztrsyl   LAPACK_GLOBAL(ztrsyl,ZTRSYL)

The generalized Schur era, part one 🦋 — gghrd/gghd3 (yes, both, and yes, d3 is its own whole thing) plus ggbal/ggbak:

#define LAPACK_sgghrd   LAPACK_GLOBAL(sgghrd,SGGHRD)
#define LAPACK_dgghrd   LAPACK_GLOBAL(dgghrd,DGGHRD)
#define LAPACK_cgghrd   LAPACK_GLOBAL(cgghrd,CGGHRD)
#define LAPACK_zgghrd   LAPACK_GLOBAL(zgghrd,ZGGHRD)
#define LAPACK_sgghd3   LAPACK_GLOBAL(sgghd3,SGGHD3)
#define LAPACK_dgghd3   LAPACK_GLOBAL(dgghd3,DGGHD3)
#define LAPACK_cgghd3   LAPACK_GLOBAL(cgghd3,CGGHD3)
#define LAPACK_zgghd3   LAPACK_GLOBAL(zgghd3,ZGGHD3)
#define LAPACK_sggbal   LAPACK_GLOBAL(sggbal,SGGBAL)
#define LAPACK_dggbal   LAPACK_GLOBAL(dggbal,DGGBAL)
#define LAPACK_cggbal   LAPACK_GLOBAL(cggbal,CGGBAL)
#define LAPACK_zggbal   LAPACK_GLOBAL(zggbal,ZGGBAL)
#define LAPACK_sggbak   LAPACK_GLOBAL(sggbak,SGGBAK)
#define LAPACK_dggbak   LAPACK_GLOBAL(dggbak,DGGBAK)
#define LAPACK_cggbak   LAPACK_GLOBAL(cggbak,CGGBAK)
#define LAPACK_zggbak   LAPACK_GLOBAL(zggbak,ZGGBAK)

Part two of that saga 💀 — hgeqz, tgevc, tgexc, tgsen, tgsyl, tgsna, all ×4:

#define LAPACK_shgeqz   LAPACK_GLOBAL(shgeqz,SHGEQZ)
#define LAPACK_dhgeqz   LAPACK_GLOBAL(dhgeqz,DHGEQZ)
#define LAPACK_chgeqz   LAPACK_GLOBAL(chgeqz,CHGEQZ)
#define LAPACK_zhgeqz   LAPACK_GLOBAL(zhgeqz,ZHGEQZ)
#define LAPACK_stgevc   LAPACK_GLOBAL(stgevc,STGEVC)
#define LAPACK_dtgevc   LAPACK_GLOBAL(dtgevc,DTGEVC)
#define LAPACK_ctgevc   LAPACK_GLOBAL(ctgevc,CTGEVC)
#define LAPACK_ztgevc   LAPACK_GLOBAL(ztgevc,ZTGEVC)
#define LAPACK_stgexc   LAPACK_GLOBAL(stgexc,STGEXC)
#define LAPACK_dtgexc   LAPACK_GLOBAL(dtgexc,DTGEXC)
#define LAPACK_ctgexc   LAPACK_GLOBAL(ctgexc,CTGEXC)
#define LAPACK_ztgexc   LAPACK_GLOBAL(ztgexc,ZTGEXC)
#define LAPACK_stgsen   LAPACK_GLOBAL(stgsen,STGSEN)
#define LAPACK_dtgsen   LAPACK_GLOBAL(dtgsen,DTGSEN)
#define LAPACK_ctgsen   LAPACK_GLOBAL(ctgsen,CTGSEN)
#define LAPACK_ztgsen   LAPACK_GLOBAL(ztgsen,ZTGSEN)
#define LAPACK_stgsyl   LAPACK_GLOBAL(stgsyl,STGSYL)
#define LAPACK_dtgsyl   LAPACK_GLOBAL(dtgsyl,DTGSYL)
#define LAPACK_ctgsyl   LAPACK_GLOBAL(ctgsyl,CTGSYL)
#define LAPACK_ztgsyl   LAPACK_GLOBAL(ztgsyl,ZTGSYL)
#define LAPACK_stgsna   LAPACK_GLOBAL(stgsna,STGSNA)
#define LAPACK_dtgsna   LAPACK_GLOBAL(dtgsna,DTGSNA)
#define LAPACK_ctgsna   LAPACK_GLOBAL(ctgsna,CTGSNA)
#define LAPACK_ztgsna   LAPACK_GLOBAL(ztgsna,ZTGSNA)

GSVD prep 🧚 — ggsvp and ggsvp3, then tgsja:

#define LAPACK_sggsvp   LAPACK_GLOBAL(sggsvp,SGGSVP)
#define LAPACK_dggsvp   LAPACK_GLOBAL(dggsvp,DGGSVP)
#define LAPACK_cggsvp   LAPACK_GLOBAL(cggsvp,CGGSVP)
#define LAPACK_zggsvp   LAPACK_GLOBAL(zggsvp,ZGGSVP)
#define LAPACK_sggsvp3   LAPACK_GLOBAL(sggsvp3,SGGSVP3)
#define LAPACK_dggsvp3   LAPACK_GLOBAL(dggsvp3,DGGSVP3)
#define LAPACK_cggsvp3   LAPACK_GLOBAL(cggsvp3,CGGSVP3)
#define LAPACK_zggsvp3   LAPACK_GLOBAL(zggsvp3,ZGGSVP3)
#define LAPACK_stgsja   LAPACK_GLOBAL(stgsja,STGSJA)
#define LAPACK_dtgsja   LAPACK_GLOBAL(dtgsja,DTGSJA)
#define LAPACK_ctgsja   LAPACK_GLOBAL(ctgsja,CTGSJA)
#define LAPACK_ztgsja   LAPACK_GLOBAL(ztgsja,ZTGSJA)

Least squares o'clock 📐✨ — gels, gelsy, gelss, gelsd, then the constrained ones gglse and ggglm:

#define LAPACK_sgels   LAPACK_GLOBAL(sgels,SGELS)
#define LAPACK_dgels   LAPACK_GLOBAL(dgels,DGELS)
#define LAPACK_cgels   LAPACK_GLOBAL(cgels,CGELS)
#define LAPACK_zgels   LAPACK_GLOBAL(zgels,ZGELS)
#define LAPACK_sgelsy   LAPACK_GLOBAL(sgelsy,SGELSY)
#define LAPACK_dgelsy   LAPACK_GLOBAL(dgelsy,DGELSY)
#define LAPACK_cgelsy   LAPACK_GLOBAL(cgelsy,CGELSY)
#define LAPACK_zgelsy   LAPACK_GLOBAL(zgelsy,ZGELSY)
#define LAPACK_sgelss   LAPACK_GLOBAL(sgelss,SGELSS)
#define LAPACK_dgelss   LAPACK_GLOBAL(dgelss,DGELSS)
#define LAPACK_cgelss   LAPACK_GLOBAL(cgelss,CGELSS)
#define LAPACK_zgelss   LAPACK_GLOBAL(zgelss,ZGELSS)
#define LAPACK_sgelsd   LAPACK_GLOBAL(sgelsd,SGELSD)
#define LAPACK_dgelsd   LAPACK_GLOBAL(dgelsd,DGELSD)
#define LAPACK_cgelsd   LAPACK_GLOBAL(cgelsd,CGELSD)
#define LAPACK_zgelsd   LAPACK_GLOBAL(zgelsd,ZGELSD)
#define LAPACK_sgglse   LAPACK_GLOBAL(sgglse,SGGLSE)
#define LAPACK_dgglse   LAPACK_GLOBAL(dgglse,DGGLSE)
#define LAPACK_cgglse   LAPACK_GLOBAL(cgglse,CGGLSE)
#define LAPACK_zgglse   LAPACK_GLOBAL(zgglse,ZGGLSE)
#define LAPACK_sggglm   LAPACK_GLOBAL(sggglm,SGGGLM)
#define LAPACK_dggglm   LAPACK_GLOBAL(dggglm,DGGGLM)
#define LAPACK_cggglm   LAPACK_GLOBAL(cggglm,CGGGLM)
#define LAPACK_zggglm   LAPACK_GLOBAL(zggglm,ZGGGLM)

And now the symmetric/Hermitian eigenvalue section, where the _2stage variants start showing up and some lines are split across two source lines (not me being messy — that's literally how they're written, bestie 🙈):

#define LAPACK_ssyev   LAPACK_GLOBAL(ssyev,SSYEV)
#define LAPACK_dsyev   LAPACK_GLOBAL(dsyev,DSYEV)
#define LAPACK_cheev   LAPACK_GLOBAL(cheev,CHEEV)
#define LAPACK_zheev   LAPACK_GLOBAL(zheev,ZHEEV)
#define LAPACK_ssyev_2stage   LAPACK_GLOBAL(ssyev_2stage,SSYEV_2STAGE)
#define LAPACK_dsyev_2stage   LAPACK_GLOBAL(dsyev_2stage,DSYEV_2STAGE)
#define LAPACK_cheev_2stage   LAPACK_GLOBAL(cheev_2stage,CHEEV_2STAGE)
#define LAPACK_zheev_2stage   LAPACK_GLOBAL(zheev_2stage,ZHEEV_2STAGE)
#define LAPACK_ssyevd   LAPACK_GLOBAL(ssyevd,SSYEVD)
#define LAPACK_dsyevd   LAPACK_GLOBAL(dsyevd,DSYEVD)
#define LAPACK_cheevd   LAPACK_GLOBAL(cheevd,CHEEVD)
#define LAPACK_zheevd   LAPACK_GLOBAL(zheevd,ZHEEVD)
#define LAPACK_ssyevd_2stage
    LAPACK_GLOBAL(ssyevd_2stage,SSYEVD_2STAGE)
#define LAPACK_dsyevd_2stage
    LAPACK_GLOBAL(dsyevd_2stage,DSYEVD_2STAGE)
#define LAPACK_cheevd_2stage
    LAPACK_GLOBAL(cheevd_2stage,CHEEVD_2STAGE)
#define LAPACK_zheevd_2stage
    LAPACK_GLOBAL(zheevd_2stage,ZHEEVD_2STAGE)
#define LAPACK_ssyevx   LAPACK_GLOBAL(ssyevx,SSYEVX)
#define LAPACK_dsyevx   LAPACK_GLOBAL(dsyevx,DSYEVX)
#define LAPACK_cheevx   LAPACK_GLOBAL(cheevx,CHEEVX)
#define LAPACK_zheevx   LAPACK_GLOBAL(zheevx,ZHEEVX)
#define LAPACK_ssyevx_2stage
    LAPACK_GLOBAL(ssyevx_2stage,SSYEVX_2STAGE)
#define LAPACK_dsyevx_2stage
    LAPACK_GLOBAL(dsyevx_2stage,DSYEVX_2STAGE)
#define LAPACK_cheevx_2stage
    LAPACK_GLOBAL(cheevx_2stage,CHEEVX_2STAGE)
#define LAPACK_zheevx_2stage
    LAPACK_GLOBAL(zheevx_2stage,ZHEEVX_2STAGE)
#define LAPACK_ssyevr   LAPACK_GLOBAL(ssyevr,SSYEVR)
#define LAPACK_dsyevr   LAPACK_GLOBAL(dsyevr,DSYEVR)
#define LAPACK_cheevr   LAPACK_GLOBAL(cheevr,CHEEVR)
#define LAPACK_zheevr   LAPACK_GLOBAL(zheevr,ZHEEVR)
#define LAPACK_ssyevr_2stage
    LAPACK_GLOBAL(ssyevr_2stage,SSYEVR_2STAGE)
#define LAPACK_dsyevr_2stage
    LAPACK_GLOBAL(dsyevr_2stage,DSYEVR_2STAGE)
#define LAPACK_cheevr_2stage
    LAPACK_GLOBAL(cheevr_2stage,CHEEVR_2STAGE)
#define LAPACK_zheevr_2stage
    LAPACK_GLOBAL(zheevr_2stage,ZHEEVR_2STAGE)

Packed (pev) and banded (bev) symmetric/Hermitian eigenvalue routines, and the part cuts off mid-bev_2stage — the zhbev_2stage line must be in the next chunk, so don't come for me 😭:

#define LAPACK_sspev   LAPACK_GLOBAL(sspev,SSPEV)
#define LAPACK_dspev   LAPACK_GLOBAL(dspev,DSPEV)
#define LAPACK_chpev   LAPACK_GLOBAL(chpev,CHPEV)
#define LAPACK_zhpev   LAPACK_GLOBAL(zhpev,ZHPEV)
#define LAPACK_sspevd   LAPACK_GLOBAL(sspevd,SSPEVD)
#define LAPACK_dspevd   LAPACK_GLOBAL(dspevd,DSPEVD)
#define LAPACK_chpevd   LAPACK_GLOBAL(chpevd,CHPEVD)
#define LAPACK_zhpevd   LAPACK_GLOBAL(zhpevd,ZHPEVD)
#define LAPACK_sspevx   LAPACK_GLOBAL(sspevx,SSPEVX)
#define LAPACK_dspevx   LAPACK_GLOBAL(dspevx,DSPEVX)
#define LAPACK_chpevx   LAPACK_GLOBAL(chpevx,CHPEVX)
#define LAPACK_zhpevx   LAPACK_GLOBAL(zhpevx,ZHPEVX)
#define LAPACK_ssbev   LAPACK_GLOBAL(ssbev,SSBEV)
#define LAPACK_dsbev   LAPACK_GLOBAL(dsbev,DSBEV)
#define LAPACK_chbev   LAPACK_GLOBAL(chbev,CHBEV)
#define LAPACK_zhbev   LAPACK_GLOBAL(zhbev,ZHBEV)
#define LAPACK_ssbev_2stage   LAPACK_GLOBAL(ssbev_2stage,SSBEV_2STAGE)
#define LAPACK_dsbev_2stage   LAPACK_GLOBAL(dsbev_2stage,DSBEV_2STAGE)
#define LAPACK_chbev_2stage   LAPACK_GLOBAL(chbev_2stage,CHBEV_2STAGE)
Bestie reminder 🫶 — these are literal macro definitions, character for character. Lowercase first arg, ALL CAPS second arg, and LAPACK_GLOBAL doing the actual heavy lifting. Not one of them is a typo (even the ones that look like typos).

okay so we are still deep in the #define wall and honestly? it's giving phone book 💀 but every single line matters, so we're doing this properly. no skipping, no "etc." — every macro gets its moment.

Quick vibe check on what these lines even are: each one is a <pink>little nickname</pink> — the LAPACK_ name you actually type, pointing at the <purple>real symbol</purple> through LAPACK_GLOBAL(...), which is the header's way of gluing the routine name to its uppercase form. Same pattern, every single time. iykyk 🎀


🦋 the symmetric band eigenvalue cluster

first up, the band-matrix eigenvalue squad. note that zhbev_2stage walks in by itself with no friends, while the *bevd and *bevx families get the full real/complex quartet treatment:

#define LAPACK_zhbev_2stage   LAPACK_GLOBAL(zhbev_2stage,ZHBEV_2STAGE)
#define LAPACK_ssbevd   LAPACK_GLOBAL(ssbevd,SSBEVD)
#define LAPACK_dsbevd   LAPACK_GLOBAL(dsbevd,DSBEVD)
#define LAPACK_chbevd   LAPACK_GLOBAL(chbevd,CHBEVD)
#define LAPACK_zhbevd   LAPACK_GLOBAL(zhbevd,ZHBEVD)
#define LAPACK_ssbevd_2stage   LAPACK_GLOBAL(ssbevd_2stage,SSBEVD_2STAGE)
#define LAPACK_dsbevd_2stage   LAPACK_GLOBAL(dsbevd_2stage,DSBEVD_2STAGE)
#define LAPACK_chbevd_2stage   LAPACK_GLOBAL(chbevd_2stage,CHBEVD_2STAGE)
#define LAPACK_zhbevd_2stage   LAPACK_GLOBAL(zhbevd_2stage,ZHBEVD_2STAGE)
#define LAPACK_ssbevx   LAPACK_GLOBAL(ssbevx,SSBEVX)
#define LAPACK_dsbevx   LAPACK_GLOBAL(dsbevx,DSBEVX)
#define LAPACK_chbevx   LAPACK_GLOBAL(chbevx,CHBEVX)
#define LAPACK_zhbevx   LAPACK_GLOBAL(zhbevx,ZHBEVX)
#define LAPACK_ssbevx_2stage   LAPACK_GLOBAL(ssbevx_2stage,SSBEVX_2STAGE)
#define LAPACK_dsbevx_2stage   LAPACK_GLOBAL(dsbevx_2stage,DSBEVX_2STAGE)
#define LAPACK_chbevx_2stage   LAPACK_GLOBAL(chbevx_2stage,CHBEVX_2STAGE)
#define LAPACK_zhbevx_2stage   LAPACK_GLOBAL(zhbevx_2stage,ZHBEVX_2STAGE)

the way the _2stage crew ate and left ssbev_2stage off the guest list... not me noticing 👀 (just writing what's literally in the header bestie, don't come for me)


🌸 tridiagonal moment

then we have the tridiagonal stev lineup, and it is <hotpink>strictly sandd</hotpink> — no complex versions anywhere in sight:

#define LAPACK_sstev   LAPACK_GLOBAL(sstev,SSTEV)
#define LAPACK_dstev   LAPACK_GLOBAL(dstev,DSTEV)
#define LAPACK_sstevd   LAPACK_GLOBAL(sstevd,SSTEVD)
#define LAPACK_dstevd   LAPACK_GLOBAL(dstevd,DSTEVD)
#define LAPACK_sstevx   LAPACK_GLOBAL(sstevx,SSTEVX)
#define LAPACK_dstevx   LAPACK_GLOBAL(dstevx,DSTEVX)
#define LAPACK_sstevr   LAPACK_GLOBAL(sstevr,SSTEVR)
#define LAPACK_dstevr   LAPACK_GLOBAL(dstevr,DSTEVR)

four flavors (stev, stevd, stevx, stevr), two precisions (s, d), zero drama. clean. 🧚


👑 the general eigen + Schur era

okay this is the main character section. gees (Schur), geesx, geev (eigenvalues), geevx — all four precisions, all of them iconic:

#define LAPACK_sgees   LAPACK_GLOBAL(sgees,SGEES)
#define LAPACK_dgees   LAPACK_GLOBAL(dgees,DGEES)
#define LAPACK_cgees   LAPACK_GLOBAL(cgees,CGEES)
#define LAPACK_zgees   LAPACK_GLOBAL(zgees,ZGEES)
#define LAPACK_sgeesx   LAPACK_GLOBAL(sgeesx,SGEESX)
#define LAPACK_dgeesx   LAPACK_GLOBAL(dgeesx,DGEESX)
#define LAPACK_cgeesx   LAPACK_GLOBAL(cgeesx,CGEESX)
#define LAPACK_zgeesx   LAPACK_GLOBAL(zgeesx,ZGEESX)
#define LAPACK_sgeev   LAPACK_GLOBAL(sgeev,SGEEV)
#define LAPACK_dgeev   LAPACK_GLOBAL(dgeev,DGEEV)
#define LAPACK_cgeev   LAPACK_GLOBAL(cgeev,CGEEV)
#define LAPACK_zgeev   LAPACK_GLOBAL(zgeev,ZGEEV)
#define LAPACK_sgeevx   LAPACK_GLOBAL(sgeevx,SGEEVX)
#define LAPACK_dgeevx   LAPACK_GLOBAL(dgeevx,DGEEVX)
#define LAPACK_cgeevx   LAPACK_GLOBAL(cgeevx,CGEEVX)
#define LAPACK_zgeevx   LAPACK_GLOBAL(zgeevx,ZGEEVX)

that's sixteen lines of pure symmetry and i'm obsessed 🫶


⭐ SVD section (yes there are this many)

the singular value decomposition crowd. gesvd, gesvdx, gesdd, then the gejsv / gesvj duo — all in s, d, c, z:

#define LAPACK_sgesvd   LAPACK_GLOBAL(sgesvd,SGESVD)
#define LAPACK_dgesvd   LAPACK_GLOBAL(dgesvd,DGESVD)
#define LAPACK_cgesvd   LAPACK_GLOBAL(cgesvd,CGESVD)
#define LAPACK_zgesvd   LAPACK_GLOBAL(zgesvd,ZGESVD)
#define LAPACK_sgesvdx   LAPACK_GLOBAL(sgesvdx,SGESVDX)
#define LAPACK_dgesvdx   LAPACK_GLOBAL(dgesvdx,DGESVDX)
#define LAPACK_cgesvdx   LAPACK_GLOBAL(cgesvdx,CGESVDX)
#define LAPACK_zgesvdx   LAPACK_GLOBAL(zgesvdx,ZGESVDX)
#define LAPACK_sgesdd   LAPACK_GLOBAL(sgesdd,SGESDD)
#define LAPACK_dgesdd   LAPACK_GLOBAL(dgesdd,DGESDD)
#define LAPACK_cgesdd   LAPACK_GLOBAL(cgesdd,CGESDD)
#define LAPACK_zgesdd   LAPACK_GLOBAL(zgesdd,ZGESDD)
#define LAPACK_sgejsv   LAPACK_GLOBAL(sgejsv,SGEJSV)
#define LAPACK_dgejsv   LAPACK_GLOBAL(dgejsv,DGEJSV)
#define LAPACK_cgejsv   LAPACK_GLOBAL(cgejsv,CGEJSV)
#define LAPACK_zgejsv   LAPACK_GLOBAL(zgejsv,ZGEJSV)
#define LAPACK_sgesvj   LAPACK_GLOBAL(sgesvj,SGESVJ)
#define LAPACK_dgesvj   LAPACK_GLOBAL(dgesvj,DGESVJ)
#define LAPACK_cgesvj   LAPACK_GLOBAL(cgesvj,CGESVJ)
#define LAPACK_zgesvj   LAPACK_GLOBAL(zgesvj,ZGESVJ)

the way gesvd and gesdd are literally one letter apart and both fully present — no cap, check your spelling twice 💀


🎀 generalized SVD, but make it ggsvd

just the one family here. four lines. she's small but she's doing her thing:

#define LAPACK_sggsvd   LAPACK_GLOBAL(sggsvd,SGGSVD)
#define LAPACK_dggsvd   LAPACK_GLOBAL(dggsvd,DGGSVD)
#define LAPACK_cggsvd   LAPACK_GLOBAL(cggsvd,CGGSVD)
#define LAPACK_zggsvd   LAPACK_GLOBAL(zggsvd,ZGGSVD)

💜 generalized symmetric-definite eigen cluster

okay this whole block is the gv party — sygv (real symmetric) and hegv (complex hermitian), each with a _2stage twin, a d variant, and an x variant. sixteen lines, deep breath:

#define LAPACK_ssygv   LAPACK_GLOBAL(ssygv,SSYGV)
#define LAPACK_dsygv   LAPACK_GLOBAL(dsygv,DSYGV)
#define LAPACK_chegv   LAPACK_GLOBAL(chegv,CHEGV)
#define LAPACK_zhegv   LAPACK_GLOBAL(zhegv,ZHEGV)
#define LAPACK_ssygv_2stage   LAPACK_GLOBAL(ssygv_2stage,SSYGV_2STAGE)
#define LAPACK_dsygv_2stage   LAPACK_GLOBAL(dsygv_2stage,DSYGV_2STAGE)
#define LAPACK_chegv_2stage   LAPACK_GLOBAL(chegv_2stage,CHEGV_2STAGE)
#define LAPACK_zhegv_2stage   LAPACK_GLOBAL(zhegv_2stage,ZHEGV_2STAGE)
#define LAPACK_ssygvd   LAPACK_GLOBAL(ssygvd,SSYGVD)
#define LAPACK_dsygvd   LAPACK_GLOBAL(dsygvd,DSYGVD)
#define LAPACK_chegvd   LAPACK_GLOBAL(chegvd,CHEGVD)
#define LAPACK_zhegvd   LAPACK_GLOBAL(zhegvd,ZHEGVD)
#define LAPACK_ssygvx   LAPACK_GLOBAL(ssygvx,SSYGVX)
#define LAPACK_dsygvx   LAPACK_GLOBAL(dsygvx,DSYGVX)
#define LAPACK_chegvx   LAPACK_GLOBAL(chegvx,CHEGVX)
#define LAPACK_zhegvx   LAPACK_GLOBAL(zhegvx,ZHEGVX)

notice the _2stage versions live right in the middle of the block, sandwiched between plain and d — the header has a whole layout and we respect it 🌈


🍓 packed storage said "me next"

pgv = packed. plain, d, and x, across all four precisions:

#define LAPACK_sspgv   LAPACK_GLOBAL(sspgv,SSPGV)
#define LAPACK_dspgv   LAPACK_GLOBAL(dspgv,DSPGV)
#define LAPACK_chpgv   LAPACK_GLOBAL(chpgv,CHPGV)
#define LAPACK_zhpgv   LAPACK_GLOBAL(zhpgv,ZHPGV)
#define LAPACK_sspgvd   LAPACK_GLOBAL(sspgvd,SSPGVD)
#define LAPACK_dspgvd   LAPACK_GLOBAL(dspgvd,DSPGVD)
#define LAPACK_chpgvd   LAPACK_GLOBAL(chpgvd,CHPGVD)
#define LAPACK_zhpgvd   LAPACK_GLOBAL(zhpgvd,ZHPGVD)
#define LAPACK_sspgvx   LAPACK_GLOBAL(sspgvx,SSPGVX)
#define LAPACK_dspgvx   LAPACK_GLOBAL(dspgvx,DSPGVX)
#define LAPACK_chpgvx   LAPACK_GLOBAL(chpgvx,CHPGVX)
#define LAPACK_zhpgvx   LAPACK_GLOBAL(zhpgvx,ZHPGVX)

twelve-ish lines of pack-it-in energy. she's compact, obviously 💅


🔥 band storage said "hold my drink"

bgv = band. same three-flavor pattern, same four precisions:

#define LAPACK_ssbgv   LAPACK_GLOBAL(ssbgv,SSBGV)
#define LAPACK_dsbgv   LAPACK_GLOBAL(dsbgv,DSBGV)
#define LAPACK_chbgv   LAPACK_GLOBAL(chbgv,CHBGV)
#define LAPACK_zhbgv   LAPACK_GLOBAL(zhbgv,ZHBGV)
#define LAPACK_ssbgvd   LAPACK_GLOBAL(ssbgvd,SSBGVD)
#define LAPACK_dsbgvd   LAPACK_GLOBAL(dsbgvd,DSBGVD)
#define LAPACK_chbgvd   LAPACK_GLOBAL(chbgvd,CHBGVD)
#define LAPACK_zhbgvd   LAPACK_GLOBAL(zhbgvd,ZHBGVD)
#define LAPACK_ssbgvx   LAPACK_GLOBAL(ssbgvx,SSBGVX)
#define LAPACK_dsbgvx   LAPACK_GLOBAL(dsbgvx,DSBGVX)
#define LAPACK_chbgvx   LAPACK_GLOBAL(chbgvx,CHBGVX)
#define LAPACK_zhbgvx   LAPACK_GLOBAL(zhbgvx,ZHBGVX)

packed storage and band storage are literally siblings and neither of them is beating the allegations of being confusing to index 😭 but the macros? immaculate.


🌈 generalized Schur, the trilogy

gges (classic), gges3 (the newer cut), ggesx (the extra-credit one) — and yes, cgges and zgges are here too, lowercase c/z and all:

#define LAPACK_sgges   LAPACK_GLOBAL(sgges,SGGES)
#define LAPACK_dgges   LAPACK_GLOBAL(dgges,DGGES)
#define LAPACK_cgges   LAPACK_GLOBAL(cgges,CGGES)
#define LAPACK_zgges   LAPACK_GLOBAL(zgges,ZGGES)
#define LAPACK_sgges3   LAPACK_GLOBAL(sgges3,SGGES3)
#define LAPACK_dgges3   LAPACK_GLOBAL(dgges3,DGGES3)
#define LAPACK_cgges3   LAPACK_GLOBAL(cgges3,CGGES3)
#define LAPACK_zgges3   LAPACK_GLOBAL(zgges3,ZGGES3)
#define LAPACK_sggesx   LAPACK_GLOBAL(sggesx,SGGESX)
#define LAPACK_dggesx   LAPACK_GLOBAL(dggesx,DGGESX)
#define LAPACK_cggesx   LAPACK_GLOBAL(cggesx,CGGESX)
#define LAPACK_zggesx   LAPACK_GLOBAL(zggesx,ZGGESX)

three variants, four precisions, twelve lines, all accounted for ✨


💖 generalized eigen, same trilogy energy

ggev, ggev3, ggevx — the eigenvalue cousins of the block above:

#define LAPACK_sggev   LAPACK_GLOBAL(sggev,SGGEV)
#define LAPACK_dggev   LAPACK_GLOBAL(dggev,DGGEV)
#define LAPACK_cggev   LAPACK_GLOBAL(cggev,CGGEV)
#define LAPACK_zggev   LAPACK_GLOBAL(zggev,ZGGEV)
#define LAPACK_sggev3   LAPACK_GLOBAL(sggev3,SGGEV3)
#define LAPACK_dggev3   LAPACK_GLOBAL(dggev3,DGGEV3)
#define LAPACK_cggev3   LAPACK_GLOBAL(cggev3,CGGEV3)
#define LAPACK_zggev3   LAPACK_GLOBAL(zggev3,ZGGEV3)
#define LAPACK_sggevx   LAPACK_GLOBAL(sggevx,SGGEVX)
#define LAPACK_dggevx   LAPACK_GLOBAL(dggevx,DGGEVX)
#define LAPACK_cggevx   LAPACK_GLOBAL(cggevx,CGGEVX)
#define LAPACK_zggevx   LAPACK_GLOBAL(zggevx,ZGGEVX)

the 3 squad really said "we're the upgrade" and honestly? they might be. 🧚‍♀️


🫶 the frk block (and yes the order is d, s, z, c)

okay bestie, pay attention: this is the one place where the ordering flips on you — dsfrk before ssfrk, zhfrk before chfrk. that's not me being chaotic, that's literally the header:

#define LAPACK_dsfrk   LAPACK_GLOBAL(dsfrk,DSFRK)
#define LAPACK_ssfrk   LAPACK_GLOBAL(ssfrk,SSFRK)
#define LAPACK_zhfrk   LAPACK_GLOBAL(zhfrk,ZHFRK)
#define LAPACK_chfrk   LAPACK_GLOBAL(chfrk,CHFRK)

do not reorder them. do not "fix" them. they are exactly as written, periodt 💀


🎀 tfsm: same deal, d comes first

#define LAPACK_dtfsm   LAPACK_GLOBAL(dtfsm,DTFSM)
#define LAPACK_stfsm   LAPACK_GLOBAL(stfsm,STFSM)
#define LAPACK_ztfsm   LAPACK_GLOBAL(ztfsm,ZTFSM)
#define LAPACK_ctfsm   LAPACK_GLOBAL(ctfsm,CTFSM)

four lines, double-first energy, love that for us 🌸


🦋 the triangular storage conversion crew

this is the big one — six families, four precisions each, <hotpink>every single one in d, s, z, c order</hotpink>. tfttp, tfttr, tpttf, tpttr, trttf, trttp. twenty-four lines of pure "triangle goes here, now it goes there":

#define LAPACK_dtfttp   LAPACK_GLOBAL(dtfttp,DTFTTP)
#define LAPACK_stfttp   LAPACK_GLOBAL(stfttp,STFTTP)
#define LAPACK_ztfttp   LAPACK_GLOBAL(ztfttp,ZTFTTP)
#define LAPACK_ctfttp   LAPACK_GLOBAL(ctfttp,CTFTTP)
#define LAPACK_dtfttr   LAPACK_GLOBAL(dtfttr,DTFTTR)
#define LAPACK_stfttr   LAPACK_GLOBAL(stfttr,STFTTR)
#define LAPACK_ztfttr   LAPACK_GLOBAL(ztfttr,ZTFTTR)
#define LAPACK_ctfttr   LAPACK_GLOBAL(ctfttr,CTFTTR)
#define LAPACK_dtpttf   LAPACK_GLOBAL(dtpttf,DTPTTF)
#define LAPACK_stpttf   LAPACK_GLOBAL(stpttf,STPTTF)
#define LAPACK_ztpttf   LAPACK_GLOBAL(ztpttf,ZTPTTF)
#define LAPACK_ctpttf   LAPACK_GLOBAL(ctpttf,CTPTTF)
#define LAPACK_dtpttr   LAPACK_GLOBAL(dtpttr,DTPTTR)
#define LAPACK_stpttr   LAPACK_GLOBAL(stpttr,STPTTR)
#define LAPACK_ztpttr   LAPACK_GLOBAL(ztpttr,ZTPTTR)
#define LAPACK_ctpttr   LAPACK_GLOBAL(ctpttr,CTPTTR)
#define LAPACK_dtrttf   LAPACK_GLOBAL(dtrttf,DTRTTF)
#define LAPACK_strttf   LAPACK_GLOBAL(strttf,STRTTF)
#define LAPACK_ztrttf   LAPACK_GLOBAL(ztrttf,ZTRTTF)
#define LAPACK_ctrttf   LAPACK_GLOBAL(ctrttf,CTRTTF)
#define LAPACK_dtrttp   LAPACK_GLOBAL(dtrttp,DTRTTP)
#define LAPACK_strttp   LAPACK_GLOBAL(strttp,STRTTP)
#define LAPACK_ztrttp   LAPACK_GLOBAL(ztrttp,ZTRTTP)
#define LAPACK_ctrttp   LAPACK_GLOBAL(ctrttp,CTRTTP)

if you ever need to read one of these out loud: full-storage → packed, packed → full, triangle → triangle, <purple>t</purple> here, <purple>t</purple> there. the vowels literally spell the conversion and that's kind of a slay 🎀


⭐ geqrfp: QR with a p on the end

only four lines, and yes that trailing p is part of the name, don't drop it:

#define LAPACK_sgeqrfp   LAPACK_GLOBAL(sgeqrfp,SGEQRFP)
#define LAPACK_dgeqrfp   LAPACK_GLOBAL(dgeqrfp,DGEQRFP)
#define LAPACK_cgeqrfp   LAPACK_GLOBAL(cgeqrfp,CGEQRFP)
#define LAPACK_zgeqrfp   LAPACK_GLOBAL(zgeqrfp,ZGEQRFP)

🌈 lacgv: just two, and both are complex

real numbers don't need this one, so you get c and z only:

#define LAPACK_clacgv   LAPACK_GLOBAL(clacgv,CLACGV)
#define LAPACK_zlacgv   LAPACK_GLOBAL(zlacgv,ZLACGV)

short, sweet, conj-transpose-coded 💅


🍓 larnv: random vector, all four

#define LAPACK_slarnv   LAPACK_GLOBAL(slarnv,SLARNV)
#define LAPACK_dlarnv   LAPACK_GLOBAL(dlarnv,DLARNV)
#define LAPACK_clarnv   LAPACK_GLOBAL(clarnv,CLARNV)
#define LAPACK_zlarnv   LAPACK_GLOBAL(zlarnv,ZLARNV)

all four precisions present and accounted for. chaos but make it typed ✨


💜 geqr2: the unblocked QR kid

#define LAPACK_sgeqr2   LAPACK_GLOBAL(sgeqr2,SGEQR2)
#define LAPACK_dgeqr2   LAPACK_GLOBAL(dgeqr2,DGEQR2)
#define LAPACK_cgeqr2   LAPACK_GLOBAL(cgeqr2,CGEQR2)
#define LAPACK_zgeqr2   LAPACK_GLOBAL(zgeqr2,ZGEQR2)

the 2 is part of the name. i will not be elaborating further, i'm just the messenger 🫶


🎀 lacn2: norm-estimation crew

#define LAPACK_slacn2   LAPACK_GLOBAL(slacn2,SLACN2)
#define LAPACK_dlacn2   LAPACK_GLOBAL(dlacn2,DLACN2)
#define LAPACK_clacn2   LAPACK_GLOBAL(clacn2,CLACN2)
#define LAPACK_zlacn2   LAPACK_GLOBAL(zlacn2,ZLACN2)

🦋 lacpy and lacp2 — yes they're different, no you may not merge them

lacpy comes in all four precisions, but lacp2 is <hotpink>only candz</hotpink> here. look closely, bestie:

#define LAPACK_slacpy   LAPACK_GLOBAL(slacpy,SLACPY)
#define LAPACK_dlacpy   LAPACK_GLOBAL(dlacpy,DLACPY)
#define LAPACK_clacpy   LAPACK_GLOBAL(clacpy,CLACPY)
#define LAPACK_zlacpy   LAPACK_GLOBAL(zlacpy,ZLACPY)
#define LAPACK_clacp2   LAPACK_GLOBAL(clacp2,CLACP2)
#define LAPACK_zlacp2   LAPACK_GLOBAL(zlacp2,ZLACP2)

four plus two, six total, and the missing s/d on lacp2 is not a typo, it's just how it is 🙈


🔥 getf2: the small but mighty one

#define LAPACK_sgetf2   LAPACK_GLOBAL(sgetf2,SGETF2)
#define LAPACK_dgetf2   LAPACK_GLOBAL(dgetf2,DGETF2)
#define LAPACK_cgetf2   LAPACK_GLOBAL(cgetf2,CGETF2)
#define LAPACK_zgetf2   LAPACK_GLOBAL(zgetf2,ZGETF2)

f2 = the two in getf2. it's literally in the name, i'm not doing extra research 🧚‍♀️


🌸 laswp: pivot-swap squad

#define LAPACK_slaswp   LAPACK_GLOBAL(slaswp,SLASWP)
#define LAPACK_dlaswp   LAPACK_GLOBAL(dlaswp,DLASWP)
#define LAPACK_claswp   LAPACK_GLOBAL(claswp,CLASWP)
#define LAPACK_zlaswp   LAPACK_GLOBAL(zlaswp,ZLASWP)

all four, in order, no notes 👑


⭐ lange: three lines and then this part just... ends

last stretch of this chunk — and heads up, <red>only s, d, and c are here. there is no LAPACK_zlange line in what we've got. don't add it, don't assume it, just read it as written:

#define LAPACK_slange   LAPACK_GLOBAL(slange,SLANGE)
#define LAPACK_dlange   LAPACK_GLOBAL(dlange,DLANGE)
#define LAPACK_clange   LAPACK_GLOBAL(clange,CLANGE)

three lines, one missing z, and we move on — because there's more header coming and we're nowhere near done, bestie. keep scrolling 💖

okay so this next stretch of the #define wall is pure ritual, bestie — every single line is the same little spell: LAPACK_ + your lowercase name on the left, and LAPACK_GLOBAL(...) holding the lowercase + uppercase pair on the right. once you see the pattern you can't unsee it, iykyk 💅✨

🌀 the lan-squad & friends

       #define LAPACK_zlange   LAPACK_GLOBAL(zlange,ZLANGE)
       #define LAPACK_clanhe   LAPACK_GLOBAL(clanhe,CLANHE)
       #define LAPACK_zlanhe   LAPACK_GLOBAL(zlanhe,ZLANHE)
       #define LAPACK_clarcm   LAPACK_GLOBAL(clarcm,CLARCM)
       #define LAPACK_zlarcm   LAPACK_GLOBAL(zlarcm,ZLARCM)
       #define LAPACK_clacrm   LAPACK_GLOBAL(clacrm,CLACRM)
       #define LAPACK_zlacrm   LAPACK_GLOBAL(zlacrm,ZLACRM)
       #define LAPACK_slansy   LAPACK_GLOBAL(slansy,SLANSY)
       #define LAPACK_dlansy   LAPACK_GLOBAL(dlansy,DLANSY)
       #define LAPACK_clansy   LAPACK_GLOBAL(clansy,CLANSY)
       #define LAPACK_zlansy   LAPACK_GLOBAL(zlansy,ZLANSY)
       #define LAPACK_slantr   LAPACK_GLOBAL(slantr,SLANTR)
       #define LAPACK_dlantr   LAPACK_GLOBAL(dlantr,DLANTR)
       #define LAPACK_clantr   LAPACK_GLOBAL(clantr,CLANTR)
       #define LAPACK_zlantr   LAPACK_GLOBAL(zlantr,ZLANTR)
       #define LAPACK_slamch   LAPACK_GLOBAL(slamch,SLAMCH)
       #define LAPACK_dlamch   LAPACK_GLOBAL(dlamch,DLAMCH)

not the larcm/lacrm pair being lowkey mirror twins and still not the same name 😭 read those two twice, i'm begging. 🫶

🦋 the reflector / generator crew

       #define LAPACK_sgelq2   LAPACK_GLOBAL(sgelq2,SGELQ2)
       #define LAPACK_dgelq2   LAPACK_GLOBAL(dgelq2,DGELQ2)
       #define LAPACK_cgelq2   LAPACK_GLOBAL(cgelq2,CGELQ2)
       #define LAPACK_zgelq2   LAPACK_GLOBAL(zgelq2,ZGELQ2)
       #define LAPACK_slarfb   LAPACK_GLOBAL(slarfb,SLARFB)
       #define LAPACK_dlarfb   LAPACK_GLOBAL(dlarfb,DLARFB)
       #define LAPACK_clarfb   LAPACK_GLOBAL(clarfb,CLARFB)
       #define LAPACK_zlarfb   LAPACK_GLOBAL(zlarfb,ZLARFB)
       #define LAPACK_slarfg   LAPACK_GLOBAL(slarfg,SLARFG)
       #define LAPACK_dlarfg   LAPACK_GLOBAL(dlarfg,DLARFG)
       #define LAPACK_clarfg   LAPACK_GLOBAL(clarfg,CLARFG)
       #define LAPACK_zlarfg   LAPACK_GLOBAL(zlarfg,ZLARFG)
       #define LAPACK_slassq   LAPACK_GLOBAL(slassq,SLASSQ)
       #define LAPACK_dlassq   LAPACK_GLOBAL(dlassq,DLASSQ)
       #define LAPACK_classq   LAPACK_GLOBAL(classq,CLASSQ)
       #define LAPACK_zlassq   LAPACK_GLOBAL(zlassq,ZLASSQ)
       #define LAPACK_slarft   LAPACK_GLOBAL(slarft,SLARFT)
       #define LAPACK_dlarft   LAPACK_GLOBAL(dlarft,DLARFT)
       #define LAPACK_clarft   LAPACK_GLOBAL(clarft,CLARFT)
       #define LAPACK_zlarft   LAPACK_GLOBAL(zlarft,ZLARFT)
       #define LAPACK_slarfx   LAPACK_GLOBAL(slarfx,SLARFX)
       #define LAPACK_dlarfx   LAPACK_GLOBAL(dlarfx,DLARFX)
       #define LAPACK_clarfx   LAPACK_GLOBAL(clarfx,CLARFX)
       #define LAPACK_zlarfx   LAPACK_GLOBAL(zlarfx,ZLARFX)
       #define LAPACK_slatms   LAPACK_GLOBAL(slatms,SLATMS)
       #define LAPACK_dlatms   LAPACK_GLOBAL(dlatms,DLATMS)
       #define LAPACK_clatms   LAPACK_GLOBAL(clatms,CLATMS)
       #define LAPACK_zlatms   LAPACK_GLOBAL(zlatms,ZLATMS)

the larfb → larfg → larft → larfx run is giving ✨alphabetical main character energy✨ and honestly? slay. 🎀

🌸 conversions, scales & sets

       #define LAPACK_slag2d   LAPACK_GLOBAL(slag2d,SLAG2D)
       #define LAPACK_dlag2s   LAPACK_GLOBAL(dlag2s,DLAG2S)
       #define LAPACK_clag2z   LAPACK_GLOBAL(clag2z,CLAG2Z)
       #define LAPACK_zlag2c   LAPACK_GLOBAL(zlag2c,ZLAG2C)
       #define LAPACK_slauum   LAPACK_GLOBAL(slauum,SLAUUM)
       #define LAPACK_dlauum   LAPACK_GLOBAL(dlauum,DLAUUM)
       #define LAPACK_clauum   LAPACK_GLOBAL(clauum,CLAUUM)
       #define LAPACK_zlauum   LAPACK_GLOBAL(zlauum,ZLAUUM)
       #define LAPACK_slagge   LAPACK_GLOBAL(slagge,SLAGGE)
       #define LAPACK_dlagge   LAPACK_GLOBAL(dlagge,DLAGGE)
       #define LAPACK_clagge   LAPACK_GLOBAL(clagge,CLAGGE)
       #define LAPACK_zlagge   LAPACK_GLOBAL(zlagge,ZLAGGE)
       #define LAPACK_slascl   LAPACK_GLOBAL(slascl,SLASCL)
       #define LAPACK_dlascl   LAPACK_GLOBAL(dlascl,DLASCL)
       #define LAPACK_clascl   LAPACK_GLOBAL(clascl,CLASCL)
       #define LAPACK_zlascl   LAPACK_GLOBAL(zlascl,ZLASCL)
       #define LAPACK_slaset   LAPACK_GLOBAL(slaset,SLASET)
       #define LAPACK_dlaset   LAPACK_GLOBAL(dlaset,DLASET)
       #define LAPACK_claset   LAPACK_GLOBAL(claset,CLASET)
       #define LAPACK_zlaset   LAPACK_GLOBAL(zlaset,ZLASET)
       #define LAPACK_slasrt   LAPACK_GLOBAL(slasrt,SLASRT)
       #define LAPACK_dlasrt   LAPACK_GLOBAL(dlasrt,DLASRT)
       #define LAPACK_slagsy   LAPACK_GLOBAL(slagsy,SLAGSY)
       #define LAPACK_dlagsy   LAPACK_GLOBAL(dlagsy,DLAGSY)
       #define LAPACK_clagsy   LAPACK_GLOBAL(clagsy,CLAGSY)
       #define LAPACK_zlagsy   LAPACK_GLOBAL(zlagsy,ZLAGSY)
       #define LAPACK_claghe   LAPACK_GLOBAL(claghe,CLAGHE)
       #define LAPACK_zlaghe   LAPACK_GLOBAL(zlaghe,ZLAGHE)

squad goals: slauum/dlauum/clauum/zlauum all in a row, and then claghe/zlaghe showing up as the only two in their set — iconic, no notes. 👑

🧚 permutations & the geometry girlies

       #define LAPACK_slapmr   LAPACK_GLOBAL(slapmr,SLAPMR)
       #define LAPACK_dlapmr   LAPACK_GLOBAL(dlapmr,DLAPMR)
       #define LAPACK_clapmr   LAPACK_GLOBAL(clapmr,CLAPMR)
       #define LAPACK_zlapmr   LAPACK_GLOBAL(zlapmr,ZLAPMR)
       #define LAPACK_slapmt   LAPACK_GLOBAL(slapmt,SLAPMT)
       #define LAPACK_dlapmt   LAPACK_GLOBAL(dlapmt,DLAPMT)
       #define LAPACK_clapmt   LAPACK_GLOBAL(clapmt,CLAPMT)
       #define LAPACK_zlapmt   LAPACK_GLOBAL(zlapmt,ZLAPMT)
       #define LAPACK_slapy2   LAPACK_GLOBAL(slapy2,SLAPY2)
       #define LAPACK_dlapy2   LAPACK_GLOBAL(dlapy2,DLAPY2)
       #define LAPACK_slapy3   LAPACK_GLOBAL(slapy3,SLAPY3)
       #define LAPACK_dlapy3   LAPACK_GLOBAL(dlapy3,DLAPY3)
       #define LAPACK_slartgp   LAPACK_GLOBAL(slartgp,SLARTGP)
       #define LAPACK_dlartgp   LAPACK_GLOBAL(dlartgp,DLARTGP)
       #define LAPACK_slartgs   LAPACK_GLOBAL(slartgs,SLARTGS)
       #define LAPACK_dlartgs   LAPACK_GLOBAL(dlartgs,DLARTGS)

lapmr vs lapmt — one letter apart, both real, don't typo them or it's over for you 💀 and yes, lapy2/lapy3 skip straight past lapy1, we don't talk about it 🙈

🎀 the decomposition / bidiagonal cuties

       #define LAPACK_cbbcsd   LAPACK_GLOBAL(cbbcsd,CBBCSD)
       #define LAPACK_cheswapr   LAPACK_GLOBAL(cheswapr,CHESWAPR)
       #define LAPACK_chetri2   LAPACK_GLOBAL(chetri2,CHETRI2)
       #define LAPACK_chetri2x   LAPACK_GLOBAL(chetri2x,CHETRI2X)
       #define LAPACK_chetrs2   LAPACK_GLOBAL(chetrs2,CHETRS2)
       #define LAPACK_csyconv   LAPACK_GLOBAL(csyconv,CSYCONV)
       #define LAPACK_csyswapr   LAPACK_GLOBAL(csyswapr,CSYSWAPR)
       #define LAPACK_csytri2   LAPACK_GLOBAL(csytri2,CSYTRI2)
       #define LAPACK_csytri2x   LAPACK_GLOBAL(csytri2x,CSYTRI2X)
       #define LAPACK_csytrs2   LAPACK_GLOBAL(csytrs2,CSYTRS2)
       #define LAPACK_cunbdb   LAPACK_GLOBAL(cunbdb,CUNBDB)
       #define LAPACK_cuncsd   LAPACK_GLOBAL(cuncsd,CUNCSD)
       #define LAPACK_cuncsd2by1   LAPACK_GLOBAL(cuncsd2by1,CUNCSD2BY1)
       #define LAPACK_dbbcsd   LAPACK_GLOBAL(dbbcsd,DBBCSD)
       #define LAPACK_dorbdb   LAPACK_GLOBAL(dorbdb,DORBDB)
       #define LAPACK_dorcsd   LAPACK_GLOBAL(dorcsd,DORCSD)
       #define LAPACK_dorcsd2by1   LAPACK_GLOBAL(dorcsd2by1,DORCSD2BY1)
       #define LAPACK_dsyconv   LAPACK_GLOBAL(dsyconv,DSYCONV)
       #define LAPACK_dsyswapr   LAPACK_GLOBAL(dsyswapr,DSYSWAPR)
       #define LAPACK_dsytri2   LAPACK_GLOBAL(dsytri2,DSYTRI2)
       #define LAPACK_dsytri2x   LAPACK_GLOBAL(dsytri2x,DSYTRI2X)
       #define LAPACK_dsytrs2   LAPACK_GLOBAL(dsytrs2,DSYTRS2)
       #define LAPACK_sbbcsd   LAPACK_GLOBAL(sbbcsd,SBBCSD)
       #define LAPACK_sorbdb   LAPACK_GLOBAL(sorbdb,SORBDB)
       #define LAPACK_sorcsd   LAPACK_GLOBAL(sorcsd,SORCSD)
       #define LAPACK_sorcsd2by1   LAPACK_GLOBAL(sorcsd2by1,SORCSD2BY1)
       #define LAPACK_ssyconv   LAPACK_GLOBAL(ssyconv,SSYCONV)
       #define LAPACK_ssyswapr   LAPACK_GLOBAL(ssyswapr,SSYSWAPR)
       #define LAPACK_ssytri2   LAPACK_GLOBAL(ssytri2,SSYTRI2)
       #define LAPACK_ssytri2x   LAPACK_GLOBAL(ssytri2x,SSYTRI2X)
       #define LAPACK_ssytrs2   LAPACK_GLOBAL(ssytrs2,SSYTRS2)
       #define LAPACK_zbbcsd   LAPACK_GLOBAL(zbbcsd,ZBBCSD)
       #define LAPACK_zheswapr   LAPACK_GLOBAL(zheswapr,ZHESWAPR)
       #define LAPACK_zhetri2   LAPACK_GLOBAL(zhetri2,ZHETRI2)
       #define LAPACK_zhetri2x   LAPACK_GLOBAL(zhetri2x,ZHETRI2X)
       #define LAPACK_zhetrs2   LAPACK_GLOBAL(zhetrs2,ZHETRS2)
       #define LAPACK_zsyconv   LAPACK_GLOBAL(zsyconv,ZSYCONV)
       #define LAPACK_zsyswapr   LAPACK_GLOBAL(zsyswapr,ZSYSWAPR)
       #define LAPACK_zsytri2   LAPACK_GLOBAL(zsytri2,ZSYTRI2)
       #define LAPACK_zsytri2x   LAPACK_GLOBAL(zsytri2x,ZSYTRI2X)
       #define LAPACK_zsytrs2   LAPACK_GLOBAL(zsytrs2,ZSYTRS2)
       #define LAPACK_zunbdb   LAPACK_GLOBAL(zunbdb,ZUNBDB)
       #define LAPACK_zuncsd   LAPACK_GLOBAL(zuncsd,ZUNCSD)
       #define LAPACK_zuncsd2by1   LAPACK_GLOBAL(zuncsd2by1,ZUNCSD2BY1)

the tri2 / tri2x / trs2 triplets appearing for every prefix is honestly so satisfying to scroll past 🌈 and note that unbdb, uncsd, uncsd2by1 only exist on the complex side here (c and z) while orbdb, orcsd, orcsd2by1 are the real ones — that's exactly how they're listed, don't come for me. 🦋

💜 the QR / triangular-factorisation glow-up

       #define LAPACK_sgemqrt   LAPACK_GLOBAL(sgemqrt,SGEMQRT)
       #define LAPACK_dgemqrt   LAPACK_GLOBAL(dgemqrt,DGEMQRT)
       #define LAPACK_cgemqrt   LAPACK_GLOBAL(cgemqrt,CGEMQRT)
       #define LAPACK_zgemqrt   LAPACK_GLOBAL(zgemqrt,ZGEMQRT)
       #define LAPACK_sgeqrt   LAPACK_GLOBAL(sgeqrt,SGEQRT)
       #define LAPACK_dgeqrt   LAPACK_GLOBAL(dgeqrt,DGEQRT)
       #define LAPACK_cgeqrt   LAPACK_GLOBAL(cgeqrt,CGEQRT)
       #define LAPACK_zgeqrt   LAPACK_GLOBAL(zgeqrt,ZGEQRT)
       #define LAPACK_sgeqrt2   LAPACK_GLOBAL(sgeqrt2,SGEQRT2)
       #define LAPACK_dgeqrt2   LAPACK_GLOBAL(dgeqrt2,DGEQRT2)
       #define LAPACK_cgeqrt2   LAPACK_GLOBAL(cgeqrt2,CGEQRT2)
       #define LAPACK_zgeqrt2   LAPACK_GLOBAL(zgeqrt2,ZGEQRT2)
       #define LAPACK_sgeqrt3   LAPACK_GLOBAL(sgeqrt3,SGEQRT3)
       #define LAPACK_dgeqrt3   LAPACK_GLOBAL(dgeqrt3,DGEQRT3)
       #define LAPACK_cgeqrt3   LAPACK_GLOBAL(cgeqrt3,CGEQRT3)
       #define LAPACK_zgeqrt3   LAPACK_GLOBAL(zgeqrt3,ZGEQRT3)
       #define LAPACK_stpmqrt   LAPACK_GLOBAL(stpmqrt,STPMQRT)
       #define LAPACK_dtpmqrt   LAPACK_GLOBAL(dtpmqrt,DTPMQRT)
       #define LAPACK_ctpmqrt   LAPACK_GLOBAL(ctpmqrt,CTPMQRT)
       #define LAPACK_ztpmqrt   LAPACK_GLOBAL(ztpmqrt,ZTPMQRT)
       #define LAPACK_stpqrt   LAPACK_GLOBAL(stpqrt,STPQRT)
       #define LAPACK_dtpqrt   LAPACK_GLOBAL(dtpqrt,DTPQRT)
       #define LAPACK_ctpqrt   LAPACK_GLOBAL(ctpqrt,CTPQRT)
       #define LAPACK_ztpqrt   LAPACK_GLOBAL(ztpqrt,ZTPQRT)
       #define LAPACK_stpqrt2   LAPACK_GLOBAL(stpqrt2,STPQRT2)
       #define LAPACK_dtpqrt2   LAPACK_GLOBAL(dtpqrt2,DTPQRT2)
       #define LAPACK_ctpqrt2   LAPACK_GLOBAL(ctpqrt2,CTPQRT2)
       #define LAPACK_ztpqrt2   LAPACK_GLOBAL(ztpqrt2,ZTPQRT2)
       #define LAPACK_stprfb   LAPACK_GLOBAL(stprfb,STPRFB)
       #define LAPACK_dtprfb   LAPACK_GLOBAL(dtprfb,DTPRFB)
       #define LAPACK_ctprfb   LAPACK_GLOBAL(ctprfb,CTPRFB)
       #define LAPACK_ztprfb   LAPACK_GLOBAL(ztprfb,ZTPRFB)

gemqrt → geqrt → geqrt2 → geqrt3 is such a little family tree and i'm obsessed with it 🍓 also pls clock that tpmqrt has the m and tpqrt doesn't — that single letter is doing so much heavy lifting, do not let it slide. 💀

⭐ the rook / aa era + the version-check queen

       #define LAPACK_ssysv_rook   LAPACK_GLOBAL(ssysv_rook,SSYSV_ROOK)
       #define LAPACK_dsysv_rook   LAPACK_GLOBAL(dsysv_rook,DSYSV_ROOK)
       #define LAPACK_csysv_rook   LAPACK_GLOBAL(csysv_rook,CSYSV_ROOK)
       #define LAPACK_zsysv_rook   LAPACK_GLOBAL(zsysv_rook,ZSYSV_ROOK)
       #define LAPACK_csyr   LAPACK_GLOBAL(csyr,CSYR)
       #define LAPACK_zsyr   LAPACK_GLOBAL(zsyr,ZSYR)
       #define LAPACK_ilaver   LAPACK_GLOBAL(ilaver,ILAVER)
       #define LAPACK_sggsvd3   LAPACK_GLOBAL(sggsvd3,SGGSVD3)
       #define LAPACK_dggsvd3   LAPACK_GLOBAL(dggsvd3,DGGSVD3)
       #define LAPACK_cggsvd3   LAPACK_GLOBAL(cggsvd3,CGGSVD3)
       #define LAPACK_zggsvd3   LAPACK_GLOBAL(zggsvd3,ZGGSVD3)
       #define LAPACK_ssysv_aa   LAPACK_GLOBAL(ssysv_aa,SSYSV_AA)
       #define LAPACK_dsysv_aa   LAPACK_GLOBAL(dsysv_aa,DSYSV_AA)
       #define LAPACK_chesv_aa   LAPACK_GLOBAL(chesv_aa,CHESV_AA)
       #define LAPACK_zsysv_aa   LAPACK_GLOBAL(zsysv_aa,ZSYSV_AA)
       #define LAPACK_csysv_aa   LAPACK_GLOBAL(csysv_aa,CSYSV_AA)
       #define LAPACK_zhesv_aa   LAPACK_GLOBAL(zhesv_aa,ZHESV_AA)
       #define LAPACK_ssytrs_aa   LAPACK_GLOBAL(ssytrs_aa,SSYTRS_AA)
       #define LAPACK_dsytrs_aa   LAPACK_GLOBAL(dsytrs_aa,DSYTRS_AA)
       #define LAPACK_csytrs_aa   LAPACK_GLOBAL(csytrs_aa,CSYTRS_AA)
       #define LAPACK_zsytrs_aa   LAPACK_GLOBAL(zsytrs_aa,ZSYTRS_AA)
       #define LAPACK_chetrs_aa   LAPACK_GLOBAL(chetrs_aa,CHETRS_AA)
       #define LAPACK_zhetrs_aa   LAPACK_GLOBAL(zhetrs_aa,ZHETRS_AA)
       #define LAPACK_ssytrf_aa   LAPACK_GLOBAL(ssytrf_aa,SSYTRF_AA)
       #define LAPACK_dsytrf_aa   LAPACK_GLOBAL(dsytrf_aa,DSYTRF_AA)
       #define LAPACK_csytrf_aa   LAPACK_GLOBAL(csytrf_aa,CSYTRF_AA)
       #define LAPACK_zsytrf_aa   LAPACK_GLOBAL(zsytrf_aa,ZSYTRF_AA)
bestie pls notice: those _rook and _aa names are the only ones in this whole chunk with an underscore in the lowercase name, and the uppercase side keeps it too — SSYSV_ROOK, SSYTRF_AA. so it's LAPACK_GLOBAL(ssytrf_aa,SSYTRF_AA) exactly, not a typo, don't "fix" it. 🫶

and ilaver just vibing there in the middle with no friends, checking versions like the main character it is. 👑

Okay bestie, buckle up, because the #define section is still going 💅 — this is the part where LAPACK starts feeling like it's just flexing. Slay, honestly.


First up, the _aa hermitian crew (two of them, living their best life):

       #define LAPACK_chetrf_aa   LAPACK_GLOBAL(chetrf_aa,CHETRF_AA)
       #define LAPACK_zhetrf_aa   LAPACK_GLOBAL(zhetrf_aa,ZHETRF_AA)

Then suddenly we're in _rk territory — that's the symmetric-and-hermitian factorization/solve/inverse/condition-estimate era. Watch the ordering here, because it is not alphabetical and it is not symmetric, and that's just how the header is, no cap:

       #define LAPACK_ssysv_rk   LAPACK_GLOBAL(ssysv_rk,SSYSV_RK)
       #define LAPACK_dsysv_rk   LAPACK_GLOBAL(dsysv_rk,DSYSV_RK)
       #define LAPACK_chesv_rk   LAPACK_GLOBAL(chesv_rk,CHESV_RK)
       #define LAPACK_zsysv_rk   LAPACK_GLOBAL(zsysv_rk,ZSYSV_RK)
       #define LAPACK_csysv_rk   LAPACK_GLOBAL(csysv_rk,CSYSV_RK)
       #define LAPACK_zhesv_rk   LAPACK_GLOBAL(zhesv_rk,ZHESV_RK)
       #define LAPACK_ssytrf_rk   LAPACK_GLOBAL(ssytrf_rk,SSYTRF_RK)
       #define LAPACK_dsytrf_rk   LAPACK_GLOBAL(dsytrf_rk,DSYTRF_RK)
       #define LAPACK_csytrf_rk   LAPACK_GLOBAL(csytrf_rk,CSYTRF_RK)
       #define LAPACK_zsytrf_rk   LAPACK_GLOBAL(zsytrf_rk,ZSYTRF_RK)
       #define LAPACK_chetrf_rk   LAPACK_GLOBAL(chetrf_rk,CHETRF_RK)
       #define LAPACK_zhetrf_rk   LAPACK_GLOBAL(zhetrf_rk,ZHETRF_RK)

Notice how ssysv_rk, dsysv_rk, chesv_rk, zsysv_rk, csysv_rk and zhesv_rk roll out in exactly that sequence — yes, chesv before zsysv, and yes, zsysv before csysv. Someone was living their truth when they wrote this file and honestly? Respect. 🫶


Now the _3 era — same factorization energy but with the 3 suffix, which shows up on sytrs, hetrs, sytri, hetri, sycon and hecon:

       #define LAPACK_ssytrs_3   LAPACK_GLOBAL(ssytrs_3,SSYTRS_3)
       #define LAPACK_dsytrs_3   LAPACK_GLOBAL(dsytrs_3,DSYTRS_3)
       #define LAPACK_csytrs_3   LAPACK_GLOBAL(csytrs_3,CSYTRS_3)
       #define LAPACK_zsytrs_3   LAPACK_GLOBAL(zsytrs_3,ZSYTRS_3)
       #define LAPACK_chetrs_3   LAPACK_GLOBAL(chetrs_3,CHETRS_3)
       #define LAPACK_zhetrs_3   LAPACK_GLOBAL(zhetrs_3,ZHETRS_3)
       #define LAPACK_ssytri_3   LAPACK_GLOBAL(ssytri_3,SSYTRI_3)
       #define LAPACK_dsytri_3   LAPACK_GLOBAL(dsytri_3,DSYTRI_3)
       #define LAPACK_csytri_3   LAPACK_GLOBAL(csytri_3,CSYTRI_3)
       #define LAPACK_zsytri_3   LAPACK_GLOBAL(zsytri_3,ZSYTRI_3)
       #define LAPACK_chetri_3   LAPACK_GLOBAL(chetri_3,CHETRI_3)
       #define LAPACK_zhetri_3   LAPACK_GLOBAL(zhetri_3,ZHETRI_3)
       #define LAPACK_ssycon_3   LAPACK_GLOBAL(ssycon_3,SSYCON_3)
       #define LAPACK_dsycon_3   LAPACK_GLOBAL(dsycon_3,DSYCON_3)
       #define LAPACK_csycon_3   LAPACK_GLOBAL(csycon_3,CSYCON_3)
       #define LAPACK_zsycon_3   LAPACK_GLOBAL(zsycon_3,ZSYCON_3)
       #define LAPACK_checon_3   LAPACK_GLOBAL(checon_3,CHECON_3)
       #define LAPACK_zhecon_3   LAPACK_GLOBAL(zhecon_3,ZHECON_3)

That's the full _3 set — ten _3 solves/inverses and six _3 condition estimators. Eighteen lines, zero skips, we do not abandon our children. 🧚


Then the LQ and QR glow-up, plus their multiply friends, plus getsls:

       #define LAPACK_sgelq   LAPACK_GLOBAL(sgelq,SGELQ)
       #define LAPACK_dgelq   LAPACK_GLOBAL(dgelq,DGELQ)
       #define LAPACK_cgelq   LAPACK_GLOBAL(cgelq,CGELQ)
       #define LAPACK_zgelq   LAPACK_GLOBAL(zgelq,ZGELQ)
       #define LAPACK_sgemlq   LAPACK_GLOBAL(sgemlq,SGEMLQ)
       #define LAPACK_dgemlq   LAPACK_GLOBAL(dgemlq,DGEMLQ)
       #define LAPACK_cgemlq   LAPACK_GLOBAL(cgemlq,CGEMLQ)
       #define LAPACK_zgemlq   LAPACK_GLOBAL(zgemlq,ZGEMLQ)
       #define LAPACK_sgeqr   LAPACK_GLOBAL(sgeqr,SGEQR)
       #define LAPACK_dgeqr   LAPACK_GLOBAL(dgeqr,DGEQR)
       #define LAPACK_cgeqr   LAPACK_GLOBAL(cgeqr,CGEQR)
       #define LAPACK_zgeqr   LAPACK_GLOBAL(zgeqr,ZGEQR)
       #define LAPACK_sgemqr   LAPACK_GLOBAL(sgemqr,SGEMQR)
       #define LAPACK_dgemqr   LAPACK_GLOBAL(dgemqr,DGEMQR)
       #define LAPACK_cgemqr   LAPACK_GLOBAL(cgemqr,CGEMQR)
       #define LAPACK_zgemqr   LAPACK_GLOBAL(zgemqr,ZGEMQR)
       #define LAPACK_sgetsls   LAPACK_GLOBAL(sgetsls,SGETSLS)
       #define LAPACK_dgetsls   LAPACK_GLOBAL(dgetsls,DGETSLS)
       #define LAPACK_cgetsls   LAPACK_GLOBAL(cgetsls,CGETSLS)
       #define LAPACK_zgetsls   LAPACK_GLOBAL(zgetsls,ZGETSLS)

Four precisions each: s, d, c, z, always in that order. That's the whole pattern — gelq, gemlq, geqr, gemqr, getsls. Iconic, consistent, we love to see it. ⭐


And now, the main character: the _aa_2stage block 💀. These are the ones that are too long to fit on one line, so each #define takes a little nap and continues on the next line. Keep the line breaks exactly — this is a preprocessor continuation situation and you do not want to be the girlie who smooshed them together:

       #define LAPACK_ssysv_aa_2stage
           LAPACK_GLOBAL(ssysv_aa_2stage,SSYSV_AA_2STAGE)
       #define LAPACK_dsysv_aa_2stage
           LAPACK_GLOBAL(dsysv_aa_2stage,DSYSV_AA_2STAGE)
       #define LAPACK_chesv_aa_2stage
           LAPACK_GLOBAL(chesv_aa_2stage,CHESV_AA_2STAGE)
       #define LAPACK_zsysv_aa_2stage
           LAPACK_GLOBAL(zsysv_aa_2stage,ZSYSV_AA_2STAGE)
       #define LAPACK_csysv_aa_2stage
           LAPACK_GLOBAL(csysv_aa_2stage,CSYSV_AA_2STAGE)
       #define LAPACK_zhesv_aa_2stage
           LAPACK_GLOBAL(zhesv_aa_2stage,ZHESV_AA_2STAGE)
       #define LAPACK_ssytrs_aa_2stage
           LAPACK_GLOBAL(ssytrs_aa_2stage,SSYTRS_AA_2STAGE)
       #define LAPACK_dsytrs_aa_2stage
           LAPACK_GLOBAL(dsytrs_aa_2stage,DSYTRS_AA_2STAGE)
       #define LAPACK_csytrs_aa_2stage
           LAPACK_GLOBAL(csytrs_aa_2stage,CSYTRS_AA_2STAGE)
       #define LAPACK_zsytrs_aa_2stage
           LAPACK_GLOBAL(zsytrs_aa_2stage,ZSYTRS_AA_2STAGE)
       #define LAPACK_chetrs_aa_2stage
           LAPACK_GLOBAL(chetrs_aa_2stage,CHETRS_AA_2STAGE)
       #define LAPACK_zhetrs_aa_2stage
           LAPACK_GLOBAL(zhetrs_aa_2stage,ZHETRS_AA_2STAGE)
       #define LAPACK_ssytrf_aa_2stage
           LAPACK_GLOBAL(ssytrf_aa_2stage,SSYTRF_AA_2STAGE)
       #define LAPACK_dsytrf_aa_2stage
           LAPACK_GLOBAL(dsytrf_aa_2stage,DSYTRF_AA_2STAGE)
       #define LAPACK_csytrf_aa_2stage
           LAPACK_GLOBAL(csytrf_aa_2stage,CSYTRF_AA_2STAGE)
       #define LAPACK_zsytrf_aa_2stage
           LAPACK_GLOBAL(zsytrf_aa_2stage,ZSYTRF_AA_2STAGE)
       #define LAPACK_chetrf_aa_2stage
           LAPACK_GLOBAL(chetrf_aa_2stage,CHETRF_AA_2STAGE)
       #define LAPACK_zhetrf_aa_2stage
           LAPACK_GLOBAL(zhetrf_aa_2stage,ZHETRF_AA_2STAGE)

Eighteen of them, each one split across two lines like it's texting in two messages because the thought was too big for one 🎀.

And the vibe check, because the ordering is doing the most: <hotpink>ssysv</hotpink>, <hotpink>dsysv</hotpink>, <hotpink>chesv</hotpink>, <hotpink>zsysv</hotpink>, <hotpink>csysv</hotpink>, <hotpink>zhesv</hotpink> for the solves, then sytrs/hetrs, then sytrf/hetrf. Same shape as the _rk block up above — literally the same energy, just with _aa_2stage bolted on the end. Consistency is a love language. 💜


Typedefs

OK now the Typedefs subsection, and listen — these are function pointer typedefs, which means they're types for callbacks. Every single one returns lapack_logical and takes only const pointers. That's it, that's the whole squad:

       typedef lapack_logical(* LAPACK_S_SELECT2) (const float *, const float
           *)
       typedef lapack_logical(* LAPACK_S_SELECT3) (const float *, const float
           *, const float *)
       typedef lapack_logical(* LAPACK_D_SELECT2) (const double *, const double
           *)
       typedef lapack_logical(* LAPACK_D_SELECT3) (const double *, const double
           *, const double *)
       typedef lapack_logical(* LAPACK_C_SELECT1) (const lapack_complex_float
           *)
       typedef lapack_logical(* LAPACK_C_SELECT2) (const lapack_complex_float
           *, const lapack_complex_float *)
       typedef lapack_logical(* LAPACK_Z_SELECT1) (const lapack_complex_double
           *)
       typedef lapack_logical(* LAPACK_Z_SELECT2) (const lapack_complex_double
           *, const lapack_complex_double *)

Let me break that down so it's giving clarity and not just mystery 🦋:

  • LAPACK_S_SELECT2 — a pointer to a function taking two const float * and returning lapack_logical.
  • LAPACK_S_SELECT3 — same deal but three const float *.
  • LAPACK_D_SELECT2 — two const double *, returns lapack_logical.
  • LAPACK_D_SELECT3 — three const double *, returns lapack_logical.
  • LAPACK_C_SELECT1 — one const lapack_complex_float *, returns lapack_logical.
  • LAPACK_C_SELECT2 — two const lapack_complex_float *, returns lapack_logical.
  • LAPACK_Z_SELECT1 — one const lapack_complex_double *, returns lapack_logical.
  • LAPACK_Z_SELECT2 — two const lapack_complex_double *, returns lapack_logical.

So the naming pattern is precision letter + _SELECT + how many arguments. S and D go up to 3, C and Z only go to 2 — and C and Z each get a SELECT1 while S and D do not. That's not me editorialising, that's literally the list — eight typedefs, no more, no less. 🙈

Heads up bestie: if you're copying these into anything, keep the const and the * glued to the right types exactly as shown — const float * is not the same vibe as float *, and the compiler will absolutely notice. 😭

🎀 Functions 🎀

okay bestie, deep breath 💖 this is the big roster — the actual prototypes, in the order they live in the header. Every single one of the LAPACKE_* entries returns a lapack_int, and basically all of them kick off with int matrix_layout as the very first thing. Watch for the exceptions, they're cute 🫶

the three helpers up top 🌸

lapack_complex_float lapack_make_complex_float (float re, float im)
lapack_complex_double lapack_make_complex_double (double re, double im)
lapack_logical LAPACK_lsame (char *ca, char *cb, lapack_int lca,
    lapack_int lcb)
  • lapack_make_complex_float — takes float re, float im and hands you back a lapack_complex_float 🦋
  • lapack_make_complex_double — same energy, double re, double im in, lapack_complex_double out ✨
  • LAPACK_lsame — returns a lapack_logical, takes char *ca, char *cb, plus the lengths lca and lcb 💅

these three are the only non-lapack_int returns in this whole stretch, so like… treasure them 😭


bdsdc — only the real ones 🍓

lapack_int LAPACKE_sbdsdc (int matrix_layout, char uplo, char compq,
    lapack_int n, float *d, float *e, float *u, lapack_int ldu, float
    *vt, lapack_int ldvt, float *q, lapack_int *iq)
lapack_int LAPACKE_dbdsdc (int matrix_layout, char uplo, char compq,
    lapack_int n, double *d, double *e, double *u, lapack_int ldu,
    double *vt, lapack_int ldvt, double *q, lapack_int *iq)

only two flavors here — s and d, no complex in sight. note iq is a lapack_int * while q is a real pointer, don't mix them up bestie 🙈

bdsqr — all four precisions ate 💅

lapack_int LAPACKE_sbdsqr (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, float *d, float *e,
    float *vt, lapack_int ldvt, float *u, lapack_int ldu, float *c,
    lapack_int ldc)
lapack_int LAPACKE_dbdsqr (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, double *d, double
    *e, double *vt, lapack_int ldvt, double *u, lapack_int ldu, double
    *c, lapack_int ldc)
lapack_int LAPACKE_cbdsqr (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, float *d, float *e,
    lapack_complex_float *vt, lapack_int ldvt, lapack_complex_float *u,
    lapack_int ldu, lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zbdsqr (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, double *d, double
    *e, lapack_complex_double *vt, lapack_int ldvt,
    lapack_complex_double *u, lapack_int ldu, lapack_complex_double *c,
    lapack_int ldc)

the way all four line up parameter-for-parameter is so satisfying ngl 🧚 and yes — even in the c and z versions, d and e stay plain float/double. that's not a typo, that's the signature, don't @ me 💀

bdsvdx — the range-y one 👑

lapack_int LAPACKE_sbdsvdx (int matrix_layout, char uplo, char jobz,
    char range, lapack_int n, float *d, float *e, float vl, float vu,
    lapack_int il, lapack_int iu, lapack_int *ns, float *s, float *z,
    lapack_int ldz, lapack_int *superb)
lapack_int LAPACKE_dbdsvdx (int matrix_layout, char uplo, char jobz,
    char range, lapack_int n, double *d, double *e, double vl, double
    vu, lapack_int il, lapack_int iu, lapack_int *ns, double *s, double
    *z, lapack_int ldz, lapack_int *superb)

sixteen params each 🔥 note that vl and vu are passed by value (float vl, float vu / double vl, double vu) while il and iu are lapack_int by value too — the pointers are only d, e, ns, s, z, and superb. and bestie, the last param is literally called superb, main character naming fr fr 🌈

disna — the rebel without matrix_layout 🎀

lapack_int LAPACKE_sdisna (char job, lapack_int m, lapack_int n, const
    float *d, float *sep)
lapack_int LAPACKE_ddisna (char job, lapack_int m, lapack_int n, const
    double *d, double *sep)

okay the way these two just skip matrix_layout entirely and open with char job?? iconique 💅 also clock the const on *d — it's a read-only vibe, *sep is where the output goes ✨

gbbrd — all four, stacked 🦋

lapack_int LAPACKE_sgbbrd (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku, float
    *ab, lapack_int ldab, float *d, float *e, float *q, lapack_int ldq,
    float *pt, lapack_int ldpt, float *c, lapack_int ldc)
lapack_int LAPACKE_dgbbrd (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku, double
    *ab, lapack_int ldab, double *d, double *e, double *q, lapack_int
    ldq, double *pt, lapack_int ldpt, double *c, lapack_int ldc)
lapack_int LAPACKE_cgbbrd (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku,
    lapack_complex_float *ab, lapack_int ldab, float *d, float *e,
    lapack_complex_float *q, lapack_int ldq, lapack_complex_float *pt,
    lapack_int ldpt, lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zgbbrd (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku,
    lapack_complex_double *ab, lapack_int ldab, double *d, double *e,
    lapack_complex_double *q, lapack_int ldq, lapack_complex_double *pt,
    lapack_int ldpt, lapack_complex_double *c, lapack_int ldc)

seventeen params each, and the c/z versions keep d and e real while everything else goes complex. the way the leading dimensions (ldab, ldq, ldpt, ldc) trail their arrays like little ducklings 😭🫶

gbcon — the const era begins 🌸

lapack_int LAPACKE_sgbcon (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const float *ab, lapack_int ldab,
    const lapack_int *ipiv, float anorm, float *rcond)
lapack_int LAPACKE_dgbcon (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const double *ab, lapack_int ldab,
    const lapack_int *ipiv, double anorm, double *rcond)
lapack_int LAPACKE_cgbcon (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const lapack_complex_float *ab,
    lapack_int ldab, const lapack_int *ipiv, float anorm, float *rcond)
lapack_int LAPACKE_zgbcon (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const lapack_complex_double *ab,
    lapack_int ldab, const lapack_int *ipiv, double anorm, double
    *rcond)

both ab and ipiv are const here (they're inputs, periodt ✨), anorm comes in by value, and rcond is the lone non-const pointer — that's the output, bestie 💖

gbequ 🍓

lapack_int LAPACKE_sgbequ (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const float *ab, lapack_int ldab,
    float *r, float *c, float *rowcnd, float *colcnd, float *amax)
lapack_int LAPACKE_dgbequ (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const double *ab, lapack_int ldab,
    double *r, double *c, double *rowcnd, double *colcnd, double *amax)
lapack_int LAPACKE_cgbequ (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const lapack_complex_float *ab,
    lapack_int ldab, float *r, float *c, float *rowcnd, float *colcnd,
    float *amax)
lapack_int LAPACKE_zgbequ (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const lapack_complex_double *ab,
    lapack_int ldab, double *r, double *c, double *rowcnd, double
    *colcnd, double *amax)

only ab is const; r, c, rowcnd, colcnd, and amax are all writable pointers. in the complex versions r, c, rowcnd, colcnd, and amax stay real 🌈

gbequb — same fit, different suffix 💜

lapack_int LAPACKE_sgbequb (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const float *ab, lapack_int ldab,
    float *r, float *c, float *rowcnd, float *colcnd, float *amax)
lapack_int LAPACKE_dgbequb (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const double *ab, lapack_int ldab,
    double *r, double *c, double *rowcnd, double *colcnd, double *amax)
lapack_int LAPACKE_cgbequb (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const lapack_complex_float *ab,
    lapack_int ldab, float *r, float *c, float *rowcnd, float *colcnd,
    float *amax)
lapack_int LAPACKE_zgbequb (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const lapack_complex_double *ab,
    lapack_int ldab, double *r, double *c, double *rowcnd, double
    *colcnd, double *amax)

identical shape to gbequ, just with the b on the end. if you can call one you can call the other, no cap 🧚

gbrfs 🔥

lapack_int LAPACKE_sgbrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const float *ab,
    lapack_int ldab, const float *afb, lapack_int ldafb, const
    lapack_int *ipiv, const float *b, lapack_int ldb, float *x,
    lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_dgbrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const double *ab,
    lapack_int ldab, const double *afb, lapack_int ldafb, const
    lapack_int *ipiv, const double *b, lapack_int ldb, double *x,
    lapack_int ldx, double *ferr, double *berr)
lapack_int LAPACKE_cgbrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_float *ab, lapack_int ldab, const
    lapack_complex_float *afb, lapack_int ldafb, const lapack_int *ipiv,
    const lapack_complex_float *b, lapack_int ldb, lapack_complex_float
    *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_zgbrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_double *ab, lapack_int ldab, const
    lapack_complex_double *afb, lapack_int ldafb, const lapack_int
    *ipiv, const lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *x, lapack_int ldx, double *ferr, double
    *berr)

count the consts bestie — ab, afb, ipiv, and b are all read-only, while x, ferr, berr are yours to write. ferr and berr stay real in the complex versions too 💅

gbrfsx — the twenty-five-param monster 👑

lapack_int LAPACKE_sgbrfsx (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
    float *ab, lapack_int ldab, const float *afb, lapack_int ldafb,
    const lapack_int *ipiv, const float *r, const float *c, const float
    *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond, float
    *berr, lapack_int n_err_bnds, float *err_bnds_norm, float
    *err_bnds_comp, lapack_int nparams, float *params)
lapack_int LAPACKE_dgbrfsx (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
    double *ab, lapack_int ldab, const double *afb, lapack_int ldafb,
    const lapack_int *ipiv, const double *r, const double *c, const
    double *b, lapack_int ldb, double *x, lapack_int ldx, double *rcond,
    double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double
    *err_bnds_comp, lapack_int nparams, double *params)
lapack_int LAPACKE_cgbrfsx (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_float *ab, lapack_int ldab, const
    lapack_complex_float *afb, lapack_int ldafb, const lapack_int *ipiv,
    const float *r, const float *c, const lapack_complex_float *b,
    lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float
    *rcond, float *berr, lapack_int n_err_bnds, float *err_bnds_norm,
    float *err_bnds_comp, lapack_int nparams, float *params)
lapack_int LAPACKE_zgbrfsx (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_double *ab, lapack_int ldab, const
    lapack_complex_double *afb, lapack_int ldafb, const lapack_int
    *ipiv, const double *r, const double *c, const lapack_complex_double
    *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double
    *rcond, double *berr, lapack_int n_err_bnds, double *err_bnds_norm,
    double *err_bnds_comp, lapack_int nparams, double *params)

twenty-five parameters. twenty-five!! 😭 and the extra ones compared to plain gbrfs: char equed, const float *r, const float *c, float *rcond, lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float *params. two separate error-bound arrays, bestie — err_bnds_norm and err_bnds_comp — don't forget either of them 🙈

gbsv — the tidy four 💖

lapack_int LAPACKE_sgbsv (int matrix_layout, lapack_int n, lapack_int
    kl, lapack_int ku, lapack_int nrhs, float *ab, lapack_int ldab,
    lapack_int *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_dgbsv (int matrix_layout, lapack_int n, lapack_int
    kl, lapack_int ku, lapack_int nrhs, double *ab, lapack_int ldab,
    lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_cgbsv (int matrix_layout, lapack_int n, lapack_int
    kl, lapack_int ku, lapack_int nrhs, lapack_complex_float *ab,
    lapack_int ldab, lapack_int *ipiv, lapack_complex_float *b,
    lapack_int ldb)
lapack_int LAPACKE_zgbsv (int matrix_layout, lapack_int n, lapack_int
    kl, lapack_int ku, lapack_int nrhs, lapack_complex_double *ab,
    lapack_int ldab, lapack_int *ipiv, lapack_complex_double *b,
    lapack_int ldb)

look at that — no const anywhere, so ab, ipiv, and b are all fair game to be written into 🦋 short and sweet, ten params, we love a low-maintenance icon ✨

gbsvx — the big finale, s flavor 🎀

lapack_int LAPACKE_sgbsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, float
    *ab, lapack_int ldab, float *afb, lapack_int ldafb, lapack_int
    *ipiv, char *equed, float *r, float *c, float *b, lapack_int ldb,
    float *x, lapack_int ldx, float *rcond, float *ferr, float *berr,
    float *rpivot)

and boom — sgbsvx closes out this stretch, and it is not shy: three chars (fact, trans, equed), and clock that char *equed is a pointer while fact and trans are by-value char 👀 plus rpivot sitting at the end like a little cherry on top 🍓 the rest of the family is lined up right behind it, promise — this list is nowhere near done 😭💅

okay bestie we're still deep in the SYNOPSIS era and the prototypes just keep coming — but lowkey that's the vibe, so let's get into it 💅 The pattern is your bestie here: every family comes in s, d, c, z flavors, and once you clock it you're basically fluent. iykyk ✨

       lapack_int LAPACKE_dgbsvx (int matrix_layout, char fact, char trans,
           lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, double
           *ab, lapack_int ldab, double *afb, lapack_int ldafb, lapack_int
           *ipiv, char *equed, double *r, double *c, double *b, lapack_int ldb,
           double *x, lapack_int ldx, double *rcond, double *ferr, double
           *berr, double *rpivot)
       lapack_int LAPACKE_cgbsvx (int matrix_layout, char fact, char trans,
           lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
           lapack_complex_float *ab, lapack_int ldab, lapack_complex_float
           *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, float *r,
           float *c, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *x, lapack_int ldx, float *rcond, float *ferr,
           float *berr, float *rpivot)
       lapack_int LAPACKE_zgbsvx (int matrix_layout, char fact, char trans,
           lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
           lapack_complex_double *ab, lapack_int ldab, lapack_complex_double
           *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, double *r,
           double *c, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, double *rcond, double
           *ferr, double *berr, double *rpivot)

the <hotpink>gbsvx</hotpink> girlies are giving "expert mode solver" — they're the ones with the rpivot crowd and the equed glow-up, and yes bestie that's a lot of pointers, but you got this 🫶

       lapack_int LAPACKE_sgbsvxx (int matrix_layout, char fact, char trans,
           lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, float
           *ab, lapack_int ldab, float *afb, lapack_int ldafb, lapack_int
           *ipiv, char *equed, float *r, float *c, float *b, lapack_int ldb,
           float *x, lapack_int ldx, float *rcond, float *rpvgrw, float *berr,
           lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp,
           lapack_int nparams, float *params)
       lapack_int LAPACKE_dgbsvxx (int matrix_layout, char fact, char trans,
           lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, double
           *ab, lapack_int ldab, double *afb, lapack_int ldafb, lapack_int
           *ipiv, char *equed, double *r, double *c, double *b, lapack_int ldb,
           double *x, lapack_int ldx, double *rcond, double *rpvgrw, double
           *berr, lapack_int n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int nparams, double *params)
       lapack_int LAPACKE_cgbsvxx (int matrix_layout, char fact, char trans,
           lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
           lapack_complex_float *ab, lapack_int ldab, lapack_complex_float
           *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, float *r,
           float *c, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *x, lapack_int ldx, float *rcond, float
           *rpvgrw, float *berr, lapack_int n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int nparams, float *params)
       lapack_int LAPACKE_zgbsvxx (int matrix_layout, char fact, char trans,
           lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
           lapack_complex_double *ab, lapack_int ldab, lapack_complex_double
           *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, double *r,
           double *c, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, double *rcond, double
           *rpvgrw, double *berr, lapack_int n_err_bnds, double *err_bnds_norm,
           double *err_bnds_comp, lapack_int nparams, double *params)

double-x = double the drama 💀 <purple>gbsvxx</purple> brought the whole error-bound entourage: n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. it's giving "i brought receipts" and honestly? iconic 👑

       lapack_int LAPACKE_sgbtrf (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int kl, lapack_int ku, float *ab, lapack_int ldab,
           lapack_int *ipiv)
       lapack_int LAPACKE_dgbtrf (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int kl, lapack_int ku, double *ab, lapack_int ldab,
           lapack_int *ipiv)
       lapack_int LAPACKE_cgbtrf (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int kl, lapack_int ku, lapack_complex_float *ab,
           lapack_int ldab, lapack_int *ipiv)
       lapack_int LAPACKE_zgbtrf (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int kl, lapack_int ku, lapack_complex_double *ab,
           lapack_int ldab, lapack_int *ipiv)
       lapack_int LAPACKE_sgbtrs (int matrix_layout, char trans, lapack_int n,
           lapack_int kl, lapack_int ku, lapack_int nrhs, const float *ab,
           lapack_int ldab, const lapack_int *ipiv, float *b, lapack_int ldb)
       lapack_int LAPACKE_dgbtrs (int matrix_layout, char trans, lapack_int n,
           lapack_int kl, lapack_int ku, lapack_int nrhs, const double *ab,
           lapack_int ldab, const lapack_int *ipiv, double *b, lapack_int ldb)
       lapack_int LAPACKE_cgbtrs (int matrix_layout, char trans, lapack_int n,
           lapack_int kl, lapack_int ku, lapack_int nrhs, const
           lapack_complex_float *ab, lapack_int ldab, const lapack_int *ipiv,
           lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zgbtrs (int matrix_layout, char trans, lapack_int n,
           lapack_int kl, lapack_int ku, lapack_int nrhs, const
           lapack_complex_double *ab, lapack_int ldab, const lapack_int *ipiv,
           lapack_complex_double *b, lapack_int ldb)

<mint>gbtrf= factor,gbtrs</mint> = solve. the f and s at the end are literally telling you what's up — factor and solve, periodt. also peep the const on ab and ipiv in the gbtrs crew — they're read-only, don't even think about touching them 🙈

       lapack_int LAPACKE_sgebak (int matrix_layout, char job, char side,
           lapack_int n, lapack_int ilo, lapack_int ihi, const float *scale,
           lapack_int m, float *v, lapack_int ldv)
       lapack_int LAPACKE_dgebak (int matrix_layout, char job, char side,
           lapack_int n, lapack_int ilo, lapack_int ihi, const double *scale,
           lapack_int m, double *v, lapack_int ldv)
       lapack_int LAPACKE_cgebak (int matrix_layout, char job, char side,
           lapack_int n, lapack_int ilo, lapack_int ihi, const float *scale,
           lapack_int m, lapack_complex_float *v, lapack_int ldv)
       lapack_int LAPACKE_zgebak (int matrix_layout, char job, char side,
           lapack_int n, lapack_int ilo, lapack_int ihi, const double *scale,
           lapack_int m, lapack_complex_double *v, lapack_int ldv)
       lapack_int LAPACKE_sgebal (int matrix_layout, char job, lapack_int n,
           float *a, lapack_int lda, lapack_int *ilo, lapack_int *ihi, float
           *scale)
       lapack_int LAPACKE_dgebal (int matrix_layout, char job, lapack_int n,
           double *a, lapack_int lda, lapack_int *ilo, lapack_int *ihi, double
           *scale)
       lapack_int LAPACKE_cgebal (int matrix_layout, char job, lapack_int n,
           lapack_complex_float *a, lapack_int lda, lapack_int *ilo, lapack_int
           *ihi, float *scale)
       lapack_int LAPACKE_zgebal (int matrix_layout, char job, lapack_int n,
           lapack_complex_double *a, lapack_int lda, lapack_int *ilo,
           lapack_int *ihi, double *scale)

<cyan>gebak/gebal</cyan> are the balancing besties — ilo and ihi are everywhere, and note the complex versions keep scale as real (float / double) even when the matrix is complex. that's not a typo bestie, that's just how they roll ✨

       lapack_int LAPACKE_sgebrd (int matrix_layout, lapack_int m, lapack_int
           n, float *a, lapack_int lda, float *d, float *e, float *tauq, float
           *taup)
       lapack_int LAPACKE_dgebrd (int matrix_layout, lapack_int m, lapack_int
           n, double *a, lapack_int lda, double *d, double *e, double *tauq,
           double *taup)
       lapack_int LAPACKE_cgebrd (int matrix_layout, lapack_int m, lapack_int
           n, lapack_complex_float *a, lapack_int lda, float *d, float *e,
           lapack_complex_float *tauq, lapack_complex_float *taup)
       lapack_int LAPACKE_zgebrd (int matrix_layout, lapack_int m, lapack_int
           n, lapack_complex_double *a, lapack_int lda, double *d, double *e,
           lapack_complex_double *tauq, lapack_complex_double *taup)
       lapack_int LAPACKE_sgecon (int matrix_layout, char norm, lapack_int n,
           const float *a, lapack_int lda, float anorm, float *rcond)
       lapack_int LAPACKE_dgecon (int matrix_layout, char norm, lapack_int n,
           const double *a, lapack_int lda, double anorm, double *rcond)
       lapack_int LAPACKE_cgecon (int matrix_layout, char norm, lapack_int n,
           const lapack_complex_float *a, lapack_int lda, float anorm, float
           *rcond)
       lapack_int LAPACKE_zgecon (int matrix_layout, char norm, lapack_int n,
           const lapack_complex_double *a, lapack_int lda, double anorm, double
           *rcond)

<lavender>gebrdis bidiagonal-reduction core, withtauqandtaupbeing the cutest little tau pair you ever did see 🎀 andgeconis the condition-number checker —anormcomes in,rcondcomes out,norm` tells it which flavor. slay.

       lapack_int LAPACKE_sgeequ (int matrix_layout, lapack_int m, lapack_int
           n, const float *a, lapack_int lda, float *r, float *c, float
           *rowcnd, float *colcnd, float *amax)
       lapack_int LAPACKE_dgeequ (int matrix_layout, lapack_int m, lapack_int
           n, const double *a, lapack_int lda, double *r, double *c, double
           *rowcnd, double *colcnd, double *amax)
       lapack_int LAPACKE_cgeequ (int matrix_layout, lapack_int m, lapack_int
           n, const lapack_complex_float *a, lapack_int lda, float *r, float
           *c, float *rowcnd, float *colcnd, float *amax)
       lapack_int LAPACKE_zgeequ (int matrix_layout, lapack_int m, lapack_int
           n, const lapack_complex_double *a, lapack_int lda, double *r, double
           *c, double *rowcnd, double *colcnd, double *amax)
       lapack_int LAPACKE_sgeequb (int matrix_layout, lapack_int m, lapack_int
           n, const float *a, lapack_int lda, float *r, float *c, float
           *rowcnd, float *colcnd, float *amax)
       lapack_int LAPACKE_dgeequb (int matrix_layout, lapack_int m, lapack_int
           n, const double *a, lapack_int lda, double *r, double *c, double
           *rowcnd, double *colcnd, double *amax)
       lapack_int LAPACKE_cgeequb (int matrix_layout, lapack_int m, lapack_int
           n, const lapack_complex_float *a, lapack_int lda, float *r, float
           *c, float *rowcnd, float *colcnd, float *amax)
       lapack_int LAPACKE_zgeequb (int matrix_layout, lapack_int m, lapack_int
           n, const lapack_complex_double *a, lapack_int lda, double *r, double
           *c, double *rowcnd, double *colcnd, double *amax)

<yellow>geequandgeequb</yellow> are twins fr fr — same signature, and the extra b is the whole difference. both hand you r, c, rowcnd, colcnd, and amax, so you're never left guessing 💖

       lapack_int LAPACKE_sgees (int matrix_layout, char jobvs, char sort,
           LAPACK_S_SELECT2 select, lapack_int n, float *a, lapack_int lda,
           lapack_int *sdim, float *wr, float *wi, float *vs, lapack_int ldvs)
       lapack_int LAPACKE_dgees (int matrix_layout, char jobvs, char sort,
           LAPACK_D_SELECT2 select, lapack_int n, double *a, lapack_int lda,
           lapack_int *sdim, double *wr, double *wi, double *vs, lapack_int
           ldvs)
       lapack_int LAPACKE_cgees (int matrix_layout, char jobvs, char sort,
           LAPACK_C_SELECT1 select, lapack_int n, lapack_complex_float *a,
           lapack_int lda, lapack_int *sdim, lapack_complex_float *w,
           lapack_complex_float *vs, lapack_int ldvs)
       lapack_int LAPACKE_zgees (int matrix_layout, char jobvs, char sort,
           LAPACK_Z_SELECT1 select, lapack_int n, lapack_complex_double *a,
           lapack_int lda, lapack_int *sdim, lapack_complex_double *w,
           lapack_complex_double *vs, lapack_int ldvs)
       lapack_int LAPACKE_sgeesx (int matrix_layout, char jobvs, char sort,
           LAPACK_S_SELECT2 select, char sense, lapack_int n, float *a,
           lapack_int lda, lapack_int *sdim, float *wr, float *wi, float *vs,
           lapack_int ldvs, float *rconde, float *rcondv)
       lapack_int LAPACKE_dgeesx (int matrix_layout, char jobvs, char sort,
           LAPACK_D_SELECT2 select, char sense, lapack_int n, double *a,
           lapack_int lda, lapack_int *sdim, double *wr, double *wi, double
           *vs, lapack_int ldvs, double *rconde, double *rcondv)
       lapack_int LAPACKE_cgeesx (int matrix_layout, char jobvs, char sort,
           LAPACK_C_SELECT1 select, char sense, lapack_int n,
           lapack_complex_float *a, lapack_int lda, lapack_int *sdim,
           lapack_complex_float *w, lapack_complex_float *vs, lapack_int ldvs,
           float *rconde, float *rcondv)

the <rainbow>geesfamily is where theselectcallback enters the chat — notice the real versions takeLAPACK_S_SELECT2/LAPACK_D_SELECT2, the complex ones take LAPACK_C_SELECT1/LAPACK_Z_SELECT1. also the real geessplits intowrandwi, while complex just takes wand moves on 💅 and thegeesxversions addsenseplusrcondeandrcondv` — extra credit energy, we love to see it 👑

okay so the synopsis list keeps going and honestly it's the best part, it's just the whole cast showing up one by one 💅

✨ the eigenvalue girlies

first up is geesx, the fancy one — it takes a select function pointer (LAPACK_Z_SELECT1, no pressure bestie 🙈) and hands you back reciprocal condition numbers because she's thorough:

lapack_int LAPACKE_zgeesx (int matrix_layout, char jobvs, char sort,
    LAPACK_Z_SELECT1 select, char sense, lapack_int n,
    lapack_complex_double *a, lapack_int lda, lapack_int *sdim,
    lapack_complex_double *w, lapack_complex_double *vs, lapack_int
    ldvs, double *rconde, double *rcondv)

then geev, in the classic four-flavour lineup 🍦 — s for float, d for double, c for lapack_complex_float, z for lapack_complex_double, and the real ones split the eigenvalues into wr + wi because that's just how it is:

lapack_int LAPACKE_sgeev (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, float *a, lapack_int lda, float *wr, float *wi, float
    *vl, lapack_int ldvl, float *vr, lapack_int ldvr)
lapack_int LAPACKE_dgeev (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, double *a, lapack_int lda, double *wr, double *wi,
    double *vl, lapack_int ldvl, double *vr, lapack_int ldvr)
lapack_int LAPACKE_cgeev (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *w, lapack_complex_float *vl, lapack_int ldvl,
    lapack_complex_float *vr, lapack_int ldvr)
lapack_int LAPACKE_zgeev (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *w, lapack_complex_double *vl, lapack_int
    ldvl, lapack_complex_double *vr, lapack_int ldvr)

and geevx is geev's overachieving big sister — same energy plus balanc, sense, ilo, ihi, scale, abnrm, rconde, rcondv. she does everything:

lapack_int LAPACKE_sgeevx (int matrix_layout, char balanc, char jobvl,
    char jobvr, char sense, lapack_int n, float *a, lapack_int lda,
    float *wr, float *wi, float *vl, lapack_int ldvl, float *vr,
    lapack_int ldvr, lapack_int *ilo, lapack_int *ihi, float *scale,
    float *abnrm, float *rconde, float *rcondv)
lapack_int LAPACKE_dgeevx (int matrix_layout, char balanc, char jobvl,
    char jobvr, char sense, lapack_int n, double *a, lapack_int lda,
    double *wr, double *wi, double *vl, lapack_int ldvl, double *vr,
    lapack_int ldvr, lapack_int *ilo, lapack_int *ihi, double *scale,
    double *abnrm, double *rconde, double *rcondv)
lapack_int LAPACKE_cgeevx (int matrix_layout, char balanc, char jobvl,
    char jobvr, char sense, lapack_int n, lapack_complex_float *a,
    lapack_int lda, lapack_complex_float *w, lapack_complex_float *vl,
    lapack_int ldvl, lapack_complex_float *vr, lapack_int ldvr,
    lapack_int *ilo, lapack_int *ihi, float *scale, float *abnrm, float
    *rconde, float *rcondv)
lapack_int LAPACKE_zgeevx (int matrix_layout, char balanc, char jobvl,
    char jobvr, char sense, lapack_int n, lapack_complex_double *a,
    lapack_int lda, lapack_complex_double *w, lapack_complex_double *vl,
    lapack_int ldvl, lapack_complex_double *vr, lapack_int ldvr,
    lapack_int *ilo, lapack_int *ihi, double *scale, double *abnrm,
    double *rconde, double *rcondv)

🦋 gehrd — the Hessenberg glow-up

four of them, all taking ilo + ihi + a tau array, no notes:

lapack_int LAPACKE_sgehrd (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, float *a, lapack_int lda, float *tau)
lapack_int LAPACKE_dgehrd (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, double *a, lapack_int lda, double *tau)
lapack_int LAPACKE_cgehrd (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *tau)
lapack_int LAPACKE_zgehrd (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *tau)

👑 gejsv — Jacobi SVD, main character energy

look at all those job chars: joba, jobu, jobv, jobr, jobt, jobp. six whole jobs, she's booked and busy 😭 also stat (float/double array) and istat (lapack_int array):

lapack_int LAPACKE_sgejsv (int matrix_layout, char joba, char jobu, char
    jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int n,
    float *a, lapack_int lda, float *sva, float *u, lapack_int ldu,
    float *v, lapack_int ldv, float *stat, lapack_int *istat)
lapack_int LAPACKE_dgejsv (int matrix_layout, char joba, char jobu, char
    jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int n,
    double *a, lapack_int lda, double *sva, double *u, lapack_int ldu,
    double *v, lapack_int ldv, double *stat, lapack_int *istat)
lapack_int LAPACKE_cgejsv (int matrix_layout, char joba, char jobu, char
    jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int n,
    lapack_complex_float *a, lapack_int lda, float *sva,
    lapack_complex_float *u, lapack_int ldu, lapack_complex_float *v,
    lapack_int ldv, float *stat, lapack_int *istat)
lapack_int LAPACKE_zgejsv (int matrix_layout, char joba, char jobu, char
    jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int n,
    lapack_complex_double *a, lapack_int lda, double *sva,
    lapack_complex_double *u, lapack_int ldu, lapack_complex_double *v,
    lapack_int ldv, double *stat, lapack_int *istat)

🎀 LQ era: gelq2 and gelqf

gelq2 is the little one, gelqf is the blocked one — both keep it simple with m, n, a, lda, tau:

lapack_int LAPACKE_sgelq2 (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, float *tau)
lapack_int LAPACKE_dgelq2 (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, double *tau)
lapack_int LAPACKE_cgelq2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_complex_float
    *tau)
lapack_int LAPACKE_zgelq2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_complex_double
    *tau)
lapack_int LAPACKE_sgelqf (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, float *tau)
lapack_int LAPACKE_dgelqf (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, double *tau)
lapack_int LAPACKE_cgelqf (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_complex_float
    *tau)
lapack_int LAPACKE_zgelqf (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_complex_double
    *tau)

💖 least-squares squad assemble

gels is the basic baddie — trans, m, n, nrhs, a/lda, b/ldb, that's the whole vibe:

lapack_int LAPACKE_sgels (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *b,
    lapack_int ldb)
lapack_int LAPACKE_dgels (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double *b,
    lapack_int ldb)
lapack_int LAPACKE_cgels (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zgels (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *b, lapack_int ldb)

gelsd brings s, rcond and rank to the party — note the real rcond type matches the precision (float for s, double for d):

lapack_int LAPACKE_sgelsd (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, float *a, lapack_int lda, float *b, lapack_int
    ldb, float *s, float rcond, lapack_int *rank)
lapack_int LAPACKE_dgelsd (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, double *a, lapack_int lda, double *b, lapack_int
    ldb, double *s, double rcond, lapack_int *rank)
lapack_int LAPACKE_cgelsd (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *b, lapack_int ldb, float *s, float rcond,
    lapack_int *rank)
lapack_int LAPACKE_zgelsd (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *b, lapack_int ldb, double *s, double rcond,
    lapack_int *rank)

gelss — same shape, also s / rcond / rank:

lapack_int LAPACKE_sgelss (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, float *a, lapack_int lda, float *b, lapack_int
    ldb, float *s, float rcond, lapack_int *rank)
lapack_int LAPACKE_dgelss (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, double *a, lapack_int lda, double *b, lapack_int
    ldb, double *s, double rcond, lapack_int *rank)
lapack_int LAPACKE_cgelss (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *b, lapack_int ldb, float *s, float rcond,
    lapack_int *rank)
lapack_int LAPACKE_zgelss (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *b, lapack_int ldb, double *s, double rcond,
    lapack_int *rank)

and gelsy is the one with jpvt — pivoting queen 👑:

lapack_int LAPACKE_sgelsy (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, float *a, lapack_int lda, float *b, lapack_int
    ldb, lapack_int *jpvt, float rcond, lapack_int *rank)
lapack_int LAPACKE_dgelsy (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, double *a, lapack_int lda, double *b, lapack_int
    ldb, lapack_int *jpvt, double rcond, lapack_int *rank)
lapack_int LAPACKE_cgelsy (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *b, lapack_int ldb, lapack_int *jpvt, float
    rcond, lapack_int *rank)
lapack_int LAPACKE_zgelsy (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *b, lapack_int ldb, lapack_int *jpvt, double
    rcond, lapack_int *rank)

🌸 QL + QR corner

geqlf, four flavours, same m/n/a/lda/tau little formula:

lapack_int LAPACKE_sgeqlf (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, float *tau)
lapack_int LAPACKE_dgeqlf (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, double *tau)
lapack_int LAPACKE_cgeqlf (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_complex_float
    *tau)
lapack_int LAPACKE_zgeqlf (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_complex_double
    *tau)

geqp3 and geqpf, the pivoted QR twins — both rock jpvt alongside tau:

lapack_int LAPACKE_sgeqp3 (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, lapack_int *jpvt, float *tau)
lapack_int LAPACKE_dgeqp3 (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, lapack_int *jpvt, double *tau)
lapack_int LAPACKE_cgeqp3 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_int *jpvt,
    lapack_complex_float *tau)
lapack_int LAPACKE_zgeqp3 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_int *jpvt,
    lapack_complex_double *tau)
lapack_int LAPACKE_sgeqpf (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, lapack_int *jpvt, float *tau)
lapack_int LAPACKE_dgeqpf (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, lapack_int *jpvt, double *tau)
lapack_int LAPACKE_cgeqpf (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_int *jpvt,
    lapack_complex_float *tau)
lapack_int LAPACKE_zgeqpf (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_int *jpvt,
    lapack_complex_double *tau)

and geqr2 starts the unblocked QR crew — this part only gets as far as s and d before the page cuts off, so don't come for me, more is coming 🫶:

lapack_int LAPACKE_sgeqr2 (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, float *tau)
lapack_int LAPACKE_dgeqr2 (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, double *tau)

okay so like — we're still in the SYNOPSIS bestie, and it's giving phone book 😭. Every single one of these is a lapack_int-returning function, all of them take matrix_layout first, and the letter in front is the whole personality:

  • s → float everything, single precision, baby's first ✨
  • d → double, double the precision, double the vibes
  • c → lapack_complex_float, complex single, imaginary bestie 💜
  • z → lapack_complex_double, complex double, the iconic one 👑

🎀 the geqr2 / geqrf / geqrfp girlies (QR housekeeping)

lapack_int LAPACKE_cgeqr2 (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *tau)
lapack_int LAPACKE_zgeqr2 (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_complex_double *tau)
lapack_int LAPACKE_sgeqrf (int matrix_layout, lapack_int m, lapack_int n, float *a, lapack_int lda, float *tau)
lapack_int LAPACKE_dgeqrf (int matrix_layout, lapack_int m, lapack_int n, double *a, lapack_int lda, double *tau)
lapack_int LAPACKE_cgeqrf (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *tau)
lapack_int LAPACKE_zgeqrf (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_complex_double *tau)
lapack_int LAPACKE_sgeqrfp (int matrix_layout, lapack_int m, lapack_int n, float *a, lapack_int lda, float *tau)
lapack_int LAPACKE_dgeqrfp (int matrix_layout, lapack_int m, lapack_int n, double *a, lapack_int lda, double *tau)
lapack_int LAPACKE_cgeqrfp (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *tau)
lapack_int LAPACKE_zgeqrfp (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_complex_double *tau)

like, note how geqr2 is only chillin' in c and z flavours here, no cap 🫶. The geqrf and geqrfp crews are full sets — s, d, c, z — all of them sharing the same shape: m, n, the matrix a with leading dimension lda, and that tau output. Same skeleton, different skin 💅.


🦋 gerfs + gerfsx (the error-margin girlies)

lapack_int LAPACKE_sgerfs (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const float *af, lapack_int ldaf, const lapack_int *ipiv, const float *b, lapack_int ldb, float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_dgerfs (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const double *a, lapack_int lda, const double *af, lapack_int ldaf, const lapack_int *ipiv, const double *b, lapack_int ldb, double *x, lapack_int ldx, double *ferr, double *berr)
lapack_int LAPACKE_cgerfs (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda, const lapack_complex_float *af, lapack_int ldaf, const lapack_int *ipiv, const lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_zgerfs (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda, const lapack_complex_double *af, lapack_int ldaf, const lapack_int *ipiv, const lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double *ferr, double *berr)

okay so the vibe check on these: a and af and b and ipiv are all const (they're read-only, she's not gonna touch your data, respectful queen 🌸), while x, ferr and berr are outputs. And notice the c/z ones still take real float/double for ferr and berr — error bounds are always real bestie, that's just how it is 💀.

Now the x versions, where the user gets extra:

lapack_int LAPACKE_sgerfsx (int matrix_layout, char trans, char equed, lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const float *af, lapack_int ldaf, const lapack_int *ipiv, const float *r, const float *c, const float *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond, float *berr, lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float *params)
lapack_int LAPACKE_dgerfsx (int matrix_layout, char trans, char equed, lapack_int n, lapack_int nrhs, const double *a, lapack_int lda, const double *af, lapack_int ldaf, const lapack_int *ipiv, const double *r, const double *c, const double *b, lapack_int ldb, double *x, lapack_int ldx, double *rcond, double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double *params)
lapack_int LAPACKE_cgerfsx (int matrix_layout, char trans, char equed, lapack_int n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda, const lapack_complex_float *af, lapack_int ldaf, const lapack_int *ipiv, const float *r, const float *c, const lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float *rcond, float *berr, lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float *params)
lapack_int LAPACKE_zgerfsx (int matrix_layout, char trans, char equed, lapack_int n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda, const lapack_complex_double *af, lapack_int ldaf, const lapack_int *ipiv, const double *r, const double *c, const lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double *rcond, double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double *params)

not the char equed 😭 and then r, c, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params — like she brought her whole friend group to the function call. obsessed. Note r and c are real arrays even in c/z, and rcond/berr/err_bnds_norm/err_bnds_comp/params are real too. Only a, af, b, x go complex. Periodt.


🍓 gerqf (RQ era)

lapack_int LAPACKE_sgerqf (int matrix_layout, lapack_int m, lapack_int n, float *a, lapack_int lda, float *tau)
lapack_int LAPACKE_dgerqf (int matrix_layout, lapack_int m, lapack_int n, double *a, lapack_int lda, double *tau)
lapack_int LAPACKE_cgerqf (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *tau)
lapack_int LAPACKE_zgerqf (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_complex_double *tau)

exact same silhouette as geqrf — m, n, a, lda, tau. One letter different, whole different factorization, slay ✨.


💀 gesdd (the drama one)

lapack_int LAPACKE_sgesdd (int matrix_layout, char jobz, lapack_int m, lapack_int n, float *a, lapack_int lda, float *s, float *u, lapack_int ldu, float *vt, lapack_int ldvt)
lapack_int LAPACKE_dgesdd (int matrix_layout, char jobz, lapack_int m, lapack_int n, double *a, lapack_int lda, double *s, double *u, lapack_int ldu, double *vt, lapack_int ldvt)
lapack_int LAPACKE_cgesdd (int matrix_layout, char jobz, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, float *s, lapack_complex_float *u, lapack_int ldu, lapack_complex_float *vt, lapack_int ldvt)
lapack_int LAPACKE_zgesdd (int matrix_layout, char jobz, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, double *s, lapack_complex_double *u, lapack_int ldu, lapack_complex_double *vt, lapack_int ldvt)

jobz is a char, bestie, so she's making a decision for you 👑. And look — s is real (float/double) always, even when u and vt are complex. singular values stay real, that's the law 💅.


🔥 gesv + the iter girls

lapack_int LAPACKE_sgesv (int matrix_layout, lapack_int n, lapack_int nrhs, float *a, lapack_int lda, lapack_int *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_dgesv (int matrix_layout, lapack_int n, lapack_int nrhs, double *a, lapack_int lda, lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_cgesv (int matrix_layout, lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zgesv (int matrix_layout, lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
lapack_int LAPACKE_dsgesv (int matrix_layout, lapack_int n, lapack_int nrhs, double *a, lapack_int lda, lapack_int *ipiv, double *b, lapack_int ldb, double *x, lapack_int ldx, lapack_int *iter)
lapack_int LAPACKE_zcgesv (int matrix_layout, lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, lapack_int *iter)

the plain four are tidy little icons: n, nrhs, a, lda, ipiv, b, ldb. Then dsgesv and zcgesv show up with extra bags — a separate x with its own ldx, plus lapack_int *iter. iykyk 🧚


🌈 gesvd (the one with superb, yes really)

lapack_int LAPACKE_sgesvd (int matrix_layout, char jobu, char jobvt, lapack_int m, lapack_int n, float *a, lapack_int lda, float *s, float *u, lapack_int ldu, float *vt, lapack_int ldvt, float *superb)
lapack_int LAPACKE_dgesvd (int matrix_layout, char jobu, char jobvt, lapack_int m, lapack_int n, double *a, lapack_int lda, double *s, double *u, lapack_int ldu, double *vt, lapack_int ldvt, double *superb)
lapack_int LAPACKE_cgesvd (int matrix_layout, char jobu, char jobvt, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, float *s, lapack_complex_float *u, lapack_int ldu, lapack_complex_float *vt, lapack_int ldvt, float *superb)
lapack_int LAPACKE_zgesvd (int matrix_layout, char jobu, char jobvt, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, double *s, lapack_complex_double *u, lapack_int ldu, lapack_complex_double *vt, lapack_int ldvt, double *superb)

two job chars this time — jobu and jobvt — because both sides get a say 💖. And then there's a parameter literally named superb at the end. no notes. perfection. she's the main character 🎀


⭐ gesvdx (range girlie)

lapack_int LAPACKE_sgesvdx (int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, float *a, lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu, lapack_int *ns, float *s, float *u, lapack_int ldu, float *vt, lapack_int ldvt, lapack_int *superb)
lapack_int LAPACKE_dgesvdx (int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, double *a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, lapack_int *ns, double *s, double *u, lapack_int ldu, double *vt, lapack_int ldvt, lapack_int *superb)
lapack_int LAPACKE_cgesvdx (int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu, lapack_int *ns, float *s, lapack_complex_float *u, lapack_int ldu, lapack_complex_float *vt, lapack_int ldvt, lapack_int *superb)
lapack_int LAPACKE_zgesvdx (int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, lapack_int *ns, double *s, lapack_complex_double *u, lapack_int ldu, lapack_complex_double *vt, lapack_int ldvt, lapack_int *superb)

three chars now: jobu, jobvt, range. and superb got promoted from float * to lapack_int * in this family — glow up 🔥. also vl, vu, il, iu all show up, plus ns as an output.


🧚 gesvj (j is for joy)

lapack_int LAPACKE_sgesvj (int matrix_layout, char joba, char jobu, char jobv, lapack_int m, lapack_int n, float *a, lapack_int lda, float *sva, lapack_int mv, float *v, lapack_int ldv, float *stat)
lapack_int LAPACKE_dgesvj (int matrix_layout, char joba, char jobu, char jobv, lapack_int m, lapack_int n, double *a, lapack_int lda, double *sva, lapack_int mv, double *v, lapack_int ldv, double *stat)
lapack_int LAPACKE_cgesvj (int matrix_layout, char joba, char jobu, char jobv, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, float *sva, lapack_int mv, lapack_complex_float *v, lapack_int ldv, float *stat)
lapack_int LAPACKE_zgesvj (int matrix_layout, char joba, char jobu, char jobv, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, double *sva, lapack_int mv, lapack_complex_double *v, lapack_int ldv, double *stat)

three job chars — joba, jobu, jobv — plus sva, mv, v, ldv, stat. Also note stat is always real, and sva is always real. the complex only lives in a and v. consistency is so attractive honestly 💜


🫶 gesvx (we're getting to the end of this chunk)

lapack_int LAPACKE_sgesvx (int matrix_layout, char fact, char trans, lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *af, lapack_int ldaf, lapack_int *ipiv, char *equed, float *r, float *c, float *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond, float *ferr, float *berr, float *rpivot)
lapack_int LAPACKE_dgesvx (int matrix_layout, char fact, char trans, lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double *af, lapack_int ldaf, lapack_int *ipiv, char *equed, double *r,

and yes she's still going — LAPACKE_dgesvx got cut off right after that double *r, and the rest of the alphabet soup is coming at you in the next chunk 😭🫶 don't panic, we'll pick it right back up.

...and the gesvx saga wraps up with the complex homies 👑 same fact/trans energy, same equed, r, c, b, x, rcond, ferr, berr lineup — just swap float for lapack_complex_float and double for lapack_complex_double, and note both of these end in the *rpivot argument:

lapack_int LAPACKE_cgesvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *af, lapack_int ldaf, lapack_int *ipiv,
    char *equed, float *r, float *c, lapack_complex_float *b, lapack_int
    ldb, lapack_complex_float *x, lapack_int ldx, float *rcond, float
    *ferr, float *berr, float *rpivot)
lapack_int LAPACKE_zgesvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *af, lapack_int ldaf, lapack_int *ipiv,
    char *equed, double *r, double *c, lapack_complex_double *b,
    lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double
    *rcond, double *ferr, double *berr, double *rpivot)

🌈 the gesvxx girls — extra, expert, unbothered

Okay bestie, gesvxx is literally gesvx but with ✨more✨ — you get rpvgrw, plus n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params riding along. All four precisions, all four showing up:

lapack_int LAPACKE_sgesvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *af,
    lapack_int ldaf, lapack_int *ipiv, char *equed, float *r, float *c,
    float *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond,
    float *rpvgrw, float *berr, lapack_int n_err_bnds, float
    *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float
    *params)
lapack_int LAPACKE_dgesvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double
    *af, lapack_int ldaf, lapack_int *ipiv, char *equed, double *r,
    double *c, double *b, lapack_int ldb, double *x, lapack_int ldx,
    double *rcond, double *rpvgrw, double *berr, lapack_int n_err_bnds,
    double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams,
    double *params)
lapack_int LAPACKE_cgesvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *af, lapack_int ldaf, lapack_int *ipiv,
    char *equed, float *r, float *c, lapack_complex_float *b, lapack_int
    ldb, lapack_complex_float *x, lapack_int ldx, float *rcond, float
    *rpvgrw, float *berr, lapack_int n_err_bnds, float *err_bnds_norm,
    float *err_bnds_comp, lapack_int nparams, float *params)
lapack_int LAPACKE_zgesvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *af, lapack_int ldaf, lapack_int *ipiv,
    char *equed, double *r, double *c, lapack_complex_double *b,
    lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double
    *rcond, double *rpvgrw, double *berr, lapack_int n_err_bnds, double
    *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double
    *params)
Lowkey obsessed with how sgesvxx and dgesvxx take r and c as float/double, but if you're complex (c, z) then r and c are still real — bestie the scaling factors never go complex. That's just what's written, don't come for me 💅

🎀 getf2 — the baby LU

Smallest of the factorization girlies. m, n, a, lda, ipiv, done. Four flavors, one vibe:

lapack_int LAPACKE_sgetf2 (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_dgetf2 (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_cgetf2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_zgetf2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv)

🔥 getrf — the main character of LU

Same five arguments as getf2, but this is the one everybody actually calls. Blocked, iconic, no notes:

lapack_int LAPACKE_sgetrf (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_dgetrf (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_cgetrf (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_zgetrf (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv)

🦋 getrf2 — the recursive remix

Yeah she's back with the exact same signature list. Not a typo, that's genuinely the whole bit:

lapack_int LAPACKE_sgetrf2 (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_dgetrf2 (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_cgetrf2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_zgetrf2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv)

💜 getri — inverse o'clock

Now we're undoing the factor. n, a, lda, and the ipiv you saved — and heads up, it's const lapack_int *ipiv here, she's read-only now, respectful queen:

lapack_int LAPACKE_sgetri (int matrix_layout, lapack_int n, float *a,
    lapack_int lda, const lapack_int *ipiv)
lapack_int LAPACKE_dgetri (int matrix_layout, lapack_int n, double *a,
    lapack_int lda, const lapack_int *ipiv)
lapack_int LAPACKE_cgetri (int matrix_layout, lapack_int n,
    lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv)
lapack_int LAPACKE_zgetri (int matrix_layout, lapack_int n,
    lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv)

🌸 getrs — solve with the factor you already have

trans, n, nrhs, const matrix a, lda, const ipiv, then b at ldb. Note that a and ipiv are both const — you're not touching them, you're just vibing off them:

lapack_int LAPACKE_sgetrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const float *a, lapack_int lda, const lapack_int
    *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_dgetrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const double *a, lapack_int lda, const lapack_int
    *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_cgetrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
    const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zgetrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
    const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)

🧚 the gg cinematic universe begins

Generalized eigenvalue problems, bestie. Buckle up, this is a whole franchise.

ggbak — the un-balancing glow-up

job, side, n, ilo, ihi, const lscale, const rscale, m, v, ldv. She applies the balancing transformations back to a matrix. And yes — c and z take const float *lscale / const float *rscale while s and d take const float * / const double * respectively 🫶

lapack_int LAPACKE_sggbak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const float *lscale,
    const float *rscale, lapack_int m, float *v, lapack_int ldv)
lapack_int LAPACKE_dggbak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const double *lscale,
    const double *rscale, lapack_int m, double *v, lapack_int ldv)
lapack_int LAPACKE_cggbak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const float *lscale,
    const float *rscale, lapack_int m, lapack_complex_float *v,
    lapack_int ldv)
lapack_int LAPACKE_zggbak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const double *lscale,
    const double *rscale, lapack_int m, lapack_complex_double *v,
    lapack_int ldv)

ggbal — balance me, daddy

job, n, then two matrices a (lda) and b (ldb), and out come ilo, ihi, lscale, rscale. The way she gives you back both scale arrays is such a serve:

lapack_int LAPACKE_sggbal (int matrix_layout, char job, lapack_int n,
    float *a, lapack_int lda, float *b, lapack_int ldb, lapack_int *ilo,
    lapack_int *ihi, float *lscale, float *rscale)
lapack_int LAPACKE_dggbal (int matrix_layout, char job, lapack_int n,
    double *a, lapack_int lda, double *b, lapack_int ldb, lapack_int
    *ilo, lapack_int *ihi, double *lscale, double *rscale)
lapack_int LAPACKE_cggbal (int matrix_layout, char job, lapack_int n,
    lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
    lapack_int ldb, lapack_int *ilo, lapack_int *ihi, float *lscale,
    float *rscale)
lapack_int LAPACKE_zggbal (int matrix_layout, char job, lapack_int n,
    lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
    lapack_int ldb, lapack_int *ilo, lapack_int *ihi, double *lscale,
    double *rscale)

👑 gges — the generalized Schur flex

This is a whole committee of arguments, so stay with me: jobvsl, jobvsr, sort, a selector function, n, then a/lda, b/ldb, sdim, alphar, alphai, beta, then vsl/ldvsl and vsr/ldvsr.

Notice the selectors differ per type bestie — real versions take LAPACK_S_SELECT3 / LAPACK_D_SELECT3, complex take LAPACK_C_SELECT2 / LAPACK_Z_SELECT2 — and complex versions get a single alpha instead of alphar+alphai, because obviously 💅

lapack_int LAPACKE_sgges (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_S_SELECT3 selctg, lapack_int n, float *a,
    lapack_int lda, float *b, lapack_int ldb, lapack_int *sdim, float
    *alphar, float *alphai, float *beta, float *vsl, lapack_int ldvsl,
    float *vsr, lapack_int ldvsr)
lapack_int LAPACKE_dgges (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_D_SELECT3 selctg, lapack_int n, double *a,
    lapack_int lda, double *b, lapack_int ldb, lapack_int *sdim, double
    *alphar, double *alphai, double *beta, double *vsl, lapack_int
    ldvsl, double *vsr, lapack_int ldvsr)
lapack_int LAPACKE_cgges (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_C_SELECT2 selctg, lapack_int n,
    lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
    lapack_int ldb, lapack_int *sdim, lapack_complex_float *alpha,
    lapack_complex_float *beta, lapack_complex_float *vsl, lapack_int
    ldvsl, lapack_complex_float *vsr, lapack_int ldvsr)
lapack_int LAPACKE_zgges (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_Z_SELECT2 selctg, lapack_int n,
    lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
    lapack_int ldb, lapack_int *sdim, lapack_complex_double *alpha,
    lapack_complex_double *beta, lapack_complex_double *vsl, lapack_int
    ldvsl, lapack_complex_double *vsr, lapack_int ldvsr)

gges3 — same girl, different algorithm

I'm not kidding, the argument lists are identical to gges above. Behold, the whole quartet again, with a 3 slapped on the end of every name:

lapack_int LAPACKE_sgges3 (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_S_SELECT3 selctg, lapack_int n, float *a,
    lapack_int lda, float *b, lapack_int ldb, lapack_int *sdim, float
    *alphar, float *alphai, float *beta, float *vsl, lapack_int ldvsl,
    float *vsr, lapack_int ldvsr)
lapack_int LAPACKE_dgges3 (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_D_SELECT3 selctg, lapack_int n, double *a,
    lapack_int lda, double *b, lapack_int ldb, lapack_int *sdim, double
    *alphar, double *alphai, double *beta, double *vsl, lapack_int
    ldvsl, double *vsr, lapack_int ldvsr)
lapack_int LAPACKE_cgges3 (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_C_SELECT2 selctg, lapack_int n,
    lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
    lapack_int ldb, lapack_int *sdim, lapack_complex_float *alpha,
    lapack_complex_float *beta, lapack_complex_float *vsl, lapack_int
    ldvsl, lapack_complex_float *vsr, lapack_int ldvsr)
lapack_int LAPACKE_zgges3 (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_Z_SELECT2 selctg, lapack_int n,
    lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
    lapack_int ldb, lapack_int *sdim, lapack_complex_double *alpha,
    lapack_complex_double *beta, lapack_complex_double *vsl, lapack_int
    ldvsl, lapack_complex_double *vsr, lapack_int ldvsr)

ggesx — the one with the condition numbers

New character unlocked: sense, plus rconde and rcondv at the end. Same committee as gges, just with extra opinions. The dggesx signature is still mid-sentence here — her tail continues in the next chunk, don't panic 🌈

lapack_int LAPACKE_sggesx (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_S_SELECT3 selctg, char sense, lapack_int n, float
    *a, lapack_int lda, float *b, lapack_int ldb, lapack_int *sdim,
    float *alphar, float *alphai, float *beta, float *vsl, lapack_int
    ldvsl, float *vsr, lapack_int ldvsr, float *rconde, float *rcondv)
lapack_int LAPACKE_dggesx (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_D_SELECT3 selctg, char sense, lapack_int n, double
    *a, lapack_int lda, double *b, lapack_int ldb, lapack_int *sdim,
    double *alphar, double *alphai, double *beta, double *vsl,

okay so we literally cut off mid-signature last time 😭 — the LAPACKE_dggesx prototype was just hanging there, mid-argument, like a sentence that— Anyway. Here's the rest of it, plus its two complex siblings, so you can see the whole ggesx crew together ✨

           lapack_int ldvsl, double *vsr, lapack_int ldvsr, double *rconde,
           double *rcondv)
       lapack_int LAPACKE_cggesx (int matrix_layout, char jobvsl, char jobvsr,
           char sort, LAPACK_C_SELECT2 selctg, char sense, lapack_int n,
           lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
           lapack_int ldb, lapack_int *sdim, lapack_complex_float *alpha,
           lapack_complex_float *beta, lapack_complex_float *vsl, lapack_int
           ldvsl, lapack_complex_float *vsr, lapack_int ldvsr, float *rconde,
           float *rcondv)
       lapack_int LAPACKE_zggesx (int matrix_layout, char jobvsl, char jobvsr,
           char sort, LAPACK_Z_SELECT2 selctg, char sense, lapack_int n,
           lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
           lapack_int ldb, lapack_int *sdim, lapack_complex_double *alpha,
           lapack_complex_double *beta, lapack_complex_double *vsl, lapack_int
           ldvsl, lapack_complex_double *vsr, lapack_int ldvsr, double *rconde,
           double *rcondv)

quick vibe check 🫶 — the complex ones take a selection callback, and bestie, notice it's LAPACK_C_SELECT2 for the c version and LAPACK_Z_SELECT2 for the z version. Two separate types, two separate letters, no mixing, periodt.


💖 the ggev ensemble (the OG, no suffix)

four of them, one per floating-point flavour, and they all take jobvl, jobvr, then alphar, alphai, beta, then vl and vr:

       lapack_int LAPACKE_sggev (int matrix_layout, char jobvl, char jobvr,
           lapack_int n, float *a, lapack_int lda, float *b, lapack_int ldb,
           float *alphar, float *alphai, float *beta, float *vl, lapack_int
           ldvl, float *vr, lapack_int ldvr)
       lapack_int LAPACKE_dggev (int matrix_layout, char jobvl, char jobvr,
           lapack_int n, double *a, lapack_int lda, double *b, lapack_int ldb,
           double *alphar, double *alphai, double *beta, double *vl, lapack_int
           ldvl, double *vr, lapack_int ldvr)
       lapack_int LAPACKE_cggev (int matrix_layout, char jobvl, char jobvr,
           lapack_int n, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float
           *alpha, lapack_complex_float *beta, lapack_complex_float *vl,
           lapack_int ldvl, lapack_complex_float *vr, lapack_int ldvr)
       lapack_int LAPACKE_zggev (int matrix_layout, char jobvl, char jobvr,
           lapack_int n, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double
           *alpha, lapack_complex_double *beta, lapack_complex_double *vl,
           lapack_int ldvl, lapack_complex_double *vr, lapack_int ldvr)

lowkey obsessed with how the real ones split into alphar + alphai (real part, imaginary part, two separate pointers, doing the absolute most) while the complex ones just get one single alpha. iconic behaviour honestly 💅


🌸 the ggev3 remix

same cast, same arguments, except the name has a lil 3 on the end. don't ask me to explain the 3 — it's just right there in the name and it's staying there:

       lapack_int LAPACKE_sggev3 (int matrix_layout, char jobvl, char jobvr,
           lapack_int n, float *a, lapack_int lda, float *b, lapack_int ldb,
           float *alphar, float *alphai, float *beta, float *vl, lapack_int
           ldvl, float *vr, lapack_int ldvr)
       lapack_int LAPACKE_dggev3 (int matrix_layout, char jobvl, char jobvr,
           lapack_int n, double *a, lapack_int lda, double *b, lapack_int ldb,
           double *alphar, double *alphai, double *beta, double *vl, lapack_int
           ldvl, double *vr, lapack_int ldvr)
       lapack_int LAPACKE_cggev3 (int matrix_layout, char jobvl, char jobvr,
           lapack_int n, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float
           *alpha, lapack_complex_float *beta, lapack_complex_float *vl,
           lapack_int ldvl, lapack_complex_float *vr, lapack_int ldvr)
       lapack_int LAPACKE_zggev3 (int matrix_layout, char jobvl, char jobvr,
           lapack_int n, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double
           *alpha, lapack_complex_double *beta, lapack_complex_double *vl,
           lapack_int ldvl, lapack_complex_double *vr, lapack_int ldvr)

🦋 the ggevx deluxe edition

the x versions are the ones that show up with a whole extra suitcase of arguments — balanc, sense, plus ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv. it's giving main character energy, it's giving "I brought my entire skincare routine to the sleepover" 🧖‍♀️

       lapack_int LAPACKE_sggevx (int matrix_layout, char balanc, char jobvl,
           char jobvr, char sense, lapack_int n, float *a, lapack_int lda,
           float *b, lapack_int ldb, float *alphar, float *alphai, float *beta,
           float *vl, lapack_int ldvl, float *vr, lapack_int ldvr, lapack_int
           *ilo, lapack_int *ihi, float *lscale, float *rscale, float *abnrm,
           float *bbnrm, float *rconde, float *rcondv)
       lapack_int LAPACKE_dggevx (int matrix_layout, char balanc, char jobvl,
           char jobvr, char sense, lapack_int n, double *a, lapack_int lda,
           double *b, lapack_int ldb, double *alphar, double *alphai, double
           *beta, double *vl, lapack_int ldvl, double *vr, lapack_int ldvr,
           lapack_int *ilo, lapack_int *ihi, double *lscale, double *rscale,
           double *abnrm, double *bbnrm, double *rconde, double *rcondv)
       lapack_int LAPACKE_cggevx (int matrix_layout, char balanc, char jobvl,
           char jobvr, char sense, lapack_int n, lapack_complex_float *a,
           lapack_int lda, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *alpha, lapack_complex_float *beta,
           lapack_complex_float *vl, lapack_int ldvl, lapack_complex_float *vr,
           lapack_int ldvr, lapack_int *ilo, lapack_int *ihi, float *lscale,
           float *rscale, float *abnrm, float *bbnrm, float *rconde, float
           *rcondv)
       lapack_int LAPACKE_zggevx (int matrix_layout, char balanc, char jobvl,
           char jobvr, char sense, lapack_int n, lapack_complex_double *a,
           lapack_int lda, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *alpha, lapack_complex_double *beta,
           lapack_complex_double *vl, lapack_int ldvl, lapack_complex_double
           *vr, lapack_int ldvr, lapack_int *ilo, lapack_int *ihi, double
           *lscale, double *rscale, double *abnrm, double *bbnrm, double
           *rconde, double *rcondv)

note that rconde and rcondv hang out at the very end of these bad boys, and in the c/z versions they're still float * / double * even though the matrices are complex. yes bestie, the reciprocal condition numbers stay real. slay 🌈


🎀 ggglm — short, sweet, four flavours

       lapack_int LAPACKE_sggglm (int matrix_layout, lapack_int n, lapack_int
           m, lapack_int p, float *a, lapack_int lda, float *b, lapack_int ldb,
           float *d, float *x, float *y)
       lapack_int LAPACKE_dggglm (int matrix_layout, lapack_int n, lapack_int
           m, lapack_int p, double *a, lapack_int lda, double *b, lapack_int
           ldb, double *d, double *x, double *y)
       lapack_int LAPACKE_cggglm (int matrix_layout, lapack_int n, lapack_int
           m, lapack_int p, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *d,
           lapack_complex_float *x, lapack_complex_float *y)
       lapack_int LAPACKE_zggglm (int matrix_layout, lapack_int n, lapack_int
           m, lapack_int p, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *d,
           lapack_complex_double *x, lapack_complex_double *y)

three ints up front (n, m, p), then a + lda, b + ldb, then the trio d, x, y. tidy. we love a consistent layout ✨


💜 gghrd and gghd3 — the twins

gghrd first, and yes, compq comes before compz, and ilo/ihi come before a:

       lapack_int LAPACKE_sgghrd (int matrix_layout, char compq, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, float *a, lapack_int
           lda, float *b, lapack_int ldb, float *q, lapack_int ldq, float *z,
           lapack_int ldz)
       lapack_int LAPACKE_dgghrd (int matrix_layout, char compq, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, double *a, lapack_int
           lda, double *b, lapack_int ldb, double *q, lapack_int ldq, double
           *z, lapack_int ldz)
       lapack_int LAPACKE_cgghrd (int matrix_layout, char compq, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float
           *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *q, lapack_int ldq, lapack_complex_float *z,
           lapack_int ldz)
       lapack_int LAPACKE_zgghrd (int matrix_layout, char compq, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double
           *a, lapack_int lda, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *q, lapack_int ldq, lapack_complex_double *z,
           lapack_int ldz)

then gghd3, which is literally the identical argument list with a 3 slapped on the name. not a drill, they're the same, I checked twice, and I'm not going to pretend otherwise 💀

       lapack_int LAPACKE_sgghd3 (int matrix_layout, char compq, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, float *a, lapack_int
           lda, float *b, lapack_int ldb, float *q, lapack_int ldq, float *z,
           lapack_int ldz)
       lapack_int LAPACKE_dgghd3 (int matrix_layout, char compq, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, double *a, lapack_int
           lda, double *b, lapack_int ldb, double *q, lapack_int ldq, double
           *z, lapack_int ldz)
       lapack_int LAPACKE_cgghd3 (int matrix_layout, char compq, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float
           *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *q, lapack_int ldq, lapack_complex_float *z,
           lapack_int ldz)
       lapack_int LAPACKE_zgghd3 (int matrix_layout, char compq, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double
           *a, lapack_int lda, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *q, lapack_int ldq, lapack_complex_double *z,
           lapack_int ldz)

🍓 gglse — the m, n, p girlies

watch the int order bestie: m, n, p. then a, b, c, d, x. no ld on c, d or x — those are just plain pointers, living their simple lives:

       lapack_int LAPACKE_sgglse (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int p, float *a, lapack_int lda, float *b, lapack_int ldb,
           float *c, float *d, float *x)
       lapack_int LAPACKE_dgglse (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int p, double *a, lapack_int lda, double *b, lapack_int
           ldb, double *c, double *d, double *x)
       lapack_int LAPACKE_cgglse (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int p, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *c,
           lapack_complex_float *d, lapack_complex_float *x)
       lapack_int LAPACKE_zgglse (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int p, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *c,
           lapack_complex_double *d, lapack_complex_double *x)

🧚 ggqrf vs ggrqf — bestie, don't mix these up

okay this is the part where you gotta pay attention 🙈 ggqrf starts n, m, p and ends with taua, b, ldb, taub. here:

       lapack_int LAPACKE_sggqrf (int matrix_layout, lapack_int n, lapack_int
           m, lapack_int p, float *a, lapack_int lda, float *taua, float *b,
           lapack_int ldb, float *taub)
       lapack_int LAPACKE_dggqrf (int matrix_layout, lapack_int n, lapack_int
           m, lapack_int p, double *a, lapack_int lda, double *taua, double *b,
           lapack_int ldb, double *taub)
       lapack_int LAPACKE_cggqrf (int matrix_layout, lapack_int n, lapack_int
           m, lapack_int p, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *taua, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *taub)
       lapack_int LAPACKE_zggqrf (int matrix_layout, lapack_int n, lapack_int
           m, lapack_int p, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *taua, lapack_complex_double *b, lapack_int
           ldb, lapack_complex_double *taub)

and then ggrqf — note the letters are swapped, and so is the int order, because it's m, p, n now. not me double-checking this three times 😭 that's the whole joke, and it ate:

       lapack_int LAPACKE_sggrqf (int matrix_layout, lapack_int m, lapack_int
           p, lapack_int n, float *a, lapack_int lda, float *taua, float *b,
           lapack_int ldb, float *taub)
       lapack_int LAPACKE_dggrqf (int matrix_layout, lapack_int m, lapack_int
           p, lapack_int n, double *a, lapack_int lda, double *taua, double *b,
           lapack_int ldb, double *taub)
       lapack_int LAPACKE_cggrqf (int matrix_layout, lapack_int m, lapack_int
           p, lapack_int n, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *taua, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *taub)
       lapack_int LAPACKE_zggrqf (int matrix_layout, lapack_int m, lapack_int
           p, lapack_int n, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *taua, lapack_complex_double *b, lapack_int
           ldb, lapack_complex_double *taub)

and now… ggsvd walks in, says jobu, jobv, jobq, m, n, p, gets to k, and—

       lapack_int LAPACKE_sggsvd (int matrix_layout, char jobu, char jobv, char
           jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,

…yeah. that's it. that's the cliffhanger 😳 we literally stop mid-signature again. hold that thought, the rest is coming 🔥

okay so we are STILL in the SYNOPSIS trenches and honestly it's giving phone book 😭 but every single one of these is a real, load-bearing function so we're reading them all, no skipping, periodt.


💅 the ggsvd girlies (singular value decomposition, generalized)

four flavors, one shape: s = float, d = double, c = lapack_complex_float, z = lapack_complex_double. spot the pattern bestie, it's free.

lapack_int LAPACKE_sggsvd (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
    lapack_int *l, float *a, lapack_int lda, float *b, lapack_int ldb,
    float *alpha, float *beta, float *u, lapack_int ldu, float *v,
    lapack_int ldv, float *q, lapack_int ldq, lapack_int *iwork)
lapack_int LAPACKE_dggsvd (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
    lapack_int *l, double *a, lapack_int lda, double *b, lapack_int ldb,
    double *alpha, double *beta, double *u, lapack_int ldu, double *v,
    lapack_int ldv, double *q, lapack_int ldq, lapack_int *iwork)
lapack_int LAPACKE_cggsvd (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
    lapack_int *l, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *b, lapack_int ldb, float *alpha, float *beta,
    lapack_complex_float *u, lapack_int ldu, lapack_complex_float *v,
    lapack_int ldv, lapack_complex_float *q, lapack_int ldq, lapack_int
    *iwork)
lapack_int LAPACKE_zggsvd (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
    lapack_int *l, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *b, lapack_int ldb, double *alpha, double
    *beta, lapack_complex_double *u, lapack_int ldu,
    lapack_complex_double *v, lapack_int ldv, lapack_complex_double *q,
    lapack_int ldq, lapack_int *iwork)

the way that k and l are both lapack_int * (pointers!! outputs!!) while m, n, p are plain values — that's the whole vibe check right there. and notice the complex ones still hand you real float/double alpha and beta 🫶. iwork is the workspace baddie at the end, always last, always iconic.


✨ ggsvd3 — same energy, new number

literally the same argument list as above, just with a 3 slapped on the name like a limited edition drop. still jobu, jobv, jobq, still matrix_layout first because she's the main character.

lapack_int LAPACKE_sggsvd3 (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
    lapack_int *l, float *a, lapack_int lda, float *b, lapack_int ldb,
    float *alpha, float *beta, float *u, lapack_int ldu, float *v,
    lapack_int ldv, float *q, lapack_int ldq, lapack_int *iwork)
lapack_int LAPACKE_dggsvd3 (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
    lapack_int *l, double *a, lapack_int lda, double *b, lapack_int ldb,
    double *alpha, double *beta, double *u, lapack_int ldu, double *v,
    lapack_int ldv, double *q, lapack_int ldq, lapack_int *iwork)
lapack_int LAPACKE_cggsvd3 (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
    lapack_int *l, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *b, lapack_int ldb, float *alpha, float *beta,
    lapack_complex_float *u, lapack_int ldu, lapack_complex_float *v,
    lapack_int ldv, lapack_complex_float *q, lapack_int ldq, lapack_int
    *iwork)
lapack_int LAPACKE_zggsvd3 (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
    lapack_int *l, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *b, lapack_int ldb, double *alpha, double
    *beta, lapack_complex_double *u, lapack_int ldu,
    lapack_complex_double *v, lapack_int ldv, lapack_complex_double *q,
    lapack_int ldq, lapack_int *iwork)

🦋 ggsvp and ggsvp3 — the pre-processing prequel

okay so these ones have tola and tolb (tolerances, one for each of A and B, cute) and they DON'T have alpha, beta, or iwork. the order is m, p, n this time btw — not m, n, p — so read carefully before you copy-paste, i'm begging 🙈.

lapack_int LAPACKE_sggsvp (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, float *a, lapack_int
    lda, float *b, lapack_int ldb, float tola, float tolb, lapack_int
    *k, lapack_int *l, float *u, lapack_int ldu, float *v, lapack_int
    ldv, float *q, lapack_int ldq)
lapack_int LAPACKE_dggsvp (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, double *a,
    lapack_int lda, double *b, lapack_int ldb, double tola, double tolb,
    lapack_int *k, lapack_int *l, double *u, lapack_int ldu, double *v,
    lapack_int ldv, double *q, lapack_int ldq)
lapack_int LAPACKE_cggsvp (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, lapack_complex_float
    *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb, float
    tola, float tolb, lapack_int *k, lapack_int *l, lapack_complex_float
    *u, lapack_int ldu, lapack_complex_float *v, lapack_int ldv,
    lapack_complex_float *q, lapack_int ldq)
lapack_int LAPACKE_zggsvp (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n,
    lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
    lapack_int ldb, double tola, double tolb, lapack_int *k, lapack_int
    *l, lapack_complex_double *u, lapack_int ldu, lapack_complex_double
    *v, lapack_int ldv, lapack_complex_double *q, lapack_int ldq)

and the 3 versions? yeah you already know. same list, number go up. 🎀

lapack_int LAPACKE_sggsvp3 (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, float *a,
    lapack_int lda, float *b, lapack_int ldb, float tola, float tolb,
    lapack_int *k, lapack_int *l, float *u, lapack_int ldu, float *v,
    lapack_int ldv, float *q, lapack_int ldq)
lapack_int LAPACKE_dggsvp3 (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, double *a,
    lapack_int lda, double *b, lapack_int ldb, double tola, double tolb,
    lapack_int *k, lapack_int *l, double *u, lapack_int ldu, double *v,
    lapack_int ldv, double *q, lapack_int ldq)
lapack_int LAPACKE_cggsvp3 (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n,
    lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
    lapack_int ldb, float tola, float tolb, lapack_int *k, lapack_int
    *l, lapack_complex_float *u, lapack_int ldu, lapack_complex_float
    *v, lapack_int ldv, lapack_complex_float *q, lapack_int ldq)
lapack_int LAPACKE_zggsvp3 (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n,
    lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
    lapack_int ldb, double tola, double tolb, lapack_int *k, lapack_int
    *l, lapack_complex_double *u, lapack_int ldu, lapack_complex_double
    *v, lapack_int ldv, lapack_complex_double *q, lapack_int ldq)

🌸 gtcon — tridiagonal condition estimation, no matrix_layout in sight

fun fact bestie: these four have no matrix_layout argument at all. not a single layout to be seen. what they DO have is norm, all the tridiagonal bits (dl, d, du, du2), the pivot array ipiv, an anorm, and an output rcond. she's different, she's lowkey mysterious 💜

lapack_int LAPACKE_sgtcon (char norm, lapack_int n, const float *dl,
    const float *d, const float *du, const float *du2, const lapack_int
    *ipiv, float anorm, float *rcond)
lapack_int LAPACKE_dgtcon (char norm, lapack_int n, const double *dl,
    const double *d, const double *du, const double *du2, const
    lapack_int *ipiv, double anorm, double *rcond)
lapack_int LAPACKE_cgtcon (char norm, lapack_int n, const
    lapack_complex_float *dl, const lapack_complex_float *d, const
    lapack_complex_float *du, const lapack_complex_float *du2, const
    lapack_int *ipiv, float anorm, float *rcond)
lapack_int LAPACKE_zgtcon (char norm, lapack_int n, const
    lapack_complex_double *dl, const lapack_complex_double *d, const
    lapack_complex_double *du, const lapack_complex_double *du2, const
    lapack_int *ipiv, double anorm, double *rcond)

see how dl, d, du, du2, and ipiv are all const here? they're read-only princesses, we're not touching them. anorm is a plain value, rcond is the pointer she writes back to. periodt.


🔥 gtrfs — refine and get those error bounds

trans shows up for the first time in this stretch, nrhs is here, and you get BOTH ferr and berr out the back. matrix_layout is back, bestie, she never really left.

lapack_int LAPACKE_sgtrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const float *dl, const float *d, const float *du,
    const float *dlf, const float *df, const float *duf, const float
    *du2, const lapack_int *ipiv, const float *b, lapack_int ldb, float
    *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_dgtrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const double *dl, const double *d, const double
    *du, const double *dlf, const double *df, const double *duf, const
    double *du2, const lapack_int *ipiv, const double *b, lapack_int
    ldb, double *x, lapack_int ldx, double *ferr, double *berr)
lapack_int LAPACKE_cgtrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_float *dl, const
    lapack_complex_float *d, const lapack_complex_float *du, const
    lapack_complex_float *dlf, const lapack_complex_float *df, const
    lapack_complex_float *duf, const lapack_complex_float *du2, const
    lapack_int *ipiv, const lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_zgtrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_double *dl, const
    lapack_complex_double *d, const lapack_complex_double *du, const
    lapack_complex_double *dlf, const lapack_complex_double *df, const
    lapack_complex_double *duf, const lapack_complex_double *du2, const
    lapack_int *ipiv, const lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *x, lapack_int ldx, double *ferr, double
    *berr)

the factorized trio (dlf, df, duf) plus du2 and ipiv all const — those are ingredients, not outputs. x is the one getting written. she's the main character of this function, fr fr. 👑


⭐ gtsv — the short one, the simple one, the icon

look how SHORT this is compared to everything above. dl, d, du, b, ldb. that's it. no nrhs-less nonsense, no const, just vibes and a solve.

lapack_int LAPACKE_sgtsv (int matrix_layout, lapack_int n, lapack_int
    nrhs, float *dl, float *d, float *du, float *b, lapack_int ldb)
lapack_int LAPACKE_dgtsv (int matrix_layout, lapack_int n, lapack_int
    nrhs, double *dl, double *d, double *du, double *b, lapack_int ldb)
lapack_int LAPACKE_cgtsv (int matrix_layout, lapack_int n, lapack_int
    nrhs, lapack_complex_float *dl, lapack_complex_float *d,
    lapack_complex_float *du, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zgtsv (int matrix_layout, lapack_int n, lapack_int
    nrhs, lapack_complex_double *dl, lapack_complex_double *d,
    lapack_complex_double *du, lapack_complex_double *b, lapack_int ldb)

no const anywhere — everything is fair game to be overwritten. we love a chaotic queen 💀


🧚 gtsvx — the deluxe version with fact and extra outputs

okay she's got it all: fact (like "do you have the factorization or not"), trans, nrhs, factor arrays, ipiv, and on the way out you get x, rcond, ferr, AND berr. overachiever behavior honestly.

lapack_int LAPACKE_sgtsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const float *dl, const float *d,
    const float *du, float *dlf, float *df, float *duf, float *du2,
    lapack_int *ipiv, const float *b, lapack_int ldb, float *x,
    lapack_int ldx, float *rcond, float *ferr, float *berr)
lapack_int LAPACKE_dgtsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const double *dl, const double *d,
    const double *du, double *dlf, double *df, double *duf, double *du2,
    lapack_int *ipiv, const double *b, lapack_int ldb, double *x,
    lapack_int ldx, double *rcond, double *ferr, double *berr)
lapack_int LAPACKE_cgtsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const lapack_complex_float *dl, const
    lapack_complex_float *d, const lapack_complex_float *du,
    lapack_complex_float *dlf, lapack_complex_float *df,
    lapack_complex_float *duf, lapack_complex_float *du2, lapack_int
    *ipiv, const lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *x, lapack_int ldx, float *rcond, float *ferr,
    float *berr)
lapack_int LAPACKE_zgtsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const lapack_complex_double *dl,
    const lapack_complex_double *d, const lapack_complex_double *du,
    lapack_complex_double *dlf, lapack_complex_double *df,
    lapack_complex_double *duf, lapack_complex_double *du2, lapack_int
    *ipiv, const lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *x, lapack_int ldx, double *rcond, double
    *ferr, double *berr)

sneaky detail 🫶: dl, d, du, and b are const — but dlf, df, duf, du2, ipiv, and x are NOT. that's your whole cheat sheet for "what gets read vs what gets written".


💖 gttrf — and we're cutting off here

the factorization baddie, and this part literally ends mid-family on the s variant. no matrix_layout, no nrhs, just n, the tridiagonal trio, du2, and ipiv.

lapack_int LAPACKE_sgttrf (lapack_int n, float *dl, float *d, float *du,
    float *du2, lapack_int *ipiv)

and that's where part 15 stops, bestie — d, c, and z are still out there living their lives. we'll get 'em next time, don't stress 🌈

Ok so we're still in the prototype list and it is long, bestie — but like, every single one here returns a lapack_int, so at least the vibe is consistent 🫶. Carry on.


the gttrf trio 💅

Three of them, and notice — they all take the exact same little diagonal squad: dl, d, du, du2, plus ipiv for the pivots. The d one is all double, the c one is lapack_complex_float, the z one is lapack_complex_double. Pattern recognition is free, babes.

lapack_int LAPACKE_dgttrf (lapack_int n, double *dl, double *d, double *du, double *du2, lapack_int *ipiv)
lapack_int LAPACKE_cgttrf (lapack_int n, lapack_complex_float *dl, lapack_complex_float *d, lapack_complex_float *du, lapack_complex_float *du2, lapack_int *ipiv)
lapack_int LAPACKE_zgttrf (lapack_int n, lapack_complex_double *dl, lapack_complex_double *d, lapack_complex_double *du, lapack_complex_double *du2, lapack_int *ipiv)

and the gttrs quad 🎀

Same four, but make it solve. Now they all lead with matrix_layout and trans, and the dl/d/du/du2/ipiv args are all const because we're not touching them, we're just reading. Iconic behaviour honestly.

lapack_int LAPACKE_sgttrs (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const float *dl, const float *d, const float *du, const float *du2, const lapack_int *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_dgttrs (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const double *dl, const double *d, const double *du, const double *du2, const lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_cgttrs (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_float *dl, const lapack_complex_float *d, const lapack_complex_float *du, const lapack_complex_float *du2, const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zgttrs (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_double *dl, const lapack_complex_double *d, const lapack_complex_double *du, const lapack_complex_double *du2, const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)

hbev — the banded-eigenergy section ✨

jobz, uplo, n, kd, then ab with its ldab, then w for the values, then z with ldz. Same shape both times, just float vs double on the complex side. Ate.

lapack_int LAPACKE_chbev (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, lapack_complex_float *ab, lapack_int ldab, float *w, lapack_complex_float *z, lapack_int ldz)
lapack_int LAPACKE_zhbev (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, lapack_complex_double *ab, lapack_int ldab, double *w, lapack_complex_double *z, lapack_int ldz)

hbevd is the exact same argument list, just with a d on the end of the name. Literally twins separated by one character 😭

lapack_int LAPACKE_chbevd (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, lapack_complex_float *ab, lapack_int ldab, float *w, lapack_complex_float *z, lapack_int ldz)
lapack_int LAPACKE_zhbevd (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, lapack_complex_double *ab, lapack_int ldab, double *w, lapack_complex_double *z, lapack_int ldz)

And hbevx is where it gets extra — jobz, range, uplo, q/ldq, vl, vu, il, iu, abstol, m, w, z, ldz, ifail. Whole group chat invited.

lapack_int LAPACKE_chbevx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int kd, lapack_complex_float *ab, lapack_int ldab, lapack_complex_float *q, lapack_int ldq, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w, lapack_complex_float *z, lapack_int ldz, lapack_int *ifail)
lapack_int LAPACKE_zhbevx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int kd, lapack_complex_double *ab, lapack_int ldab, lapack_complex_double *q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int *m, double *w, lapack_complex_double *z, lapack_int ldz, lapack_int *ifail)

hbgst, hbgv, hbgvd, hbgvx 🌸

hbgst is the first one in this batch to bring along a second matrix — bb and its ldbb — plus an output x and ldx. It also takes both ka and kb, so like, two band widths, no big deal.

lapack_int LAPACKE_chbgst (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float *ab, lapack_int ldab, const lapack_complex_float *bb, lapack_int ldbb, lapack_complex_float *x, lapack_int ldx)
lapack_int LAPACKE_zhbgst (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double *ab, lapack_int ldab, const lapack_complex_double *bb, lapack_int ldbb, lapack_complex_double *x, lapack_int ldx)

hbgv swaps in jobz and gives you w and z/ldz:

lapack_int LAPACKE_chbgv (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float *ab, lapack_int ldab, lapack_complex_float *bb, lapack_int ldbb, float *w, lapack_complex_float *z, lapack_int ldz)
lapack_int LAPACKE_zhbgv (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double *ab, lapack_int ldab, lapack_complex_double *bb, lapack_int ldbb, double *w, lapack_complex_double *z, lapack_int ldz)

hbgvd — same again, one letter longer, zero argument changes. The way that they truly did not even try to hide it 💀

lapack_int LAPACKE_chbgvd (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float *ab, lapack_int ldab, lapack_complex_float *bb, lapack_int ldbb, float *w, lapack_complex_float *z, lapack_int ldz)
lapack_int LAPACKE_zhbgvd (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double *ab, lapack_int ldab, lapack_complex_double *bb, lapack_int ldbb, double *w, lapack_complex_double *z, lapack_int ldz)

And hbgvx, the maximalist:

lapack_int LAPACKE_chbgvx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float *ab, lapack_int ldab, lapack_complex_float *bb, lapack_int ldbb, lapack_complex_float *q, lapack_int ldq, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w, lapack_complex_float *z, lapack_int ldz, lapack_int *ifail)
lapack_int LAPACKE_zhbgvx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double *ab, lapack_int ldab, lapack_complex_double *bb, lapack_int ldbb, lapack_complex_double *q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int *m, double *w, lapack_complex_double *z, lapack_int ldz, lapack_int *ifail)

hbtrd 🦋

vect, uplo, n, kd, ab/ldab, then d and e (both plain real arrays, even in the complex versions — cute), then q/ldq.

lapack_int LAPACKE_chbtrd (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int kd, lapack_complex_float *ab, lapack_int ldab, float *d, float *e, lapack_complex_float *q, lapack_int ldq)
lapack_int LAPACKE_zhbtrd (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int kd, lapack_complex_double *ab, lapack_int ldab, double *d, double *e, lapack_complex_double *q, lapack_int ldq)

the he* era 👑

hecon brings anorm and hands you back rcond. heequb gives you s, scond and amax instead. Both take the a/lda pair and both peek at ipiv.

lapack_int LAPACKE_checon (int matrix_layout, char uplo, lapack_int n, const lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv, float anorm, float *rcond)
lapack_int LAPACKE_zhecon (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv, double anorm, double *rcond)
lapack_int LAPACKE_cheequb (int matrix_layout, char uplo, lapack_int n, const lapack_complex_float *a, lapack_int lda, float *s, float *scond, float *amax)
lapack_int LAPACKE_zheequb (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double *a, lapack_int lda, double *s, double *scond, double *amax)

Then the eigen four-pack. heev and heevd are short and sweet — jobz, uplo, n, a, lda, w:

lapack_int LAPACKE_cheev (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, float *w)
lapack_int LAPACKE_zheev (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, double *w)
lapack_int LAPACKE_cheevd (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, float *w)
lapack_int LAPACKE_zheevd (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, double *w)

heevr adds range, vl, vu, il, iu, abstol, m, z, ldz and the isuppz array:

lapack_int LAPACKE_cheevr (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w, lapack_complex_float *z, lapack_int ldz, lapack_int *isuppz)
lapack_int LAPACKE_zheevr (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int *m, double *w, lapack_complex_double *z, lapack_int ldz, lapack_int *isuppz)

and heevx is the same but trades isuppz for ifail. Same energy, different last argument 💖

lapack_int LAPACKE_cheevx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w, lapack_complex_float *z, lapack_int ldz, lapack_int *ifail)
lapack_int LAPACKE_zheevx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int *m, double *w, lapack_complex_double *z, lapack_int ldz, lapack_int *ifail)

hegst / hegv family 🌈

hegst leads with the itype int right after matrix_layout, then uplo, n, a/lda, and a const b/ldb. No jobz here, it's not that kind of party.

lapack_int LAPACKE_chegst (int matrix_layout, lapack_int itype, char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, const lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zhegst (int matrix_layout, lapack_int itype, char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, const lapack_complex_double *b, lapack_int ldb)

hegv, hegvd — itype, jobz, uplo, n, a/lda, b/ldb, w:

lapack_int LAPACKE_chegv (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb, float *w)
lapack_int LAPACKE_zhegv (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_complex_double *b, lapack_int ldb, double *w)
lapack_int LAPACKE_chegvd (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb, float *w)
lapack_int LAPACKE_zhegvd (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_complex_double *b, lapack_int ldb, double *w)

hegvx is the fully loaded one — itype, jobz, range, uplo, n, a/lda, b/ldb, vl, vu, il, iu, abstol, m, w, z/ldz, ifail. Like, she has everything 💅

lapack_int LAPACKE_chegvx (int matrix_layout, lapack_int itype, char jobz, char range, char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w, lapack_complex_float *z, lapack_int ldz, lapack_int *ifail)
lapack_int LAPACKE_zhegvx (int matrix_layout, lapack_int itype, char jobz, char range, char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_complex_double *b, lapack_int ldb, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int *m, double *w, lapack_complex_double *z, lapack_int ldz, lapack_int *ifail)

herfs and then the page just… stops 💀

cherfs is here, and it's bringing the whole a/af/ipiv/b/x situation plus ferr and berr at the end. But the manpage cuts off mid-signature right at const lapack_int — no cap, that's literally where this part of the page ends, bestie. Don't worry, it picks back up in the next chunk 🙈

lapack_int LAPACKE_cherfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda, const lapack_complex_float *af, lapack_int ldaf, const lapack_int

...and we are STILL in the synopsis bestie 😭 the prototypes do not stop, they simply keep going, and honestly? iconic of them. Zero edits, zero merges, everything exactly as written — here comes the next stretch, picking up mid-call like nothing happened 🫶

           *ipiv, const lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, double *ferr, double
           *berr)
       lapack_int LAPACKE_cherfsx (int matrix_layout, char uplo, char equed,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, const lapack_complex_float *af, lapack_int ldaf,
           const lapack_int *ipiv, const float *s, const lapack_complex_float
           *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float
           *rcond, float *berr, lapack_int n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int nparams, float *params)
       lapack_int LAPACKE_zherfsx (int matrix_layout, char uplo, char equed,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_int lda, const lapack_complex_double *af, lapack_int ldaf,
           const lapack_int *ipiv, const double *s, const lapack_complex_double
           *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double
           *rcond, double *berr, lapack_int n_err_bnds, double *err_bnds_norm,
           double *err_bnds_comp, lapack_int nparams, double *params)

Like… look at that parameter list. It's giving ✨phone book✨. cherfsx and zherfsx, float and double, matching each other step for step — the symmetry is lowkey gorgeous ngl 💅


Next batch incoming, same energy, <lavender>n_err_bnds</lavender> and <lavender>nparams</lavender> girlies you are SEEN and you are valid 🎀

       lapack_int LAPACKE_chesv (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, lapack_complex_float *a, lapack_int lda, lapack_int
           *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zhesv (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
           lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_chesvx (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, lapack_complex_float *af, lapack_int ldaf,
           lapack_int *ipiv, const lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *x, lapack_int ldx, float *rcond, float *ferr,
           float *berr)
       lapack_int LAPACKE_zhesvx (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_int lda, lapack_complex_double *af, lapack_int ldaf,
           lapack_int *ipiv, const lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, double *rcond, double
           *ferr, double *berr)
       lapack_int LAPACKE_chesvxx (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
           lda, lapack_complex_float *af, lapack_int ldaf, lapack_int *ipiv,
           char *equed, float *s, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *x, lapack_int ldx, float *rcond, float
           *rpvgrw, float *berr, lapack_int n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int nparams, float *params)
       lapack_int LAPACKE_zhesvxx (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *af, lapack_int ldaf, lapack_int *ipiv,
           char *equed, double *s, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, double *rcond, double
           *rpvgrw, double *berr, lapack_int n_err_bnds, double *err_bnds_norm,
           double *err_bnds_comp, lapack_int nparams, double *params)

chesv → chesvx → chesvxx, the glow-up pipeline fr fr. And then z-versions of literally all of them because double precision said "anything you can do I can do better" 💀


Okay the <purple>hetr</purple> family now — chetrd, zhetrd, chetrf, zhetrf, chetri, zhetri, chetrs, zhetrs. Short parameter lists, tiny little guys, honestly kind of refreshing after that last block 😭✨

       lapack_int LAPACKE_chetrd (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *a, lapack_int lda, float *d, float *e,
           lapack_complex_float *tau)
       lapack_int LAPACKE_zhetrd (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *a, lapack_int lda, double *d, double *e,
           lapack_complex_double *tau)
       lapack_int LAPACKE_chetrf (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_zhetrf (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_chetri (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv)
       lapack_int LAPACKE_zhetri (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv)
       lapack_int LAPACKE_chetrs (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zhetrs (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_chfrk (int matrix_layout, char transr, char uplo,
           char trans, lapack_int n, lapack_int k, float alpha, const
           lapack_complex_float *a, lapack_int lda, float beta,
           lapack_complex_float *c)
       lapack_int LAPACKE_zhfrk (int matrix_layout, char transr, char uplo,
           char trans, lapack_int n, lapack_int k, double alpha, const
           lapack_complex_double *a, lapack_int lda, double beta,
           lapack_complex_double *c)

Note the sneaky <hotpink>transr</hotpink> in chfrk/zhfrk bestie — that's <hotpink>transr</hotpink>, not <hotpink>trans</hotpink>, and both of them show up in the same signature. Two different chars, same line, do NOT mix them up 🙈


The <mint>hgeqz</mint> quartet now — four of them, and they're the big ones. shgeqz, dhgeqz, chgeqz, zhgeqz, all with job, compq, compz, ilo, ihi, and a whole crew of pointers 👑

       lapack_int LAPACKE_shgeqz (int matrix_layout, char job, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi, float *h,
           lapack_int ldh, float *t, lapack_int ldt, float *alphar, float
           *alphai, float *beta, float *q, lapack_int ldq, float *z, lapack_int
           ldz)
       lapack_int LAPACKE_dhgeqz (int matrix_layout, char job, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi, double *h,
           lapack_int ldh, double *t, lapack_int ldt, double *alphar, double
           *alphai, double *beta, double *q, lapack_int ldq, double *z,
           lapack_int ldz)
       lapack_int LAPACKE_chgeqz (int matrix_layout, char job, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi,
           lapack_complex_float *h, lapack_int ldh, lapack_complex_float *t,
           lapack_int ldt, lapack_complex_float *alpha, lapack_complex_float
           *beta, lapack_complex_float *q, lapack_int ldq, lapack_complex_float
           *z, lapack_int ldz)
       lapack_int LAPACKE_zhgeqz (int matrix_layout, char job, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi,
           lapack_complex_double *h, lapack_int ldh, lapack_complex_double *t,
           lapack_int ldt, lapack_complex_double *alpha, lapack_complex_double
           *beta, lapack_complex_double *q, lapack_int ldq,
           lapack_complex_double *z, lapack_int ldz)

Obsessed with the fact that s/d get <yellow>alphar</yellow> + <yellow>alphai</yellow> (separate real and imaginary parts, two whole variables) while c/z just get <yellow>alpha</yellow> (one complex variable). Different vibes, different signatures, both correct 💖


And now the <purple>hp</purple> era begins. Packed storage besties, this is YOUR moment 🌸 chpcon, zhpcon, chpev, zhpev, chpevd, zhpevd, chpevx, zhpevx — the "d" ones and the "x" ones are not the same and I need you to respect that 💅

       lapack_int LAPACKE_chpcon (int matrix_layout, char uplo, lapack_int n,
           const lapack_complex_float *ap, const lapack_int *ipiv, float anorm,
           float *rcond)
       lapack_int LAPACKE_zhpcon (int matrix_layout, char uplo, lapack_int n,
           const lapack_complex_double *ap, const lapack_int *ipiv, double
           anorm, double *rcond)
       lapack_int LAPACKE_chpev (int matrix_layout, char jobz, char uplo,
           lapack_int n, lapack_complex_float *ap, float *w,
           lapack_complex_float *z, lapack_int ldz)
       lapack_int LAPACKE_zhpev (int matrix_layout, char jobz, char uplo,
           lapack_int n, lapack_complex_double *ap, double *w,
           lapack_complex_double *z, lapack_int ldz)
       lapack_int LAPACKE_chpevd (int matrix_layout, char jobz, char uplo,
           lapack_int n, lapack_complex_float *ap, float *w,
           lapack_complex_float *z, lapack_int ldz)
       lapack_int LAPACKE_zhpevd (int matrix_layout, char jobz, char uplo,
           lapack_int n, lapack_complex_double *ap, double *w,
           lapack_complex_double *z, lapack_int ldz)
       lapack_int LAPACKE_chpevx (int matrix_layout, char jobz, char range,
           char uplo, lapack_int n, lapack_complex_float *ap, float vl, float
           vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float
           *w, lapack_complex_float *z, lapack_int ldz, lapack_int *ifail)
       lapack_int LAPACKE_zhpevx (int matrix_layout, char jobz, char range,
           char uplo, lapack_int n, lapack_complex_double *ap, double vl,
           double vu, lapack_int il, lapack_int iu, double abstol, lapack_int
           *m, double *w, lapack_complex_double *z, lapack_int ldz, lapack_int
           *ifail)

chpev vs chpevx: same start, but chpevx said "let me also bring <peach>range</peach>, <peach>vl</peach>, <peach>vu</peach>, <peach>il</peach>, <peach>iu</peach>, <peach>abstol</peach>, <peach>m</peach> and <peach>ifail</peach>" 😭 main character energy honestly, she packed for a whole trip


Now the <purple>hpg</purple> section, arguably the most confusingly-named run of functions in this entire synopsis: chpgst, zhpgst, chpgv, zhpgv, chpgvd, zhpgvd, chpgvx, zhpgvx. They are DIFFERENT functions. They all exist. Read them twice 🧚

       lapack_int LAPACKE_chpgst (int matrix_layout, lapack_int itype, char
           uplo, lapack_int n, lapack_complex_float *ap, const
           lapack_complex_float *bp)
       lapack_int LAPACKE_zhpgst (int matrix_layout, lapack_int itype, char
           uplo, lapack_int n, lapack_complex_double *ap, const
           lapack_complex_double *bp)
       lapack_int LAPACKE_chpgv (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, lapack_complex_float *ap,
           lapack_complex_float *bp, float *w, lapack_complex_float *z,
           lapack_int ldz)
       lapack_int LAPACKE_zhpgv (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, lapack_complex_double *ap,
           lapack_complex_double *bp, double *w, lapack_complex_double *z,
           lapack_int ldz)
       lapack_int LAPACKE_chpgvd (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, lapack_complex_float *ap,
           lapack_complex_float *bp, float *w, lapack_complex_float *z,
           lapack_int ldz)
       lapack_int LAPACKE_zhpgvd (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, lapack_complex_double *ap,
           lapack_complex_double *bp, double *w, lapack_complex_double *z,
           lapack_int ldz)
       lapack_int LAPACKE_chpgvx (int matrix_layout, lapack_int itype, char
           jobz, char range, char uplo, lapack_int n, lapack_complex_float *ap,
           lapack_complex_float *bp, float vl, float vu, lapack_int il,
           lapack_int iu, float abstol, lapack_int *m, float *w,
           lapack_complex_float *z, lapack_int ldz, lapack_int *ifail)
       lapack_int LAPACKE_zhpgvx (int matrix_layout, lapack_int itype, char
           jobz, char range, char uplo, lapack_int n, lapack_complex_double
           *ap, lapack_complex_double *bp, double vl, double vu, lapack_int il,
           lapack_int iu, double abstol, lapack_int *m, double *w,
           lapack_complex_double *z, lapack_int ldz, lapack_int *ifail)

🫶 <italic>itype</italic>is alapack_intup front here, and it's the very first arg aftermatrix_layout` — every single one of these has it, no skipping, no shortcuts. Slay for consistency tbh.


Last bit of this part — chprfs/zhprfs, chpsv/zhpsv, and then chpsvx which… gets cut off mid-signature 💀 Not me, not an edit, that's literally how this part of the page hands off. <red>Do not try to complete it from memory, the next part finishes it — respect the boundary bestie. 🙈

       lapack_int LAPACKE_chprfs (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const lapack_complex_float *ap, const
           lapack_complex_float *afp, const lapack_int *ipiv, const
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
           lapack_int ldx, float *ferr, float *berr)
       lapack_int LAPACKE_zhprfs (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const lapack_complex_double *ap, const
           lapack_complex_double *afp, const lapack_int *ipiv, const
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
           lapack_int ldx, double *ferr, double *berr)
       lapack_int LAPACKE_chpsv (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, lapack_complex_float *ap, lapack_int *ipiv,
           lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zhpsv (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, lapack_complex_double *ap, lapack_int *ipiv,
           lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_chpsvx (int matrix_layout, char fact, char uplo,

And that's where this part stops 😭 <pink>chpsvx</pink> is literally mid-sentence, arms out, waiting for the next chunk. To be continued, bestie 💖

(okay we're literally still inside LAPACKE_chpsvx's argument list, hold that thought bestie, we pick up mid-signature) 🫶

           lapack_int n, lapack_int nrhs, const lapack_complex_float *ap,
           lapack_complex_float *afp, lapack_int *ipiv, const
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
           lapack_int ldx, float *rcond, float *ferr, float *berr)
       lapack_int LAPACKE_zhpsvx (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *ap,
           lapack_complex_double *afp, lapack_int *ipiv, const
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
           lapack_int ldx, double *rcond, double *ferr, double *berr)
       lapack_int LAPACKE_chptrd (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *ap, float *d, float *e, lapack_complex_float
           *tau)
       lapack_int LAPACKE_zhptrd (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *ap, double *d, double *e,
           lapack_complex_double *tau)
       lapack_int LAPACKE_chptrf (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *ap, lapack_int *ipiv)
       lapack_int LAPACKE_zhptrf (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *ap, lapack_int *ipiv)
       lapack_int LAPACKE_chptri (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *ap, const lapack_int *ipiv)
       lapack_int LAPACKE_zhptri (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *ap, const lapack_int *ipiv)
       lapack_int LAPACKE_chptrs (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const lapack_complex_float *ap, const lapack_int
           *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zhptrs (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const lapack_complex_double *ap, const lapack_int
           *ipiv, lapack_complex_double *b, lapack_int ldb)

okay that whole ?hptr* gang — ?hptrd, ?hptrf, ?hptri, ?hptrs — each one comes in a c (single) and z (double) flavour, and the way they all show up in pairs is lowkey so satisfying 💅 like a matched set. And notice ?hptri and ?hptrs take const lapack_int *ipiv while ?hptrf hands you a plain lapack_int *ipiv — one gives, one takes, icon behaviour honestly.


Next up, the ?hsein crew — look at those chars: job, eigsrc, initv. Three chars before you even get to a number. Character select screen energy. 🎮

       lapack_int LAPACKE_shsein (int matrix_layout, char job, char eigsrc,
           char initv, lapack_logical *select, lapack_int n, const float *h,
           lapack_int ldh, float *wr, const float *wi, float *vl, lapack_int
           ldvl, float *vr, lapack_int ldvr, lapack_int mm, lapack_int *m,
           lapack_int *ifaill, lapack_int *ifailr)
       lapack_int LAPACKE_dhsein (int matrix_layout, char job, char eigsrc,
           char initv, lapack_logical *select, lapack_int n, const double *h,
           lapack_int ldh, double *wr, const double *wi, double *vl, lapack_int
           ldvl, double *vr, lapack_int ldvr, lapack_int mm, lapack_int *m,
           lapack_int *ifaill, lapack_int *ifailr)
       lapack_int LAPACKE_chsein (int matrix_layout, char job, char eigsrc,
           char initv, const lapack_logical *select, lapack_int n, const
           lapack_complex_float *h, lapack_int ldh, lapack_complex_float *w,
           lapack_complex_float *vl, lapack_int ldvl, lapack_complex_float *vr,
           lapack_int ldvr, lapack_int mm, lapack_int *m, lapack_int *ifaill,
           lapack_int *ifailr)
       lapack_int LAPACKE_zhsein (int matrix_layout, char job, char eigsrc,
           char initv, const lapack_logical *select, lapack_int n, const
           lapack_complex_double *h, lapack_int ldh, lapack_complex_double *w,
           lapack_complex_double *vl, lapack_int ldvl, lapack_complex_double
           *vr, lapack_int ldvr, lapack_int mm, lapack_int *m, lapack_int
           *ifaill, lapack_int *ifailr)

<sparkle>spot the glow-up</sparkle>: the real ones (s/d) get float *wr + const float *wi and a non-const lapack_logical *select; the complex ones (c/z) get a single w instead, and select becomes const lapack_logical *select. Also every single one carries ifaill and ifailr — two little snitch pointers telling you which vectors failed. ngl, very demure, very mindful of them honestly 😌


       lapack_int LAPACKE_shseqr (int matrix_layout, char job, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, float *h, lapack_int
           ldh, float *wr, float *wi, float *z, lapack_int ldz)
       lapack_int LAPACKE_dhseqr (int matrix_layout, char job, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, double *h, lapack_int
           ldh, double *wr, double *wi, double *z, lapack_int ldz)
       lapack_int LAPACKE_chseqr (int matrix_layout, char job, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float
           *h, lapack_int ldh, lapack_complex_float *w, lapack_complex_float
           *z, lapack_int ldz)
       lapack_int LAPACKE_zhseqr (int matrix_layout, char job, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double
           *h, lapack_int ldh, lapack_complex_double *w, lapack_complex_double
           *z, lapack_int ldz)

ilo and ihi besties!! baby's first balancing indices 🎀 same deal as before: s/d split real and imaginary into wr/wi, c/z keep it in one w. The way the complex versions just don't need the split? main character energy.


Now the LAPACK-auxiliary corner of the header — this is where it gets unhinged in the best way 🌈 because check it, ?lacgv and ?lacn2 don't even take a matrix_layout. Not every function here does. Read your signatures, bestie.

       lapack_int LAPACKE_clacgv (lapack_int n, lapack_complex_float *x,
           lapack_int incx)
       lapack_int LAPACKE_zlacgv (lapack_int n, lapack_complex_double *x,
           lapack_int incx)
       lapack_int LAPACKE_slacn2 (lapack_int n, float *v, float *x, lapack_int
           *isgn, float *est, lapack_int *kase, lapack_int *isave)
       lapack_int LAPACKE_dlacn2 (lapack_int n, double *v, double *x,
           lapack_int *isgn, double *est, lapack_int *kase, lapack_int *isave)
       lapack_int LAPACKE_clacn2 (lapack_int n, lapack_complex_float *v,
           lapack_complex_float *x, float *est, lapack_int *kase, lapack_int
           *isave)
       lapack_int LAPACKE_zlacn2 (lapack_int n, lapack_complex_double *v,
           lapack_complex_double *x, double *est, lapack_int *kase, lapack_int
           *isave)

manifesting that est pointer is where your estimate lands, and kase/isave are the little state-tracking duo you have to keep passing back in. The real ones get isgn, the complex ones don't — and clacn2/zlacn2 keep est as a real float/double even though v and x are complex. she's bilingual, she's doing both. 💜


Copy-ocracy time 🎀 these ones take m and n and an uplo and just move your data around:

       lapack_int LAPACKE_slacpy (int matrix_layout, char uplo, lapack_int m,
           lapack_int n, const float *a, lapack_int lda, float *b, lapack_int
           ldb)
       lapack_int LAPACKE_dlacpy (int matrix_layout, char uplo, lapack_int m,
           lapack_int n, const double *a, lapack_int lda, double *b, lapack_int
           ldb)
       lapack_int LAPACKE_clacpy (int matrix_layout, char uplo, lapack_int m,
           lapack_int n, const lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zlacpy (int matrix_layout, char uplo, lapack_int m,
           lapack_int n, const lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_clacp2 (int matrix_layout, char uplo, lapack_int m,
           lapack_int n, const float *a, lapack_int lda, lapack_complex_float
           *b, lapack_int ldb)
       lapack_int LAPACKE_zlacp2 (int matrix_layout, char uplo, lapack_int m,
           lapack_int n, const double *a, lapack_int lda, lapack_complex_double
           *b, lapack_int ldb)

?lacpy is same-to-same, ?lacp2 is real-into-complex (that's the 2 doing the work, lowkey iconic 👑). And then the precision-narrowing/widening girlies:

       lapack_int LAPACKE_zlag2c (int matrix_layout, lapack_int m, lapack_int
           n, const lapack_complex_double *a, lapack_int lda,
           lapack_complex_float *sa, lapack_int ldsa)
       lapack_int LAPACKE_slag2d (int matrix_layout, lapack_int m, lapack_int
           n, const float *sa, lapack_int ldsa, double *a, lapack_int lda)
       lapack_int LAPACKE_dlag2s (int matrix_layout, lapack_int m, lapack_int
           n, const double *a, lapack_int lda, float *sa, lapack_int ldsa)
       lapack_int LAPACKE_clag2z (int matrix_layout, lapack_int m, lapack_int
           n, const lapack_complex_float *sa, lapack_int ldsa,
           lapack_complex_double *a, lapack_int lda)

certified g2 moment 🧚 — zlag2c, slag2d, dlag2s, clag2z, all four directions of precision hopscotch. And the way the s-prefixed source buffers are named sa while the target is plain a (and vice versa in zlag2c / slag2d)? the naming is consistent, she's consistent, we love her. ✨


       lapack_int LAPACKE_slagge (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int kl, lapack_int ku, const float *d, float *a,
           lapack_int lda, lapack_int *iseed)
       lapack_int LAPACKE_dlagge (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int kl, lapack_int ku, const double *d, double *a,
           lapack_int lda, lapack_int *iseed)
       lapack_int LAPACKE_clagge (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int kl, lapack_int ku, const float *d,
           lapack_complex_float *a, lapack_int lda, lapack_int *iseed)
       lapack_int LAPACKE_zlagge (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int kl, lapack_int ku, const double *d,
           lapack_complex_double *a, lapack_int lda, lapack_int *iseed)

kl, ku, plus iseed — the seed pointer is not const, so yeah, it gets mutated. Keep that in your notes 📓 Also clagge/zlagge take a real d but a complex a — real diagonal, complex everything else. Slay.


okay the return types change here and this is the part where you sit up straight 🌈 LAPACKE_slamch and LAPACKE_dlamch don't return lapack_int — they return float and double, and they take exactly one lonely char cmach. One char. One float. That's it. That's the whole girl. 💀

       float LAPACKE_slamch (char cmach)
       double LAPACKE_dlamch (char cmach)
       float LAPACKE_slange (int matrix_layout, char norm, lapack_int m,
           lapack_int n, const float *a, lapack_int lda)
       double LAPACKE_dlange (int matrix_layout, char norm, lapack_int m,
           lapack_int n, const double *a, lapack_int lda)
       float LAPACKE_clange (int matrix_layout, char norm, lapack_int m,
           lapack_int n, const lapack_complex_float *a, lapack_int lda)
       double LAPACKE_zlange (int matrix_layout, char norm, lapack_int m,
           lapack_int n, const lapack_complex_double *a, lapack_int lda)
       float LAPACKE_clanhe (int matrix_layout, char norm, char uplo,
           lapack_int n, const lapack_complex_float *a, lapack_int lda)
       double LAPACKE_zlanhe (int matrix_layout, char norm, char uplo,
           lapack_int n, const lapack_complex_double *a, lapack_int lda)

same energy for the ?lange / ?lanhe family — those return float/double too, not lapack_int. And ?lanhe is complex-only (clanhe, zlanhe), takes both norm and uplo, and only an n — square matrix detected, she said no m for me thanks. 🎀


       lapack_int LAPACKE_clacrm (int matrix_layout, lapack_int m, lapack_int
           n, const lapack_complex_float *a, lapack_int lda, const float *b,
           lapack_int ldb, lapack_complex_float *c, lapack_int ldc)
       lapack_int LAPACKE_zlacrm (int matrix_layout, lapack_int m, lapack_int
           n, const lapack_complex_double *a, lapack_int lda, const double *b,
           lapack_int ldb, lapack_complex_double *c, lapack_int ldc)
       lapack_int LAPACKE_clarcm (int matrix_layout, lapack_int m, lapack_int
           n, const float *a, lapack_int lda, const lapack_complex_float *b,
           lapack_int ldb, lapack_complex_float *c, lapack_int ldc)
       lapack_int LAPACKE_zlarcm (int matrix_layout, lapack_int m, lapack_int
           n, const double *a, lapack_int lda, const lapack_complex_double *b,
           lapack_int ldb, lapack_complex_double *c, lapack_int ldc)

do NOT mix up lacrm and larcm bestie I'm begging you 😭 — c...lacrm = complex a, real b; c...larcm = real a, complex b. Both spit a complex c. One letter apart. One letter. That's the whole difference. Write it down, screenshot it, whatever. 🙈


       float LAPACKE_slansy (int matrix_layout, char norm, char uplo,
           lapack_int n, const float *a, lapack_int lda)
       double LAPACKE_dlansy (int matrix_layout, char norm, char uplo,
           lapack_int n, const double *a, lapack_int lda)
       float LAPACKE_clansy (int matrix_layout, char norm, char uplo,
           lapack_int n, const lapack_complex_float *a, lapack_int lda)
       double LAPACKE_zlansy (int matrix_layout, char norm, char uplo,
           lapack_int n, const lapack_complex_double *a, lapack_int lda)
       float LAPACKE_slantr (int matrix_layout, char norm, char uplo, char
           diag, lapack_int m, lapack_int n, const float *a, lapack_int lda)
       double LAPACKE_dlantr (int matrix_layout, char norm, char uplo, char
           diag, lapack_int m, lapack_int n, const double *a, lapack_int lda)
       float LAPACKE_clantr (int matrix_layout, char norm, char uplo, char
           diag, lapack_int m, lapack_int n, const lapack_complex_float *a,
           lapack_int lda)
       double LAPACKE_zlantr (int matrix_layout, char norm, char uplo, char
           diag, lapack_int m, lapack_int n, const lapack_complex_double *a,
           lapack_int lda)

?lansy gets norm + uplo + n; ?lantr gets norm + uplo + diag + m + n — triangle mode unlocked 🔺 and yes, all of these return actual float/double, keep your lapack_int expectations in your purse, they don't apply here 💅


Last stretch for this part, the ?larfb quad coming in hot 🔥:

       lapack_int LAPACKE_slarfb (int matrix_layout, char side, char trans,
           char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
           const float *v, lapack_int ldv, const float *t, lapack_int ldt,
           float *c, lapack_int ldc)
       lapack_int LAPACKE_dlarfb (int matrix_layout, char side, char trans,
           char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
           const double *v, lapack_int ldv, const double *t, lapack_int ldt,
           double *c, lapack_int ldc)
       lapack_int LAPACKE_clarfb (int matrix_layout, char side, char trans,
           char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
           const lapack_complex_float *v, lapack_int ldv, const
           lapack_complex_float *t, lapack_int ldt, lapack_complex_float *c,
           lapack_int ldc)

four chars before you even reach a number: side, trans, direct, storev — the quadruple threat, she ate and left absolutely no crumbs 🍓 then m, n, k, then v/ldv/t/ldt/c/ldc. Beautiful. Symmetrical. Chef's kiss. 😌

And the double-complex one is right there, she's literally mid-sentence —

       lapack_int LAPACKE_zlarfb (int matrix_layout, char side, char trans,
           char direct, char storev, lapack_int m, lapack_int n, lapack_int k,

(and we are cutting off exactly there, bestie — zlarfb's argument list keeps going in the next part, do not @ me, it's not my fault 💀)

…and we're literally walking into the group chat mid-sentence, because this signature started in the last part and it ends right here:

           const lapack_complex_double *v, lapack_int ldv, const
           lapack_complex_double *t, lapack_int ldt, lapack_complex_double *c,
           lapack_int ldc)

okay so don't panic, that's just the tail end of one of those complex-precision calls — ldv, ldt, ldc leading dims, v and t read-only, c getting written into. classic. moving on 💅


✨ the larfg girlies ✨

the Householder family, one per precision. n, alpha, x, incx, tau — she's giving "make this vector point somewhere else" energy and honestly? iconic.

       lapack_int LAPACKE_slarfg (lapack_int n, float *alpha, float *x,
           lapack_int incx, float *tau)
       lapack_int LAPACKE_dlarfg (lapack_int n, double *alpha, double *x,
           lapack_int incx, double *tau)
       lapack_int LAPACKE_clarfg (lapack_int n, lapack_complex_float *alpha,
           lapack_complex_float *x, lapack_int incx, lapack_complex_float *tau)
       lapack_int LAPACKE_zlarfg (lapack_int n, lapack_complex_double *alpha,
           lapack_complex_double *x, lapack_int incx, lapack_complex_double
           *tau)

note how clarfg and zlarfg keep alpha/x/tau typed as the complex flavour, no sneaky floats sneaking in. precision-consistent, we love to see it 🫶


🎀 larft — the triangular glow-up 🎀

these ones got the full matrix_layout, direct, storev, n, k, v, ldv, tau, t, ldt treatment. two chars of vibe (direct, storev) and a whole lotta leading dimensions.

       lapack_int LAPACKE_slarft (int matrix_layout, char direct, char storev,
           lapack_int n, lapack_int k, const float *v, lapack_int ldv, const
           float *tau, float *t, lapack_int ldt)
       lapack_int LAPACKE_dlarft (int matrix_layout, char direct, char storev,
           lapack_int n, lapack_int k, const double *v, lapack_int ldv, const
           double *tau, double *t, lapack_int ldt)
       lapack_int LAPACKE_clarft (int matrix_layout, char direct, char storev,
           lapack_int n, lapack_int k, const lapack_complex_float *v,
           lapack_int ldv, const lapack_complex_float *tau,
           lapack_complex_float *t, lapack_int ldt)
       lapack_int LAPACKE_zlarft (int matrix_layout, char direct, char storev,
           lapack_int n, lapack_int k, const lapack_complex_double *v,
           lapack_int ldv, const lapack_complex_double *tau,
           lapack_complex_double *t, lapack_int ldt)

v and tau are const (read-only besties, don't touch), t is the one getting filled in. periodt. ✨


🔥 larfx — the low-key workhorse 🔥

side, m, n, v, a scalar tau, c, ldc, and a work array at the end. yes bestie, you do have to hand her a scratch buffer, that's not optional, that *work is right there in the signature.

       lapack_int LAPACKE_slarfx (int matrix_layout, char side, lapack_int m,
           lapack_int n, const float *v, float tau, float *c, lapack_int ldc,
           float *work)
       lapack_int LAPACKE_dlarfx (int matrix_layout, char side, lapack_int m,
           lapack_int n, const double *v, double tau, double *c, lapack_int
           ldc, double *work)
       lapack_int LAPACKE_clarfx (int matrix_layout, char side, lapack_int m,
           lapack_int n, const lapack_complex_float *v, lapack_complex_float
           tau, lapack_complex_float *c, lapack_int ldc, lapack_complex_float
           *work)
       lapack_int LAPACKE_zlarfx (int matrix_layout, char side, lapack_int m,
           lapack_int n, const lapack_complex_double *v, lapack_complex_double
           tau, lapack_complex_double *c, lapack_int ldc, lapack_complex_double
           *work)

cc: tau is passed by value here, not as a pointer, and if that doesn't scream "I'm the cheap version" idk what does 💀


🌸 larnv — random but make it structured 🌸

idist picks the distribution, iseed is the seed array, n is how many, x is where they land. that's it, that's the whole vibe.

       lapack_int LAPACKE_slarnv (lapack_int idist, lapack_int *iseed,
           lapack_int n, float *x)
       lapack_int LAPACKE_dlarnv (lapack_int idist, lapack_int *iseed,
           lapack_int n, double *x)
       lapack_int LAPACKE_clarnv (lapack_int idist, lapack_int *iseed,
           lapack_int n, lapack_complex_float *x)
       lapack_int LAPACKE_zlarnv (lapack_int idist, lapack_int *iseed,
           lapack_int n, lapack_complex_double *x)

notice there's no matrix_layout here — no matrix, no layout, we're just filling a vector. main character energy, honestly. 👑


💜 lascl — scale it, but make it type-aware 💜

type, kl, ku, cfrom, cto, m, n, a, lda. and the tea: cfrom/cto are float for clascl but double for zlascl — yes, even the complex float one takes float bounds and the complex double one takes double bounds. look closely, it's right there.

       lapack_int LAPACKE_slascl (int matrix_layout, char type, lapack_int kl,
           lapack_int ku, float cfrom, float cto, lapack_int m, lapack_int n,
           float *a, lapack_int lda)
       lapack_int LAPACKE_dlascl (int matrix_layout, char type, lapack_int kl,
           lapack_int ku, double cfrom, double cto, lapack_int m, lapack_int n,
           double *a, lapack_int lda)
       lapack_int LAPACKE_clascl (int matrix_layout, char type, lapack_int kl,
           lapack_int ku, float cfrom, float cto, lapack_int m, lapack_int n,
           lapack_complex_float *a, lapack_int lda)
       lapack_int LAPACKE_zlascl (int matrix_layout, char type, lapack_int kl,
           lapack_int ku, double cfrom, double cto, lapack_int m, lapack_int n,
           lapack_complex_double *a, lapack_int lda)

kl and ku are right there in all four, so yeah, band info matters 🦋


⭐ laset — fill it in, bestie ⭐

uplo, m, n, alpha, beta, a, lda. alpha goes one place, beta goes another, and you get to choose which via uplo.

       lapack_int LAPACKE_slaset (int matrix_layout, char uplo, lapack_int m,
           lapack_int n, float alpha, float beta, float *a, lapack_int lda)
       lapack_int LAPACKE_dlaset (int matrix_layout, char uplo, lapack_int m,
           lapack_int n, double alpha, double beta, double *a, lapack_int lda)
       lapack_int LAPACKE_claset (int matrix_layout, char uplo, lapack_int m,
           lapack_int n, lapack_complex_float alpha, lapack_complex_float beta,
           lapack_complex_float *a, lapack_int lda)
       lapack_int LAPACKE_zlaset (int matrix_layout, char uplo, lapack_int m,
           lapack_int n, lapack_complex_double alpha, lapack_complex_double
           beta, lapack_complex_double *a, lapack_int lda)

🍓 lasrt — sort it out (literally) 🍓

the ONLY two in this whole batch with no matrix_layout. id picks the order, n is the count, d is the array. no matrices invited.

       lapack_int LAPACKE_slasrt (char id, lapack_int n, float *d)
       lapack_int LAPACKE_dlasrt (char id, lapack_int n, double *d)

and yes, there's no clasrt/zlasrt — complex numbers don't sort like that, that's just how it is, don't shoot the messenger 💀


🧚 lassq — sum of squares, safely 🧚

n, x, incx, then scale and sumsq, both as pointers because she's updating them. and look — classq takes float *scale, float *sumsq while zlassq takes double *scale, double *sumsq. match the precision, always.

       lapack_int LAPACKE_slassq (lapack_int n, float *x, lapack_int incx,
           float *scale, float *sumsq)
       lapack_int LAPACKE_dlassq (lapack_int n, double *x, lapack_int incx,
           double *scale, double *sumsq)
       lapack_int LAPACKE_classq (lapack_int n, lapack_complex_float *x,
           lapack_int incx, float *scale, float *sumsq)
       lapack_int LAPACKE_zlassq (lapack_int n, lapack_complex_double *x,
           lapack_int incx, double *scale, double *sumsq)

🌈 laswp — the row shuffle 🌈

n, a, lda, k1, k2, ipiv (const int array, hands off), incx. permutation energy, we stan.

       lapack_int LAPACKE_slaswp (int matrix_layout, lapack_int n, float *a,
           lapack_int lda, lapack_int k1, lapack_int k2, const lapack_int
           *ipiv, lapack_int incx)
       lapack_int LAPACKE_dlaswp (int matrix_layout, lapack_int n, double *a,
           lapack_int lda, lapack_int k1, lapack_int k2, const lapack_int
           *ipiv, lapack_int incx)
       lapack_int LAPACKE_claswp (int matrix_layout, lapack_int n,
           lapack_complex_float *a, lapack_int lda, lapack_int k1, lapack_int
           k2, const lapack_int *ipiv, lapack_int incx)
       lapack_int LAPACKE_zlaswp (int matrix_layout, lapack_int n,
           lapack_complex_double *a, lapack_int lda, lapack_int k1, lapack_int
           k2, const lapack_int *ipiv, lapack_int incx)

👑 latms — the whole test-matrix factory 👑

okay this is the big one, look at that parameter list. m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda. she's thorough and we respect it.

       lapack_int LAPACKE_slatms (int matrix_layout, lapack_int m, lapack_int
           n, char dist, lapack_int *iseed, char sym, float *d, lapack_int
           mode, float cond, float dmax, lapack_int kl, lapack_int ku, char
           pack, float *a, lapack_int lda)
       lapack_int LAPACKE_dlatms (int matrix_layout, lapack_int m, lapack_int
           n, char dist, lapack_int *iseed, char sym, double *d, lapack_int
           mode, double cond, double dmax, lapack_int kl, lapack_int ku, char
           pack, double *a, lapack_int lda)
       lapack_int LAPACKE_clatms (int matrix_layout, lapack_int m, lapack_int
           n, char dist, lapack_int *iseed, char sym, float *d, lapack_int
           mode, float cond, float dmax, lapack_int kl, lapack_int ku, char
           pack, lapack_complex_float *a, lapack_int lda)
       lapack_int LAPACKE_zlatms (int matrix_layout, lapack_int m, lapack_int
           n, char dist, lapack_int *iseed, char sym, double *d, lapack_int
           mode, double cond, double dmax, lapack_int kl, lapack_int ku, char
           pack, lapack_complex_double *a, lapack_int lda)

and yeah bestie, clatms has float *d and zlatms has double *d — d is real in both complex variants, that's not a typo, that's the design 🫶 also iseed is lapack_int *, not const, because random state moves.


💅 lauum — the triangular product 💅

uplo, n, a, lda. short, sweet, self-contained.

       lapack_int LAPACKE_slauum (int matrix_layout, char uplo, lapack_int n,
           float *a, lapack_int lda)
       lapack_int LAPACKE_dlauum (int matrix_layout, char uplo, lapack_int n,
           double *a, lapack_int lda)
       lapack_int LAPACKE_clauum (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *a, lapack_int lda)
       lapack_int LAPACKE_zlauum (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *a, lapack_int lda)

🌸 the op girlies: opgtr & opmtr 🌸

packed storage era. ap in, tau in, q out. ldq doing its lil job.

       lapack_int LAPACKE_sopgtr (int matrix_layout, char uplo, lapack_int n,
           const float *ap, const float *tau, float *q, lapack_int ldq)
       lapack_int LAPACKE_dopgtr (int matrix_layout, char uplo, lapack_int n,
           const double *ap, const double *tau, double *q, lapack_int ldq)

and the multiply version, which picks up side and trans too:

       lapack_int LAPACKE_sopmtr (int matrix_layout, char side, char uplo, char
           trans, lapack_int m, lapack_int n, const float *ap, const float
           *tau, float *c, lapack_int ldc)
       lapack_int LAPACKE_dopmtr (int matrix_layout, char side, char uplo, char
           trans, lapack_int m, lapack_int n, const double *ap, const double
           *tau, double *c, lapack_int ldc)

rip to copmtr/zopmtr, they're simply not in this lineup, that's the list, I don't make the rules 😭


🦋 the org saga — generating orthogonal / unitary matrices 🦋

okay this is a whole block of them, all real-precision (s and d only, no c/z here), all const tau, all writing into a.

       lapack_int LAPACKE_sorgbr (int matrix_layout, char vect, lapack_int m,
           lapack_int n, lapack_int k, float *a, lapack_int lda, const float
           *tau)
       lapack_int LAPACKE_dorgbr (int matrix_layout, char vect, lapack_int m,
           lapack_int n, lapack_int k, double *a, lapack_int lda, const double
           *tau)
       lapack_int LAPACKE_sorghr (int matrix_layout, lapack_int n, lapack_int
           ilo, lapack_int ihi, float *a, lapack_int lda, const float *tau)
       lapack_int LAPACKE_dorghr (int matrix_layout, lapack_int n, lapack_int
           ilo, lapack_int ihi, double *a, lapack_int lda, const double *tau)
       lapack_int LAPACKE_sorglq (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int k, float *a, lapack_int lda, const float *tau)
       lapack_int LAPACKE_dorglq (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int k, double *a, lapack_int lda, const double *tau)
       lapack_int LAPACKE_sorgql (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int k, float *a, lapack_int lda, const float *tau)
       lapack_int LAPACKE_dorgql (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int k, double *a, lapack_int lda, const double *tau)
       lapack_int LAPACKE_sorgqr (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int k, float *a, lapack_int lda, const float *tau)
       lapack_int LAPACKE_dorgqr (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int k, double *a, lapack_int lda, const double *tau)
       lapack_int LAPACKE_sorgrq (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int k, float *a, lapack_int lda, const float *tau)
       lapack_int LAPACKE_dorgrq (int matrix_layout, lapack_int m, lapack_int
           n, lapack_int k, double *a, lapack_int lda, const double *tau)
       lapack_int LAPACKE_sorgtr (int matrix_layout, char uplo, lapack_int n,
           float *a, lapack_int lda, const float *tau)
       lapack_int LAPACKE_dorgtr (int matrix_layout, char uplo, lapack_int n,
           double *a, lapack_int lda, const double *tau)

quick vibe check on the shapes: orgbr and the lq/ql/qr/rq crew all take m, n, k. orghr takes n, ilo, ihi instead — different beast, different args, don't mix them up. orgtr takes uplo and just n. know your signature, know yourself ✨


🔥 and now the orm multiply squad 🔥

same family but they apply the thing to c instead of building it. side, trans, and c + ldc show up in every single one.

       lapack_int LAPACKE_sormbr (int matrix_layout, char vect, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, const float *a,
           lapack_int lda, const float *tau, float *c, lapack_int ldc)
       lapack_int LAPACKE_dormbr (int matrix_layout, char vect, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, const double *a,
           lapack_int lda, const double *tau, double *c, lapack_int ldc)
       lapack_int LAPACKE_sormhr (int matrix_layout, char side, char trans,
           lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const
           float *a, lapack_int lda, const float *tau, float *c, lapack_int
           ldc)
       lapack_int LAPACKE_dormhr (int matrix_layout, char side, char trans,
           lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const
           double *a, lapack_int lda, const double *tau, double *c, lapack_int
           ldc)
       lapack_int LAPACKE_sormlq (int matrix_layout, char side, char trans,
           lapack_int m, lapack_int n, lapack_int k, const float *a, lapack_int
           lda, const float *tau, float *c, lapack_int ldc)
       lapack_int LAPACKE_dormlq (int matrix_layout, char side, char trans,
           lapack_int m, lapack_int n, lapack_int k, const double *a,
           lapack_int lda, const double *tau, double *c, lapack_int ldc)
       lapack_int LAPACKE_sormql (int matrix_layout, char side, char trans,
           lapack_int m, lapack_int n, lapack_int k, const float *a, lapack_int
           lda, const float *tau, float *c, lapack_int ldc)

ormbr is the only one with a vect argument up front — it's got two char selectors (vect and side) before trans, which is lowkey a lot but okay girl, we see you. ormhr matches orghr's ilo/ihi thing. everything else rides with k. 🎀


and that's where part 19 dips — the ormql complex siblings are literally queued up next, so don't go anywhere bestie 🫶

Okay so this next batch is the orm girlies and then a whole parade of band-matrix besties — stay with me, they're just prototypes, no lore needed 💅

lapack_int LAPACKE_dormql (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const double *a,
    lapack_int lda, const double *tau, double *c, lapack_int ldc)
lapack_int LAPACKE_sormqr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float *a, lapack_int
    lda, const float *tau, float *c, lapack_int ldc)
lapack_int LAPACKE_dormqr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const double *a,
    lapack_int lda, const double *tau, double *c, lapack_int ldc)
lapack_int LAPACKE_sormrq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float *a, lapack_int
    lda, const float *tau, float *c, lapack_int ldc)
lapack_int LAPACKE_dormrq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const double *a,
    lapack_int lda, const double *tau, double *c, lapack_int ldc)
lapack_int LAPACKE_sormrz (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, const float
    *a, lapack_int lda, const float *tau, float *c, lapack_int ldc)
lapack_int LAPACKE_dormrz (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, const double
    *a, lapack_int lda, const double *tau, double *c, lapack_int ldc)
lapack_int LAPACKE_sormtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const float *a, lapack_int lda,
    const float *tau, float *c, lapack_int ldc)
lapack_int LAPACKE_dormtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const double *a, lapack_int lda,
    const double *tau, double *c, lapack_int ldc)

Obsessed with how ormrz is the only one here with that extra lapack_int l — she brought a plus-one, iconic behavior, no notes 🎀


🌸 the pb* era begins

cond check energy

lapack_int LAPACKE_spbcon (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const float *ab, lapack_int ldab, float anorm, float
    *rcond)
lapack_int LAPACKE_dpbcon (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const double *ab, lapack_int ldab, double anorm,
    double *rcond)
lapack_int LAPACKE_cpbcon (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const lapack_complex_float *ab, lapack_int ldab,
    float anorm, float *rcond)
lapack_int LAPACKE_zpbcon (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const lapack_complex_double *ab, lapack_int ldab,
    double anorm, double *rcond)

equilibration slay

lapack_int LAPACKE_spbequ (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const float *ab, lapack_int ldab, float *s, float
    *scond, float *amax)
lapack_int LAPACKE_dpbequ (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const double *ab, lapack_int ldab, double *s, double
    *scond, double *amax)
lapack_int LAPACKE_cpbequ (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const lapack_complex_float *ab, lapack_int ldab,
    float *s, float *scond, float *amax)
lapack_int LAPACKE_zpbequ (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const lapack_complex_double *ab, lapack_int ldab,
    double *s, double *scond, double *amax)

refinement, but make it fashion

lapack_int LAPACKE_spbrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const float *ab, lapack_int ldab,
    const float *afb, lapack_int ldafb, const float *b, lapack_int ldb,
    float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_dpbrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const double *ab, lapack_int ldab,
    const double *afb, lapack_int ldafb, const double *b, lapack_int
    ldb, double *x, lapack_int ldx, double *ferr, double *berr)
lapack_int LAPACKE_cpbrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_float *ab,
    lapack_int ldab, const lapack_complex_float *afb, lapack_int ldafb,
    const lapack_complex_float *b, lapack_int ldb, lapack_complex_float
    *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_zpbrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_double *ab,
    lapack_int ldab, const lapack_complex_double *afb, lapack_int ldafb,
    const lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *x, lapack_int ldx, double *ferr, double
    *berr)

Notice how the ferr/berr pair rides at the end of every single one? Consistency queen behavior, we love a predictable finale ✨

factorization, the prequel

lapack_int LAPACKE_spbstf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kb, float *bb, lapack_int ldbb)
lapack_int LAPACKE_dpbstf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kb, double *bb, lapack_int ldbb)
lapack_int LAPACKE_cpbstf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kb, lapack_complex_float *bb, lapack_int ldbb)
lapack_int LAPACKE_zpbstf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kb, lapack_complex_double *bb, lapack_int ldbb)
Side quest: yes, these use kb and bb and ldbb while their neighbors use kd, ab, ldab. That's just how the page spells them — copy them exactly, don't get cute with it 🙈

straight up solving

lapack_int LAPACKE_spbsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, float *ab, lapack_int ldab, float
    *b, lapack_int ldb)
lapack_int LAPACKE_dpbsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, double *ab, lapack_int ldab, double
    *b, lapack_int ldb)
lapack_int LAPACKE_cpbsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, lapack_complex_float *ab, lapack_int
    ldab, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zpbsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, lapack_complex_double *ab,
    lapack_int ldab, lapack_complex_double *b, lapack_int ldb)

solving but with ✨extras✨

lapack_int LAPACKE_spbsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, float *ab, lapack_int
    ldab, float *afb, lapack_int ldafb, char *equed, float *s, float *b,
    lapack_int ldb, float *x, lapack_int ldx, float *rcond, float *ferr,
    float *berr)
lapack_int LAPACKE_dpbsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, double *ab, lapack_int
    ldab, double *afb, lapack_int ldafb, char *equed, double *s, double
    *b, lapack_int ldb, double *x, lapack_int ldx, double *rcond, double
    *ferr, double *berr)
lapack_int LAPACKE_cpbsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, lapack_complex_float
    *ab, lapack_int ldab, lapack_complex_float *afb, lapack_int ldafb,
    char *equed, float *s, lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *x, lapack_int ldx, float *rcond, float *ferr,
    float *berr)
lapack_int LAPACKE_zpbsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, lapack_complex_double
    *ab, lapack_int ldab, lapack_complex_double *afb, lapack_int ldafb,
    char *equed, double *s, lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *x, lapack_int ldx, double *rcond, double
    *ferr, double *berr)

Not the char *equed and the float *s / double *s sneaking in between all the complex types 😭 she's got range, she contains multitudes 🦋

the trf trio-adjacent moment

lapack_int LAPACKE_spbtrf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, float *ab, lapack_int ldab)
lapack_int LAPACKE_dpbtrf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, double *ab, lapack_int ldab)
lapack_int LAPACKE_cpbtrf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_complex_float *ab, lapack_int ldab)
lapack_int LAPACKE_zpbtrf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_complex_double *ab, lapack_int ldab)

and the solve to match 🫶

lapack_int LAPACKE_spbtrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const float *ab, lapack_int ldab,
    float *b, lapack_int ldb)
lapack_int LAPACKE_dpbtrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const double *ab, lapack_int ldab,
    double *b, lapack_int ldb)
lapack_int LAPACKE_cpbtrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_float *ab,
    lapack_int ldab, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zpbtrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_double *ab,
    lapack_int ldab, lapack_complex_double *b, lapack_int ldb)

Quick vibe check: trf takes the ab as plain *ab, but trs takes it as const *ab — that const is doing a whole lot of emotional labor and we respect her 💅


🧚 the pf* girls (packed storage, packed with drama)

trf but packed

lapack_int LAPACKE_spftrf (int matrix_layout, char transr, char uplo,
    lapack_int n, float *a)
lapack_int LAPACKE_dpftrf (int matrix_layout, char transr, char uplo,
    lapack_int n, double *a)
lapack_int LAPACKE_cpftrf (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_float *a)
lapack_int LAPACKE_zpftrf (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_double *a)

Heads up bestie</> 🎀 these switched from uplo-then-trans energy to transr — yes it's spelled transr, yes it's different, no you may not "correct" it, that's literally the whole point of the flag 🌸

inverse, packed, effortless

lapack_int LAPACKE_spftri (int matrix_layout, char transr, char uplo,
    lapack_int n, float *a)
lapack_int LAPACKE_dpftri (int matrix_layout, char transr, char uplo,
    lapack_int n, double *a)
lapack_int LAPACKE_cpftri (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_float *a)
lapack_int LAPACKE_zpftri (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_double *a)

solve time, packed edition

lapack_int LAPACKE_spftrs (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_int nrhs, const float *a, float *b, lapack_int
    ldb)
lapack_int LAPACKE_dpftrs (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_int nrhs, const double *a, double *b,
    lapack_int ldb)
lapack_int LAPACKE_cpftrs (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zpftrs (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
    lapack_complex_double *b, lapack_int ldb)

See how the pf crew has no lda at all? No leading dimension, no problems, she's low-maintenance like that 😌


👑 the po* section, where things get uppercase-N normal

cond, but for symmetric/Hermitian pos-def

lapack_int LAPACKE_spocon (int matrix_layout, char uplo, lapack_int n,
    const float *a, lapack_int lda, float anorm, float *rcond)
lapack_int LAPACKE_dpocon (int matrix_layout, char uplo, lapack_int n,
    const double *a, lapack_int lda, double anorm, double *rcond)
lapack_int LAPACKE_cpocon (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float *a, lapack_int lda, float anorm, float
    *rcond)
lapack_int LAPACKE_zpocon (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double *a, lapack_int lda, double anorm, double
    *rcond)
Ngl the const on the a here is a whole mood — she's read-only, she's not getting messed with, periodt 💀

equ, the glow-up pass

lapack_int LAPACKE_spoequ (int matrix_layout, lapack_int n, const float
    *a, lapack_int lda, float *s, float *scond, float *amax)
lapack_int LAPACKE_dpoequ (int matrix_layout, lapack_int n, const double
    *a, lapack_int lda, double *s, double *scond, double *amax)
lapack_int LAPACKE_cpoequ (int matrix_layout, lapack_int n, const
    lapack_complex_float *a, lapack_int lda, float *s, float *scond,
    float *amax)

And that's exactly where this part wraps — mid-poequ family, no z in sight yet, so don't you dare assume one's coming next 👀 stay tuned 💖

okay bestie, buckle UP, because this stretch of the synopsis is basically a parade of LAPACK's positive-definite era 💅 every single one of these bad boys hands you back a lapack_int and starts with matrix_layout, that's the vibe check they all pass. no cap. ✨

first up, the poequ girlies — they take n, a, lda and hand you back s, scond and amax:

lapack_int LAPACKE_zpoequ (int matrix_layout, lapack_int n, const
    lapack_complex_double *a, lapack_int lda, double *s, double *scond,
    double *amax)

and then the poequb fam, one for each of the four precisions (s, d, c, z — you can literally see which is which from the types, iykyk 🦋):

lapack_int LAPACKE_spoequb (int matrix_layout, lapack_int n, const float
    *a, lapack_int lda, float *s, float *scond, float *amax)
lapack_int LAPACKE_dpoequb (int matrix_layout, lapack_int n, const
    double *a, lapack_int lda, double *s, double *scond, double *amax)
lapack_int LAPACKE_cpoequb (int matrix_layout, lapack_int n, const
    lapack_complex_float *a, lapack_int lda, float *s, float *scond,
    float *amax)
lapack_int LAPACKE_zpoequb (int matrix_layout, lapack_int n, const
    lapack_complex_double *a, lapack_int lda, double *s, double *scond,
    double *amax)

🎀 the porfs crew — refinement era

the way these take both a and af, plus lda and ldaf, and hand you x alongside ferr and berr… main character energy fr fr 🔥

lapack_int LAPACKE_sporfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float *a, lapack_int lda, const float *af,
    lapack_int ldaf, const float *b, lapack_int ldb, float *x,
    lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_dporfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double *a, lapack_int lda, const double *af,
    lapack_int ldaf, const double *b, lapack_int ldb, double *x,
    lapack_int ldx, double *ferr, double *berr)
lapack_int LAPACKE_cporfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
    const lapack_complex_float *af, lapack_int ldaf, const
    lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
    lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_zporfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
    const lapack_complex_double *af, lapack_int ldaf, const
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
    lapack_int ldx, double *ferr, double *berr)

and then porfsx said "hold my matcha" 🍓 — extra equed on the way in, extra s, extra rcond, and the whole error-bounds situation (n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params). it's giving thorough:

lapack_int LAPACKE_sporfsx (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const
    float *af, lapack_int ldaf, const float *s, const float *b,
    lapack_int ldb, float *x, lapack_int ldx, float *rcond, float *berr,
    lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp,
    lapack_int nparams, float *params)
lapack_int LAPACKE_dporfsx (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const double *a, lapack_int lda,
    const double *af, lapack_int ldaf, const double *s, const double *b,
    lapack_int ldb, double *x, lapack_int ldx, double *rcond, double
    *berr, lapack_int n_err_bnds, double *err_bnds_norm, double
    *err_bnds_comp, lapack_int nparams, double *params)
lapack_int LAPACKE_cporfsx (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
    lapack_int lda, const lapack_complex_float *af, lapack_int ldaf,
    const float *s, const lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *x, lapack_int ldx, float *rcond, float *berr,
    lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp,
    lapack_int nparams, float *params)
lapack_int LAPACKE_zporfsx (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
    lapack_int lda, const lapack_complex_double *af, lapack_int ldaf,
    const double *s, const lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *x, lapack_int ldx, double *rcond, double
    *berr, lapack_int n_err_bnds, double *err_bnds_norm, double
    *err_bnds_comp, lapack_int nparams, double *params)

notice how the complex ones still take a real s, rcond, berr? that's not a typo bestie, that's just how they roll 💅


👑 posv — the four originals

quadratic in a, b, and honestly in my heart:

lapack_int LAPACKE_sposv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, float *a, lapack_int lda, float *b, lapack_int ldb)
lapack_int LAPACKE_dposv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, double *a, lapack_int lda, double *b, lapack_int
    ldb)
lapack_int LAPACKE_cposv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zposv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *b, lapack_int ldb)
🫶 ok but lowkey pay attention to which pointers are const and which aren't — sposv/dposv/cposv/zposv have a mutable a and b, unlike a bunch of the others. the signatures do not lie.

then the two mixed-precision-cuties, dsposv and zcposv, who bring along x, ldx and an iter pointer (lapack_int *iter — they're iterating, periodt):

lapack_int LAPACKE_dsposv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, double *a, lapack_int lda, double *b, lapack_int
    ldb, double *x, lapack_int ldx, lapack_int *iter)
lapack_int LAPACKE_zcposv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
    lapack_int ldx, lapack_int *iter)

✨ posvx — now with fact and equed

they showed up with fact, uplo, equed, s, rcond, ferr, berr… it's giving full glam 🌸

lapack_int LAPACKE_sposvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *af,
    lapack_int ldaf, char *equed, float *s, float *b, lapack_int ldb,
    float *x, lapack_int ldx, float *rcond, float *ferr, float *berr)
lapack_int LAPACKE_dposvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double
    *af, lapack_int ldaf, char *equed, double *s, double *b, lapack_int
    ldb, double *x, lapack_int ldx, double *rcond, double *ferr, double
    *berr)
lapack_int LAPACKE_cposvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *af, lapack_int ldaf, char *equed, float
    *s, lapack_complex_float *b, lapack_int ldb, lapack_complex_float
    *x, lapack_int ldx, float *rcond, float *ferr, float *berr)
lapack_int LAPACKE_zposvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *af, lapack_int ldaf, char *equed, double
    *s, lapack_complex_double *b, lapack_int ldb, lapack_complex_double
    *x, lapack_int ldx, double *rcond, double *ferr, double *berr)

and posvxx said "add rpvgrw and the error bounds, we're going ✨all in✨":

lapack_int LAPACKE_sposvxx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *af,
    lapack_int ldaf, char *equed, float *s, float *b, lapack_int ldb,
    float *x, lapack_int ldx, float *rcond, float *rpvgrw, float *berr,
    lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp,
    lapack_int nparams, float *params)
lapack_int LAPACKE_dposvxx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double
    *af, lapack_int ldaf, char *equed, double *s, double *b, lapack_int
    ldb, double *x, lapack_int ldx, double *rcond, double *rpvgrw,
    double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double
    *err_bnds_comp, lapack_int nparams, double *params)
lapack_int LAPACKE_cposvxx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *af, lapack_int ldaf, char *equed, float
    *s, lapack_complex_float *b, lapack_int ldb, lapack_complex_float
    *x, lapack_int ldx, float *rcond, float *rpvgrw, float *berr,
    lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp,
    lapack_int nparams, float *params)
lapack_int LAPACKE_zposvxx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *af, lapack_int ldaf, char *equed, double
    *s, lapack_complex_double *b, lapack_int ldb, lapack_complex_double
    *x, lapack_int ldx, double *rcond, double *rpvgrw, double *berr,
    lapack_int n_err_bnds, double *err_bnds_norm, double *err_bnds_comp,
    lapack_int nparams, double *params)

💜 potrf2 then potrf

okay so the 2 versions come first in the page, and they're the short ones — just matrix_layout, uplo, n, a, lda:

lapack_int LAPACKE_spotrf2 (int matrix_layout, char uplo, lapack_int n,
    float *a, lapack_int lda)
lapack_int LAPACKE_dpotrf2 (int matrix_layout, char uplo, lapack_int n,
    double *a, lapack_int lda)
lapack_int LAPACKE_cpotrf2 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float *a, lapack_int lda)
lapack_int LAPACKE_zpotrf2 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double *a, lapack_int lda)

and their non-2 twins, identical signature, living right after:

lapack_int LAPACKE_spotrf (int matrix_layout, char uplo, lapack_int n,
    float *a, lapack_int lda)
lapack_int LAPACKE_dpotrf (int matrix_layout, char uplo, lapack_int n,
    double *a, lapack_int lda)
lapack_int LAPACKE_cpotrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float *a, lapack_int lda)
lapack_int LAPACKE_zpotrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double *a, lapack_int lda)

no bestie I will NOT be picking favourites between them 🙈


🧚 potri and potrs

potri is also the tiny five-arg squad:

lapack_int LAPACKE_spotri (int matrix_layout, char uplo, lapack_int n,
    float *a, lapack_int lda)
lapack_int LAPACKE_dpotri (int matrix_layout, char uplo, lapack_int n,
    double *a, lapack_int lda)
lapack_int LAPACKE_cpotri (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float *a, lapack_int lda)
lapack_int LAPACKE_zpotri (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double *a, lapack_int lda)

potrs brings nrhs along and — heads up — its a is const while b is mutable:

lapack_int LAPACKE_spotrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float *a, lapack_int lda, float *b,
    lapack_int ldb)
lapack_int LAPACKE_dpotrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double *a, lapack_int lda, double *b,
    lapack_int ldb)
lapack_int LAPACKE_cpotrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zpotrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *b, lapack_int ldb)

🦋 packed-storage o'clock — ppcon and ppequ

now we're in ap-town (packed, no lda, she said "who needs a leading dimension anyway") 😭 ppcon takes anorm and gives you rcond:

lapack_int LAPACKE_sppcon (int matrix_layout, char uplo, lapack_int n,
    const float *ap, float anorm, float *rcond)
lapack_int LAPACKE_dppcon (int matrix_layout, char uplo, lapack_int n,
    const double *ap, double anorm, double *rcond)
lapack_int LAPACKE_cppcon (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float *ap, float anorm, float *rcond)
lapack_int LAPACKE_zppcon (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double *ap, double anorm, double *rcond)

and ppequ gives you the s, scond, amax trio, same deal, packed:

lapack_int LAPACKE_sppequ (int matrix_layout, char uplo, lapack_int n,
    const float *ap, float *s, float *scond, float *amax)
lapack_int LAPACKE_dppequ (int matrix_layout, char uplo, lapack_int n,
    const double *ap, double *s, double *scond, double *amax)
lapack_int LAPACKE_cppequ (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float *ap, float *s, float *scond, float *amax)
lapack_int LAPACKE_zppequ (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double *ap, double *s, double *scond, double
    *amax)

that's the whole sweep of this chunk — every lapack_int, every const, every lda/ldaf/ldb/ldx, every n_err_bnds, all accounted for, periodt 🔥 keeping going, there's more synopsis to slay ⭐

...and the packed-storage saga continues, bestie, because LAPACK is obsessed with not storing your zeros 💅. Same cast of characters as always: matrix_layout, uplo, n, nrhs, ldb, ldx, ferr, berr — you already know them, you're practically mutuals at this point.

🫶 the pprfs girlies — packed positive-definite refine & solve

lapack_int LAPACKE_spprfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float *ap, const float *afp, const float *b,
    lapack_int ldb, float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_dpprfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double *ap, const double *afp, const double
    *b, lapack_int ldb, double *x, lapack_int ldx, double *ferr, double
    *berr)
lapack_int LAPACKE_cpprfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float *ap, const
    lapack_complex_float *afp, const lapack_complex_float *b, lapack_int
    ldb, lapack_complex_float *x, lapack_int ldx, float *ferr, float
    *berr)
lapack_int LAPACKE_zpprfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double *ap, const
    lapack_complex_double *afp, const lapack_complex_double *b,
    lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double
    *ferr, double *berr)

Four precisions, one vibe ✨. Notice ferr and berr are always real even when everything else is complex — that's not a typo, that's just how she is 💅.


🎀 ppsv — packed, positive-definite, direct solve

lapack_int LAPACKE_sppsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, float *ap, float *b, lapack_int ldb)
lapack_int LAPACKE_dppsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, double *ap, double *b, lapack_int ldb)
lapack_int LAPACKE_cppsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float *ap, lapack_complex_float *b,
    lapack_int ldb)
lapack_int LAPACKE_zppsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double *ap, lapack_complex_double
    *b, lapack_int ldb)

No afp, no ferr, no berr — she's low-maintenance, she just goes 🔥.


💖 ppsvx — the one with the whole entire entourage

lapack_int LAPACKE_sppsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, float *ap, float *afp, char *equed,
    float *s, float *b, lapack_int ldb, float *x, lapack_int ldx, float
    *rcond, float *ferr, float *berr)
lapack_int LAPACKE_dppsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, double *ap, double *afp, char *equed,
    double *s, double *b, lapack_int ldb, double *x, lapack_int ldx,
    double *rcond, double *ferr, double *berr)
lapack_int LAPACKE_cppsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float *ap,
    lapack_complex_float *afp, char *equed, float *s,
    lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
    lapack_int ldx, float *rcond, float *ferr, float *berr)
lapack_int LAPACKE_zppsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double *ap,
    lapack_complex_double *afp, char *equed, double *s,
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
    lapack_int ldx, double *rcond, double *ferr, double *berr)

fact, equed, s, rcond… it's giving full glam 😭. And again: s, rcond, ferr and berr stay real in the complex versions. Iconic behaviour, no notes 🌸.


🦋 pptrf — packed Cholesky factorization, that's it, that's the function

lapack_int LAPACKE_spptrf (int matrix_layout, char uplo, lapack_int n,
    float *ap)
lapack_int LAPACKE_dpptrf (int matrix_layout, char uplo, lapack_int n,
    double *ap)
lapack_int LAPACKE_cpptrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float *ap)
lapack_int LAPACKE_zpptrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double *ap)

Five arguments and a dream ✨.


💜 pptri — same energy, but she inverts

lapack_int LAPACKE_spptri (int matrix_layout, char uplo, lapack_int n,
    float *ap)
lapack_int LAPACKE_dpptri (int matrix_layout, char uplo, lapack_int n,
    double *ap)
lapack_int LAPACKE_cpptri (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float *ap)
lapack_int LAPACKE_zpptri (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double *ap)

Literally pptrf's twin but with the i — don't mix them up, bestie, that's a whole different plot twist 🙈.


🌈 pptrs — packed triangular solve, multi-rhs edition

lapack_int LAPACKE_spptrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float *ap, float *b, lapack_int ldb)
lapack_int LAPACKE_dpptrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double *ap, double *b, lapack_int ldb)
lapack_int LAPACKE_cpptrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float *ap,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zpptrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double *ap,
    lapack_complex_double *b, lapack_int ldb)

ap is const (she's read-only, respectful 👑), b is not (she gets overwritten, that's the whole point).


🍓 pstrf — pivoted Cholesky, now with rank and tolerance

lapack_int LAPACKE_spstrf (int matrix_layout, char uplo, lapack_int n,
    float *a, lapack_int lda, lapack_int *piv, lapack_int *rank, float
    tol)
lapack_int LAPACKE_dpstrf (int matrix_layout, char uplo, lapack_int n,
    double *a, lapack_int lda, lapack_int *piv, lapack_int *rank, double
    tol)
lapack_int LAPACKE_cpstrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float *a, lapack_int lda, lapack_int *piv, lapack_int
    *rank, float tol)
lapack_int LAPACKE_zpstrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double *a, lapack_int lda, lapack_int *piv,
    lapack_int *rank, double tol)

Full storage this time (lda, bestie, not packed — the p is doing different work here). And yes tol is real in the complex ones too. Consistency 💅.


🧚 ptcon — tridiagonal condition number, no matrix_layout needed

lapack_int LAPACKE_sptcon (lapack_int n, const float *d, const float *e,
    float anorm, float *rcond)
lapack_int LAPACKE_dptcon (lapack_int n, const double *d, const double
    *e, double anorm, double *rcond)
lapack_int LAPACKE_cptcon (lapack_int n, const float *d, const
    lapack_complex_float *e, float anorm, float *rcond)
lapack_int LAPACKE_zptcon (lapack_int n, const double *d, const
    lapack_complex_double *e, double anorm, double *rcond)

Bestie note 📌: these four skip matrix_layout entirely — no int matrix_layout first arg, look at them, trailblazers. And d stays real while e goes complex, because tridiagonal says so 💀.


⭐ pteqr — tridiagonal to eigenspace, with compz

lapack_int LAPACKE_spteqr (int matrix_layout, char compz, lapack_int n,
    float *d, float *e, float *z, lapack_int ldz)
lapack_int LAPACKE_dpteqr (int matrix_layout, char compz, lapack_int n,
    double *d, double *e, double *z, lapack_int ldz)
lapack_int LAPACKE_cpteqr (int matrix_layout, char compz, lapack_int n,
    float *d, float *e, lapack_complex_float *z, lapack_int ldz)
lapack_int LAPACKE_zpteqr (int matrix_layout, char compz, lapack_int n,
    double *d, double *e, lapack_complex_double *z, lapack_int ldz)

d and e are real even in c and z, but z is complex. That's the crossover episode 🦋.


💀 ptrfs — the fancy one with two uplo-less variants and two that have uplo

lapack_int LAPACKE_sptrfs (int matrix_layout, lapack_int n, lapack_int
    nrhs, const float *d, const float *e, const float *df, const float
    *ef, const float *b, lapack_int ldb, float *x, lapack_int ldx, float
    *ferr, float *berr)
lapack_int LAPACKE_dptrfs (int matrix_layout, lapack_int n, lapack_int
    nrhs, const double *d, const double *e, const double *df, const
    double *ef, const double *b, lapack_int ldb, double *x, lapack_int
    ldx, double *ferr, double *berr)
lapack_int LAPACKE_cptrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float *d, const lapack_complex_float *e,
    const float *df, const lapack_complex_float *ef, const
    lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
    lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_zptrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double *d, const lapack_complex_double *e,
    const double *df, const lapack_complex_double *ef, const
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
    lapack_int ldx, double *ferr, double *berr)

Ok so l👀k closely: sptrfs and dptrfs have no uplo. cptrfs and zptrfs do. That's not me being chaotic, that's literally the signature 🙈. Copy the right one, please, I'm begging 🫶.


🌸 ptsv — tridiagonal solve, minimal effort, maximum slay

lapack_int LAPACKE_sptsv (int matrix_layout, lapack_int n, lapack_int
    nrhs, float *d, float *e, float *b, lapack_int ldb)
lapack_int LAPACKE_dptsv (int matrix_layout, lapack_int n, lapack_int
    nrhs, double *d, double *e, double *b, lapack_int ldb)
lapack_int LAPACKE_cptsv (int matrix_layout, lapack_int n, lapack_int
    nrhs, float *d, lapack_complex_float *e, lapack_complex_float *b,
    lapack_int ldb)
lapack_int LAPACKE_zptsv (int matrix_layout, lapack_int n, lapack_int
    nrhs, double *d, lapack_complex_double *e, lapack_complex_double *b,
    lapack_int ldb)

No uplo anywhere in this family. She doesn't need it. She knows who she is ✨.


🌺 ptsvx — tridiagonal, but make it thorough

lapack_int LAPACKE_sptsvx (int matrix_layout, char fact, lapack_int n,
    lapack_int nrhs, const float *d, const float *e, float *df, float
    *ef, const float *b, lapack_int ldb, float *x, lapack_int ldx, float
    *rcond, float *ferr, float *berr)
lapack_int LAPACKE_dptsvx (int matrix_layout, char fact, lapack_int n,
    lapack_int nrhs, const double *d, const double *e, double *df,
    double *ef, const double *b, lapack_int ldb, double *x, lapack_int
    ldx, double *rcond, double *ferr, double *berr)
lapack_int LAPACKE_cptsvx (int matrix_layout, char fact, lapack_int n,
    lapack_int nrhs, const float *d, const lapack_complex_float *e,
    float *df, lapack_complex_float *ef, const lapack_complex_float *b,
    lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float
    *rcond, float *ferr, float *berr)
lapack_int LAPACKE_zptsvx (int matrix_layout, char fact, lapack_int n,
    lapack_int nrhs, const double *d, const lapack_complex_double *e,
    double *df, lapack_complex_double *ef, const lapack_complex_double
    *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double
    *rcond, double *ferr, double *berr)

Inputs d and e are const, outputs df and ef are not, x and rcond etc. cruise along for the ride. Note who's real: d always, df always, and the error/condition crew 💅.


🎀 pttrf — tridiagonal factorization, four args, no layout arg

lapack_int LAPACKE_spttrf (lapack_int n, float *d, float *e)
lapack_int LAPACKE_dpttrf (lapack_int n, double *d, double *e)
lapack_int LAPACKE_cpttrf (lapack_int n, float *d, lapack_complex_float
    *e)
lapack_int LAPACKE_zpttrf (lapack_int n, double *d,
    lapack_complex_double *e)

The ptcon/pttrf girlies are the only ones in this whole flock living without matrix_layout. Respect the commitment 🫡.


🦋 pttrs — tridiagonal solve, and yes the complex ones brought uplo

lapack_int LAPACKE_spttrs (int matrix_layout, lapack_int n, lapack_int
    nrhs, const float *d, const float *e, float *b, lapack_int ldb)
lapack_int LAPACKE_dpttrs (int matrix_layout, lapack_int n, lapack_int
    nrhs, const double *d, const double *e, double *b, lapack_int ldb)
lapack_int LAPACKE_cpttrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float *d, const lapack_complex_float *e,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zpttrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double *d, const lapack_complex_double *e,
    lapack_complex_double *b, lapack_int ldb)

Same plot twist as ptrfs: real versions, no uplo; complex versions, uplo unlocked 🔓. Fr fr, check before you compile 😭.


👑 sbev / dsbev — symmetric band, eigenvalues, the classic

lapack_int LAPACKE_ssbev (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, float *ab, lapack_int ldab, float *w,
    float *z, lapack_int ldz)
lapack_int LAPACKE_dsbev (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, double *ab, lapack_int ldab, double *w,
    double *z, lapack_int ldz)

New cast members alert 🚨: jobz, kd, ab, ldab, w, z, ldz. Band storage means kd (the bandwidth) is in the building, and ldab is leading dimension of ab — do not skip her.


💜 sbevd / dsbevd — same, but with a d on the end (she's the divide-and-conquer one)

lapack_int LAPACKE_ssbevd (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, float *ab, lapack_int ldab, float *w,
    float *z, lapack_int ldz)
lapack_int LAPACKE_dsbevd (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, double *ab, lapack_int ldab, double *w,
    double *z, lapack_int ldz)

Identical argument list to sbev/dsbev — same characters, extra letter in the name. That's it. That's the difference in the signature 🙈.


🔥 sbevx / dsbevx — the maximalist band eigensolver

lapack_int LAPACKE_ssbevx (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_int kd, float *ab, lapack_int ldab,
    float *q, lapack_int ldq, float vl, float vu, lapack_int il,
    lapack_int iu, float abstol, lapack_int *m, float *w, float *z,
    lapack_int ldz, lapack_int *ifail)
lapack_int LAPACKE_dsbevx (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_int kd, double *ab, lapack_int ldab,
    double *q, lapack_int ldq, double vl, double vu, lapack_int il,

Look at that guest list 😭 — range, q, ldq, vl, vu, il, iu, abstol, m, ifail. She said "invite everyone," and honestly? She ate 💅. (And dsbevx is mid-sentence here — she keeps going in the next part, don't panic 🫶)

...and we're literally mid-declaration 😭 don't panic, bestie — this is just the tail end of a signature that started in the last part, so here's the bit that got cut off:

    lapack_int iu, double abstol, lapack_int *m, double *w, double *z,
    lapack_int ldz, lapack_int *ifail)

Cool? Cool. Now, fresh declarations, everybody say thank you 🫶


🎀 the sb band-matrix girlies (generalized edition)

Band matrices get ka/kb for the upper bandwidths, plus ldab/ldbb riding along as their leading dims. It's giving "two bands, two leading dimensions, one very long line." Slay.

lapack_int LAPACKE_ssbgst (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb, float *ab, lapack_int ldab, const float *bb, lapack_int ldbb, float *x, lapack_int ldx)
lapack_int LAPACKE_dsbgst (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb, double *ab, lapack_int ldab, const double *bb, lapack_int ldbb, double *x, lapack_int ldx)

Same energy, but ab/bb are now writable and they hand you back eigenvalues in w and eigenvectors in z (with ldz doing its usual little job):

lapack_int LAPACKE_ssbgv (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, float *ab, lapack_int ldab, float *bb, lapack_int ldbb, float *w, float *z, lapack_int ldz)
lapack_int LAPACKE_dsbgv (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, double *ab, lapack_int ldab, double *bb, lapack_int ldbb, double *w, double *z, lapack_int ldz)

The vd twins — identical argument lists, no cap, I checked:

lapack_int LAPACKE_ssbgvd (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, float *ab, lapack_int ldab, float *bb, lapack_int ldbb, float *w, float *z, lapack_int ldz)
lapack_int LAPACKE_dsbgvd (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, double *ab, lapack_int ldab, double *bb, lapack_int ldbb, double *w, double *z, lapack_int ldz)

And the vx babes — they add the whole range situation (vl, vu, il, iu, abstol), a q matrix with ldq, an output count *m, and ifail for the messy ones:

lapack_int LAPACKE_ssbgvx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int ka, lapack_int kb, float *ab, lapack_int ldab, float *bb, lapack_int ldbb, float *q, lapack_int ldq, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w, float *z, lapack_int ldz, lapack_int *ifail)
lapack_int LAPACKE_dsbgvx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int ka, lapack_int kb, double *ab, lapack_int ldab, double *bb, lapack_int ldbb, double *q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int *m, double *w, double *z, lapack_int ldz, lapack_int *ifail)

✨ sbtrd (note: singular kd, bestie)

One kd, one ldab, and the trio d, e, q (with ldq). That's the whole vibe check:

lapack_int LAPACKE_ssbtrd (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int kd, float *ab, lapack_int ldab, float *d, float *e, float *q, lapack_int ldq)
lapack_int LAPACKE_dsbtrd (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int kd, double *ab, lapack_int ldab, double *d, double *e, double *q, lapack_int ldq)

🦋 sfrk — the rank-k girlies

Three char flags in a row (transr, uplo, trans), then alpha/beta scalars, a read-only a with lda… and c, who has no leading dimension at all because she doesn't need one. Main character energy, honestly:

lapack_int LAPACKE_ssfrk (int matrix_layout, char transr, char uplo, char trans, lapack_int n, lapack_int k, float alpha, const float *a, lapack_int lda, float beta, float *c)
lapack_int LAPACKE_dsfrk (int matrix_layout, char transr, char uplo, char trans, lapack_int n, lapack_int k, double alpha, const double *a, lapack_int lda, double beta, double *c)

💅 spcon — four flavours, one shape

anorm goes in, rcond comes out, ipiv is read-only. Here's all four so nobody has to guess:

lapack_int LAPACKE_sspcon (int matrix_layout, char uplo, lapack_int n, const float *ap, const lapack_int *ipiv, float anorm, float *rcond)
lapack_int LAPACKE_dspcon (int matrix_layout, char uplo, lapack_int n, const double *ap, const lapack_int *ipiv, double anorm, double *rcond)
lapack_int LAPACKE_cspcon (int matrix_layout, char uplo, lapack_int n, const lapack_complex_float *ap, const lapack_int *ipiv, float anorm, float *rcond)
lapack_int LAPACKE_zspcon (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double *ap, const lapack_int *ipiv, double anorm, double *rcond)
Notice the pattern, iykyk: the c versions carry lapack_complex_float for the data but keep float anorm and float *rcond. The z versions go double/double. Don't mix them up 🔥

🌸 spev / spevd / spevx

Packed storage, so it's just ap — no ldap anywhere, we love a low-maintenance icon:

lapack_int LAPACKE_sspev (int matrix_layout, char jobz, char uplo, lapack_int n, float *ap, float *w, float *z, lapack_int ldz)
lapack_int LAPACKE_dspev (int matrix_layout, char jobz, char uplo, lapack_int n, double *ap, double *w, double *z, lapack_int ldz)
lapack_int LAPACKE_sspevd (int matrix_layout, char jobz, char uplo, lapack_int n, float *ap, float *w, float *z, lapack_int ldz)
lapack_int LAPACKE_dspevd (int matrix_layout, char jobz, char uplo, lapack_int n, double *ap, double *w, double *z, lapack_int ldz)

Then the vx versions go full range mode with vl/vu/il/iu/abstol, plus *m and ifail:

lapack_int LAPACKE_sspevx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, float *ap, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w, float *z, lapack_int ldz, lapack_int *ifail)
lapack_int LAPACKE_dspevx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, double *ap, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int *m, double *w, double *z, lapack_int ldz, lapack_int *ifail)

🍓 spg — the itype crew

Heads up: these put lapack_int itype before uplo, not after matrix_layout. It's a whole thing, just roll with it:

lapack_int LAPACKE_sspgst (int matrix_layout, lapack_int itype, char uplo, lapack_int n, float *ap, const float *bp)
lapack_int LAPACKE_dspgst (int matrix_layout, lapack_int itype, char uplo, lapack_int n, double *ap, const double *bp)
lapack_int LAPACKE_sspgv (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, float *ap, float *bp, float *w, float *z, lapack_int ldz)
lapack_int LAPACKE_dspgv (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, double *ap, double *bp, double *w, double *z, lapack_int ldz)
lapack_int LAPACKE_sspgvd (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, float *ap, float *bp, float *w, float *z, lapack_int ldz)
lapack_int LAPACKE_dspgvd (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, double *ap, double *bp, double *w, double *z, lapack_int ldz)

And the vx two — itype, then jobz, then range, then uplo, then everything else. Yes, four chars deep. Iconic, honestly:

lapack_int LAPACKE_sspgvx (int matrix_layout, lapack_int itype, char jobz, char range, char uplo, lapack_int n, float *ap, float *bp, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w, float *z, lapack_int ldz, lapack_int *ifail)
lapack_int LAPACKE_dspgvx (int matrix_layout, lapack_int itype, char jobz, char range, char uplo, lapack_int n, double *ap, double *bp, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int *m, double *w, double *z, lapack_int ldz, lapack_int *ifail)

🧚 sprfs — the refinement squad

nrhs is here, afp is here, ipiv is read-only, and the output girlies are ferr and berr. Four versions, all float/double on the error side of things for their type family:

lapack_int LAPACKE_ssprfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float *ap, const float *afp, const lapack_int *ipiv, const float *b, lapack_int ldb, float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_dsprfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const double *ap, const double *afp, const lapack_int *ipiv, const double *b, lapack_int ldb, double *x, lapack_int ldx, double *ferr, double *berr)
lapack_int LAPACKE_csprfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float *ap, const lapack_complex_float *afp, const lapack_int *ipiv, const lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_zsprfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double *ap, const lapack_complex_double *afp, const lapack_int *ipiv, const lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double *ferr, double *berr)

⭐ spsv — short and sweet

No anorm, no ferr, no berr. Just ap, ipiv, b, ldb. Less is more, periodt:

lapack_int LAPACKE_sspsv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, float *ap, lapack_int *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_dspsv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double *ap, lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_cspsv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float *ap, lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zspsv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double *ap, lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)

The spsvx girlies though? They bring fact, they bring afp, they bring rcond and ferr and berr. Overachievers 🎀

lapack_int LAPACKE_sspsvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const float *ap, float *afp, lapack_int *ipiv, const float *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond, float *ferr, float *berr)
lapack_int LAPACKE_dspsvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const double *ap, double *afp, lapack_int *ipiv, const double *b, lapack_int ldb, double *x, lapack_int ldx, double *rcond, double *ferr, double *berr)
lapack_int LAPACKE_cspsvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float *ap, lapack_complex_float *afp, lapack_int *ipiv, const lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float *rcond, float *ferr, float *berr)
lapack_int LAPACKE_zspsvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double *ap, lapack_complex_double *afp, lapack_int *ipiv, const lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double *rcond, double *ferr, double *berr)

🌈 spt — the packed-storage quadrilogy

sptrd gives you d, e, tau. Cute, dense, done:

lapack_int LAPACKE_ssptrd (int matrix_layout, char uplo, lapack_int n, float *ap, float *d, float *e, float *tau)
lapack_int LAPACKE_dsptrd (int matrix_layout, char uplo, lapack_int n, double *ap, double *d, double *e, double *tau)

sptrf is the ipiv-producing one (writable ap, writable ipiv):

lapack_int LAPACKE_ssptrf (int matrix_layout, char uplo, lapack_int n, float *ap, lapack_int *ipiv)
lapack_int LAPACKE_dsptrf (int matrix_layout, char uplo, lapack_int n, double *ap, lapack_int *ipiv)
lapack_int LAPACKE_csptrf (int matrix_layout, char uplo, lapack_int n, lapack_complex_float *ap, lapack_int *ipiv)
lapack_int LAPACKE_zsptrf (int matrix_layout, char uplo, lapack_int n, lapack_complex_double *ap, lapack_int *ipiv)

sptri flips it — ipiv is now const because it's an input this time, bestie:

lapack_int LAPACKE_ssptri (int matrix_layout, char uplo, lapack_int n, float *ap, const lapack_int *ipiv)
lapack_int LAPACKE_dsptri (int matrix_layout, char uplo, lapack_int n, double *ap, const lapack_int *ipiv)
lapack_int LAPACKE_csptri (int matrix_layout, char uplo, lapack_int n, lapack_complex_float *ap, const lapack_int *ipiv)
lapack_int LAPACKE_zsptri (int matrix_layout, char uplo, lapack_int n, lapack_complex_double *ap, const lapack_int *ipiv)

And sptrs brings nrhs and ldb back into the picture:

lapack_int LAPACKE_ssptrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float *ap, const lapack_int *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_dsptrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const double *ap, const lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_csptrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float *ap, const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zsptrs (int matrix_layout, char uplo, lapack_int n,
And yes, LAPACKE_zsptrs got cut off mid-line again 😭 that's not me being sloppy, that's just where this part ends — the rest is waiting for you in the next one 💖

...and we're still in the SYNOPSIS bestie, the prototype list is genuinely thicc and we're only on part 24 of 197 😭. Here's the next chunk, finishing off whatever complex-double call got cut in half:

           lapack_int nrhs, const lapack_complex_double *ap, const lapack_int
           *ipiv, lapack_complex_double *b, lapack_int ldb)

then the *stebz twins walk in — one float, one double, matching fits:

       lapack_int LAPACKE_sstebz (char range, char order, lapack_int n, float
           vl, float vu, lapack_int il, lapack_int iu, float abstol, const
           float *d, const float *e, lapack_int *m, lapack_int *nsplit, float
           *w, lapack_int *iblock, lapack_int *isplit)
       lapack_int LAPACKE_dstebz (char range, char order, lapack_int n, double
           vl, double vu, lapack_int il, lapack_int iu, double abstol, const
           double *d, const double *e, lapack_int *m, lapack_int *nsplit,
           double *w, lapack_int *iblock, lapack_int *isplit)

ok the *stedc four-pack, this one goes full main-character and shows up in all four flavours 💅:

       lapack_int LAPACKE_sstedc (int matrix_layout, char compz, lapack_int n,
           float *d, float *e, float *z, lapack_int ldz)
       lapack_int LAPACKE_dstedc (int matrix_layout, char compz, lapack_int n,
           double *d, double *e, double *z, lapack_int ldz)
       lapack_int LAPACKE_cstedc (int matrix_layout, char compz, lapack_int n,
           float *d, float *e, lapack_complex_float *z, lapack_int ldz)
       lapack_int LAPACKE_zstedc (int matrix_layout, char compz, lapack_int n,
           double *d, double *e, lapack_complex_double *z, lapack_int ldz)

*stegr said "let me also do all four" and honestly? iconic ✨:

       lapack_int LAPACKE_sstegr (int matrix_layout, char jobz, char range,
           lapack_int n, float *d, float *e, float vl, float vu, lapack_int il,
           lapack_int iu, float abstol, lapack_int *m, float *w, float *z,
           lapack_int ldz, lapack_int *isuppz)
       lapack_int LAPACKE_dstegr (int matrix_layout, char jobz, char range,
           lapack_int n, double *d, double *e, double vl, double vu, lapack_int
           il, lapack_int iu, double abstol, lapack_int *m, double *w, double
           *z, lapack_int ldz, lapack_int *isuppz)
       lapack_int LAPACKE_cstegr (int matrix_layout, char jobz, char range,
           lapack_int n, float *d, float *e, float vl, float vu, lapack_int il,
           lapack_int iu, float abstol, lapack_int *m, float *w,
           lapack_complex_float *z, lapack_int ldz, lapack_int *isuppz)
       lapack_int LAPACKE_zstegr (int matrix_layout, char jobz, char range,
           lapack_int n, double *d, double *e, double vl, double vu, lapack_int
           il, lapack_int iu, double abstol, lapack_int *m, double *w,
           lapack_complex_double *z, lapack_int ldz, lapack_int *isuppz)

and then *stein, same quadruple energy, note the ifailv at the end of each 🎀:

       lapack_int LAPACKE_sstein (int matrix_layout, lapack_int n, const float
           *d, const float *e, lapack_int m, const float *w, const lapack_int
           *iblock, const lapack_int *isplit, float *z, lapack_int ldz,
           lapack_int *ifailv)
       lapack_int LAPACKE_dstein (int matrix_layout, lapack_int n, const double
           *d, const double *e, lapack_int m, const double *w, const lapack_int
           *iblock, const lapack_int *isplit, double *z, lapack_int ldz,
           lapack_int *ifailv)
       lapack_int LAPACKE_cstein (int matrix_layout, lapack_int n, const float
           *d, const float *e, lapack_int m, const float *w, const lapack_int
           *iblock, const lapack_int *isplit, lapack_complex_float *z,
           lapack_int ldz, lapack_int *ifailv)
       lapack_int LAPACKE_zstein (int matrix_layout, lapack_int n, const double
           *d, const double *e, lapack_int m, const double *w, const lapack_int
           *iblock, const lapack_int *isplit, lapack_complex_double *z,
           lapack_int ldz, lapack_int *ifailv)

*stemr really said "let me have every argument", including nzc and that lapack_logical *tryrac at the very end 👀:

       lapack_int LAPACKE_sstemr (int matrix_layout, char jobz, char range,
           lapack_int n, float *d, float *e, float vl, float vu, lapack_int il,
           lapack_int iu, lapack_int *m, float *w, float *z, lapack_int ldz,
           lapack_int nzc, lapack_int *isuppz, lapack_logical *tryrac)
       lapack_int LAPACKE_dstemr (int matrix_layout, char jobz, char range,
           lapack_int n, double *d, double *e, double vl, double vu, lapack_int
           il, lapack_int iu, lapack_int *m, double *w, double *z, lapack_int
           ldz, lapack_int nzc, lapack_int *isuppz, lapack_logical *tryrac)
       lapack_int LAPACKE_cstemr (int matrix_layout, char jobz, char range,
           lapack_int n, float *d, float *e, float vl, float vu, lapack_int il,
           lapack_int iu, lapack_int *m, float *w, lapack_complex_float *z,
           lapack_int ldz, lapack_int nzc, lapack_int *isuppz, lapack_logical
           *tryrac)
       lapack_int LAPACKE_zstemr (int matrix_layout, char jobz, char range,
           lapack_int n, double *d, double *e, double vl, double vu, lapack_int
           il, lapack_int iu, lapack_int *m, double *w, lapack_complex_double
           *z, lapack_int ldz, lapack_int nzc, lapack_int *isuppz,
           lapack_logical *tryrac)

*steqr keeps it short and sweet, four of them, no notes 💖:

       lapack_int LAPACKE_ssteqr (int matrix_layout, char compz, lapack_int n,
           float *d, float *e, float *z, lapack_int ldz)
       lapack_int LAPACKE_dsteqr (int matrix_layout, char compz, lapack_int n,
           double *d, double *e, double *z, lapack_int ldz)
       lapack_int LAPACKE_csteqr (int matrix_layout, char compz, lapack_int n,
           float *d, float *e, lapack_complex_float *z, lapack_int ldz)
       lapack_int LAPACKE_zsteqr (int matrix_layout, char compz, lapack_int n,
           double *d, double *e, lapack_complex_double *z, lapack_int ldz)

*sterf is the tiny one — only two of them, and no matrix_layout, no z, just vibes:

       lapack_int LAPACKE_ssterf (lapack_int n, float *d, float *e)
       lapack_int LAPACKE_dsterf (lapack_int n, double *d, double *e)

*stev and *stevd — float and double only, sorry to the complex girlies 🙈:

       lapack_int LAPACKE_sstev (int matrix_layout, char jobz, lapack_int n,
           float *d, float *e, float *z, lapack_int ldz)
       lapack_int LAPACKE_dstev (int matrix_layout, char jobz, lapack_int n,
           double *d, double *e, double *z, lapack_int ldz)
       lapack_int LAPACKE_sstevd (int matrix_layout, char jobz, lapack_int n,
           float *d, float *e, float *z, lapack_int ldz)
       lapack_int LAPACKE_dstevd (int matrix_layout, char jobz, lapack_int n,
           double *d, double *e, double *z, lapack_int ldz)

*stevr bringing range, vl, vu, il, iu, abstol and ending on isuppz — a whole itinerary fr fr:

       lapack_int LAPACKE_sstevr (int matrix_layout, char jobz, char range,
           lapack_int n, float *d, float *e, float vl, float vu, lapack_int il,
           lapack_int iu, float abstol, lapack_int *m, float *w, float *z,
           lapack_int ldz, lapack_int *isuppz)
       lapack_int LAPACKE_dstevr (int matrix_layout, char jobz, char range,
           lapack_int n, double *d, double *e, double vl, double vu, lapack_int
           il, lapack_int iu, double abstol, lapack_int *m, double *w, double
           *z, lapack_int ldz, lapack_int *isuppz)

and *stevx, same energy but it closes with ifail instead of isuppz — don't mix them up bestie 🫶:

       lapack_int LAPACKE_sstevx (int matrix_layout, char jobz, char range,
           lapack_int n, float *d, float *e, float vl, float vu, lapack_int il,
           lapack_int iu, float abstol, lapack_int *m, float *w, float *z,
           lapack_int ldz, lapack_int *ifail)
       lapack_int LAPACKE_dstevx (int matrix_layout, char jobz, char range,
           lapack_int n, double *d, double *e, double vl, double vu, lapack_int
           il, lapack_int iu, double abstol, lapack_int *m, double *w, double
           *z, lapack_int ldz, lapack_int *ifail)

new family alert 🚨 the sy* girlies. *sycon takes anorm in and hands you back rcond:

       lapack_int LAPACKE_ssycon (int matrix_layout, char uplo, lapack_int n,
           const float *a, lapack_int lda, const lapack_int *ipiv, float anorm,
           float *rcond)
       lapack_int LAPACKE_dsycon (int matrix_layout, char uplo, lapack_int n,
           const double *a, lapack_int lda, const lapack_int *ipiv, double
           anorm, double *rcond)
       lapack_int LAPACKE_csycon (int matrix_layout, char uplo, lapack_int n,
           const lapack_complex_float *a, lapack_int lda, const lapack_int
           *ipiv, float anorm, float *rcond)
       lapack_int LAPACKE_zsycon (int matrix_layout, char uplo, lapack_int n,
           const lapack_complex_double *a, lapack_int lda, const lapack_int
           *ipiv, double anorm, double *rcond)

*syequb with its little s, scond, amax trio at the end 🌸:

       lapack_int LAPACKE_ssyequb (int matrix_layout, char uplo, lapack_int n,
           const float *a, lapack_int lda, float *s, float *scond, float *amax)
       lapack_int LAPACKE_dsyequb (int matrix_layout, char uplo, lapack_int n,
           const double *a, lapack_int lda, double *s, double *scond, double
           *amax)
       lapack_int LAPACKE_csyequb (int matrix_layout, char uplo, lapack_int n,
           const lapack_complex_float *a, lapack_int lda, float *s, float
           *scond, float *amax)
       lapack_int LAPACKE_zsyequb (int matrix_layout, char uplo, lapack_int n,
           const lapack_complex_double *a, lapack_int lda, double *s, double
           *scond, double *amax)

*syev and *syevd — two each, jobz, uplo, a, lda, w, done:

       lapack_int LAPACKE_ssyev (int matrix_layout, char jobz, char uplo,
           lapack_int n, float *a, lapack_int lda, float *w)
       lapack_int LAPACKE_dsyev (int matrix_layout, char jobz, char uplo,
           lapack_int n, double *a, lapack_int lda, double *w)
       lapack_int LAPACKE_ssyevd (int matrix_layout, char jobz, char uplo,
           lapack_int n, float *a, lapack_int lda, float *w)
       lapack_int LAPACKE_dsyevd (int matrix_layout, char jobz, char uplo,
           lapack_int n, double *a, lapack_int lda, double *w)

*syevr and *syevx, the long ones, with the vl/vu/il/iu/abstol stack in the middle and isuppz vs ifail at the finish line ⭐:

       lapack_int LAPACKE_ssyevr (int matrix_layout, char jobz, char range,
           char uplo, lapack_int n, float *a, lapack_int lda, float vl, float
           vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float
           *w, float *z, lapack_int ldz, lapack_int *isuppz)
       lapack_int LAPACKE_dsyevr (int matrix_layout, char jobz, char range,
           char uplo, lapack_int n, double *a, lapack_int lda, double vl,
           double vu, lapack_int il, lapack_int iu, double abstol, lapack_int
           *m, double *w, double *z, lapack_int ldz, lapack_int *isuppz)
       lapack_int LAPACKE_ssyevx (int matrix_layout, char jobz, char range,
           char uplo, lapack_int n, float *a, lapack_int lda, float vl, float
           vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float
           *w, float *z, lapack_int ldz, lapack_int *ifail)
       lapack_int LAPACKE_dsyevx (int matrix_layout, char jobz, char range,
           char uplo, lapack_int n, double *a, lapack_int lda, double vl,
           double vu, lapack_int il, lapack_int iu, double abstol, lapack_int
           *m, double *w, double *z, lapack_int ldz, lapack_int *ifail)

*sygst is the short king — no jobz, no w, just itype, uplo, a, b and their lda/ldb besties:

       lapack_int LAPACKE_ssygst (int matrix_layout, lapack_int itype, char
           uplo, lapack_int n, float *a, lapack_int lda, const float *b,
           lapack_int ldb)
       lapack_int LAPACKE_dsygst (int matrix_layout, lapack_int itype, char
           uplo, lapack_int n, double *a, lapack_int lda, const double *b,
           lapack_int ldb)

*sygv and *sygvd add jobz and w back in, plus a mutable b — two each, float and double:

       lapack_int LAPACKE_ssygv (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, float *a, lapack_int lda, float *b,
           lapack_int ldb, float *w)
       lapack_int LAPACKE_dsygv (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, double *a, lapack_int lda, double *b,
           lapack_int ldb, double *w)
       lapack_int LAPACKE_ssygvd (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, float *a, lapack_int lda, float *b,
           lapack_int ldb, float *w)
       lapack_int LAPACKE_dsygvd (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, double *a, lapack_int lda, double *b,
           lapack_int ldb, double *w)

and *sygvx is the absolute maximalist — itype, jobz, range, uplo, then the vl/vu/il/iu/abstol parade, then m, w, z, ldz, ifail 😮‍💨:

       lapack_int LAPACKE_ssygvx (int matrix_layout, lapack_int itype, char
           jobz, char range, char uplo, lapack_int n, float *a, lapack_int lda,
           float *b, lapack_int ldb, float vl, float vu, lapack_int il,
           lapack_int iu, float abstol, lapack_int *m, float *w, float *z,
           lapack_int ldz, lapack_int *ifail)

and we're mid-prototype again at the cut — LAPACKE_dsygvx starts here and does not finish in this part, so hold that thought bestie:

       lapack_int LAPACKE_dsygvx (int matrix_layout, lapack_int itype, char

bestie the prototype parade did not slow down, and it’s still serving SYNOPSIS realness ✨ the tail of that last signature lands exactly like this:

jobz, char range, char uplo, lapack_int n, double *a, lapack_int lda, double *b, lapack_int ldb, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int *m, double *w, double *z, lapack_int ldz, lapack_int *ifail)

then we slide straight into the ?syrfs four-pack — all four precisions are here, no skipping, no cap 🫶

lapack_int LAPACKE_ssyrfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const float *af, lapack_int ldaf, const lapack_int *ipiv, const float *b, lapack_int ldb, float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_dsyrfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const double *a, lapack_int lda, const double *af, lapack_int ldaf, const lapack_int *ipiv, const double *b, lapack_int ldb, double *x, lapack_int ldx, double *ferr, double *berr)
lapack_int LAPACKE_csyrfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda, const lapack_complex_float *af, lapack_int ldaf, const lapack_int *ipiv, const lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_zsyrfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda, const lapack_complex_double *af, lapack_int ldaf, const lapack_int *ipiv, const lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double *ferr, double *berr)

and then the ?syrfsx upgrade squad pulls up with equed, s, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, and params all up in the mix 💅

lapack_int LAPACKE_ssyrfsx (int matrix_layout, char uplo, char equed, lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const float *af, lapack_int ldaf, const lapack_int *ipiv, const float *s, const float *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond, float *berr, lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float *params)
lapack_int LAPACKE_dsyrfsx (int matrix_layout, char uplo, char equed, lapack_int n, lapack_int nrhs, const double *a, lapack_int lda, const double *af, lapack_int ldaf, const lapack_int *ipiv, const double *s, const double *b, lapack_int ldb, double *x, lapack_int ldx, double *rcond, double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double *params)
lapack_int LAPACKE_csyrfsx (int matrix_layout, char uplo, char equed, lapack_int n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda, const lapack_complex_float *af, lapack_int ldaf, const lapack_int *ipiv, const float *s, const lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float *rcond, float *berr, lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float *params)
lapack_int LAPACKE_zsyrfsx (int matrix_layout, char uplo, char equed, lapack_int n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda, const lapack_complex_double *af, lapack_int ldaf, const lapack_int *ipiv, const double *s, const lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double *rcond, double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double *params)

next up: the ?sysv quartet, keeping it cute and compact 🌸

lapack_int LAPACKE_ssysv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, float *a, lapack_int lda, lapack_int *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_dsysv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double *a, lapack_int lda, lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_csysv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zsysv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)

the ?sysvx crew is next, with fact, rcond, ferr, berr — yes ma’am, the whole lineup 🔥

lapack_int LAPACKE_ssysvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, float *af, lapack_int ldaf, lapack_int *ipiv, const float *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond, float *ferr, float *berr)
lapack_int LAPACKE_dsysvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const double *a, lapack_int lda, double *af, lapack_int ldaf, lapack_int *ipiv, const double *b, lapack_int ldb, double *x, lapack_int ldx, double *rcond, double *ferr, double *berr)
lapack_int LAPACKE_csysvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda, lapack_complex_float *af, lapack_int ldaf, lapack_int *ipiv, const lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float *rcond, float *ferr, float *berr)
lapack_int LAPACKE_zsysvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda, lapack_complex_double *af, lapack_int ldaf, lapack_int *ipiv, const lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double *rcond, double *ferr, double *berr)

and the ?sysvxx squad ate and left no crumbs — extra equed, s, rpvgrw, err_bnds_norm, err_bnds_comp, nparams, params, all iconic 👑

lapack_int LAPACKE_ssysvxx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *af, lapack_int ldaf, lapack_int *ipiv, char *equed, float *s, float *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond, float *rpvgrw, float *berr, lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float *params)
lapack_int LAPACKE_dsysvxx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double *af, lapack_int ldaf, lapack_int *ipiv, char *equed, double *s, double *b, lapack_int ldb, double *x, lapack_int ldx, double *rcond, double *rpvgrw, double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double *params)
lapack_int LAPACKE_csysvxx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda, lapack_complex_float *af, lapack_int ldaf, lapack_int *ipiv, char *equed, float *s, lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float *rcond, float *rpvgrw, float *berr, lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float *params)
lapack_int LAPACKE_zsysvxx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda, lapack_complex_double *af, lapack_int ldaf, lapack_int *ipiv, char *equed, double *s, lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double *rcond, double *rpvgrw, double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double *params)

the ?sytrd pair is small but mighty 🎀

lapack_int LAPACKE_ssytrd (int matrix_layout, char uplo, lapack_int n, float *a, lapack_int lda, float *d, float *e, float *tau)
lapack_int LAPACKE_dsytrd (int matrix_layout, char uplo, lapack_int n, double *a, lapack_int lda, double *d, double *e, double *tau)

then the ?sytrf quartet rolls through:

lapack_int LAPACKE_ssytrf (int matrix_layout, char uplo, lapack_int n, float *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_dsytrf (int matrix_layout, char uplo, lapack_int n, double *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_csytrf (int matrix_layout, char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_zsytrf (int matrix_layout, char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv)

?sytri said “const ipiv, we don’t play about you” 🦋

lapack_int LAPACKE_ssytri (int matrix_layout, char uplo, lapack_int n, float *a, lapack_int lda, const lapack_int *ipiv)
lapack_int LAPACKE_dsytri (int matrix_layout, char uplo, lapack_int n, double *a, lapack_int lda, const lapack_int *ipiv)
lapack_int LAPACKE_csytri (int matrix_layout, char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv)
lapack_int LAPACKE_zsytri (int matrix_layout, char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv)

and the ?sytrs quartet keeps the flow going:

lapack_int LAPACKE_ssytrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const lapack_int *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_dsytrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const double *a, lapack_int lda, const lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_csytrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zsytrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)

?tbcon is giving norm, uplo, diag, kd, and ldab energy 💜

lapack_int LAPACKE_stbcon (int matrix_layout, char norm, char uplo, char diag, lapack_int n, lapack_int kd, const float *ab, lapack_int ldab, float *rcond)
lapack_int LAPACKE_dtbcon (int matrix_layout, char norm, char uplo, char diag, lapack_int n, lapack_int kd, const double *ab, lapack_int ldab, double *rcond)
lapack_int LAPACKE_ctbcon (int matrix_layout, char norm, char uplo, char diag, lapack_int n, lapack_int kd, const lapack_complex_float *ab, lapack_int ldab, float *rcond)
lapack_int LAPACKE_ztbcon (int matrix_layout, char norm, char uplo, char diag, lapack_int n, lapack_int kd, const lapack_complex_double *ab, lapack_int ldab, double *rcond)

lastly for this part, the ?tbrfs crew pulls up, and bestie… the final signature is literally mid-cliffhanger 😭

lapack_int LAPACKE_stbrfs (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const float *ab, lapack_int ldab, const float *b, lapack_int ldb, const float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_dtbrfs (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const double *ab, lapack_int ldab, const double *b, lapack_int ldb, const double *x, lapack_int ldx, double *ferr, double *berr)
lapack_int LAPACKE_ctbrfs (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const lapack_complex_float *ab, lapack_int ldab, const lapack_complex_float *b, lapack_int ldb, const lapack_complex_float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_ztbrfs (int matrix_layout, char uplo, char trans,

okay bestie, we’re still deep in SYNOPSIS land and it is long, but every signature below is kept exactly as-is — no cap, no edits 🫶

           char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
           lapack_complex_double *ab, lapack_int ldab, const
           lapack_complex_double *b, lapack_int ldb, const
           lapack_complex_double *x, lapack_int ldx, double *ferr, double
           *berr)
       lapack_int LAPACKE_stbtrs (int matrix_layout, char uplo, char trans,
           char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const float
           *ab, lapack_int ldab, float *b, lapack_int ldb)
       lapack_int LAPACKE_dtbtrs (int matrix_layout, char uplo, char trans,
           char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
           double *ab, lapack_int ldab, double *b, lapack_int ldb)
       lapack_int LAPACKE_ctbtrs (int matrix_layout, char uplo, char trans,
           char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
           lapack_complex_float *ab, lapack_int ldab, lapack_complex_float *b,
           lapack_int ldb)
       lapack_int LAPACKE_ztbtrs (int matrix_layout, char uplo, char trans,
           char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
           lapack_complex_double *ab, lapack_int ldab, lapack_complex_double
           *b, lapack_int ldb)
       lapack_int LAPACKE_stfsm (int matrix_layout, char transr, char side,
           char uplo, char trans, char diag, lapack_int m, lapack_int n, float
           alpha, const float *a, float *b, lapack_int ldb)
       lapack_int LAPACKE_dtfsm (int matrix_layout, char transr, char side,
           char uplo, char trans, char diag, lapack_int m, lapack_int n, double
           alpha, const double *a, double *b, lapack_int ldb)
       lapack_int LAPACKE_ctfsm (int matrix_layout, char transr, char side,
           char uplo, char trans, char diag, lapack_int m, lapack_int n,
           lapack_complex_float alpha, const lapack_complex_float *a,
           lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_ztfsm (int matrix_layout, char transr, char side,
           char uplo, char trans, char diag, lapack_int m, lapack_int n,
           lapack_complex_double alpha, const lapack_complex_double *a,
           lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_stftri (int matrix_layout, char transr, char uplo,
           char diag, lapack_int n, float *a)
       lapack_int LAPACKE_dtftri (int matrix_layout, char transr, char uplo,
           char diag, lapack_int n, double *a)
       lapack_int LAPACKE_ctftri (int matrix_layout, char transr, char uplo,
           char diag, lapack_int n, lapack_complex_float *a)
       lapack_int LAPACKE_ztftri (int matrix_layout, char transr, char uplo,
           char diag, lapack_int n, lapack_complex_double *a)
       lapack_int LAPACKE_stfttp (int matrix_layout, char transr, char uplo,
           lapack_int n, const float *arf, float *ap)
       lapack_int LAPACKE_dtfttp (int matrix_layout, char transr, char uplo,
           lapack_int n, const double *arf, double *ap)
       lapack_int LAPACKE_ctfttp (int matrix_layout, char transr, char uplo,
           lapack_int n, const lapack_complex_float *arf, lapack_complex_float
           *ap)
       lapack_int LAPACKE_ztfttp (int matrix_layout, char transr, char uplo,
           lapack_int n, const lapack_complex_double *arf,
           lapack_complex_double *ap)
       lapack_int LAPACKE_stfttr (int matrix_layout, char transr, char uplo,
           lapack_int n, const float *arf, float *a, lapack_int lda)
       lapack_int LAPACKE_dtfttr (int matrix_layout, char transr, char uplo,
           lapack_int n, const double *arf, double *a, lapack_int lda)
       lapack_int LAPACKE_ctfttr (int matrix_layout, char transr, char uplo,
           lapack_int n, const lapack_complex_float *arf, lapack_complex_float
           *a, lapack_int lda)
       lapack_int LAPACKE_ztfttr (int matrix_layout, char transr, char uplo,
           lapack_int n, const lapack_complex_double *arf,
           lapack_complex_double *a, lapack_int lda)
       lapack_int LAPACKE_stgevc (int matrix_layout, char side, char howmny,
           const lapack_logical *select, lapack_int n, const float *s,
           lapack_int lds, const float *p, lapack_int ldp, float *vl,
           lapack_int ldvl, float *vr, lapack_int ldvr, lapack_int mm,
           lapack_int *m)
       lapack_int LAPACKE_dtgevc (int matrix_layout, char side, char howmny,
           const lapack_logical *select, lapack_int n, const double *s,
           lapack_int lds, const double *p, lapack_int ldp, double *vl,
           lapack_int ldvl, double *vr, lapack_int ldvr, lapack_int mm,
           lapack_int *m)
       lapack_int LAPACKE_ctgevc (int matrix_layout, char side, char howmny,
           const lapack_logical *select, lapack_int n, const
           lapack_complex_float *s, lapack_int lds, const lapack_complex_float
           *p, lapack_int ldp, lapack_complex_float *vl, lapack_int ldvl,
           lapack_complex_float *vr, lapack_int ldvr, lapack_int mm, lapack_int
           *m)
       lapack_int LAPACKE_ztgevc (int matrix_layout, char side, char howmny,
           const lapack_logical *select, lapack_int n, const
           lapack_complex_double *s, lapack_int lds, const
           lapack_complex_double *p, lapack_int ldp, lapack_complex_double *vl,
           lapack_int ldvl, lapack_complex_double *vr, lapack_int ldvr,
           lapack_int mm, lapack_int *m)
       lapack_int LAPACKE_stgexc (int matrix_layout, lapack_logical wantq,
           lapack_logical wantz, lapack_int n, float *a, lapack_int lda, float
           *b, lapack_int ldb, float *q, lapack_int ldq, float *z, lapack_int
           ldz, lapack_int *ifst, lapack_int *ilst)
       lapack_int LAPACKE_dtgexc (int matrix_layout, lapack_logical wantq,
           lapack_logical wantz, lapack_int n, double *a, lapack_int lda,
           double *b, lapack_int ldb, double *q, lapack_int ldq, double *z,
           lapack_int ldz, lapack_int *ifst, lapack_int *ilst)
       lapack_int LAPACKE_ctgexc (int matrix_layout, lapack_logical wantq,
           lapack_logical wantz, lapack_int n, lapack_complex_float *a,
           lapack_int lda, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *q, lapack_int ldq, lapack_complex_float *z,
           lapack_int ldz, lapack_int ifst, lapack_int ilst)
       lapack_int LAPACKE_ztgexc (int matrix_layout, lapack_logical wantq,
           lapack_logical wantz, lapack_int n, lapack_complex_double *a,
           lapack_int lda, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *q, lapack_int ldq, lapack_complex_double *z,
           lapack_int ldz, lapack_int ifst, lapack_int ilst)
       lapack_int LAPACKE_stgsen (int matrix_layout, lapack_int ijob,
           lapack_logical wantq, lapack_logical wantz, const lapack_logical
           *select, lapack_int n, float *a, lapack_int lda, float *b,
           lapack_int ldb, float *alphar, float *alphai, float *beta, float *q,
           lapack_int ldq, float *z, lapack_int ldz, lapack_int *m, float *pl,
           float *pr, float *dif)
       lapack_int LAPACKE_dtgsen (int matrix_layout, lapack_int ijob,
           lapack_logical wantq, lapack_logical wantz, const lapack_logical
           *select, lapack_int n, double *a, lapack_int lda, double *b,
           lapack_int ldb, double *alphar, double *alphai, double *beta, double
           *q, lapack_int ldq, double *z, lapack_int ldz, lapack_int *m, double
           *pl, double *pr, double *dif)
       lapack_int LAPACKE_ctgsen (int matrix_layout, lapack_int ijob,
           lapack_logical wantq, lapack_logical wantz, const lapack_logical
           *select, lapack_int n, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float
           *alpha, lapack_complex_float *beta, lapack_complex_float *q,
           lapack_int ldq, lapack_complex_float *z, lapack_int ldz, lapack_int
           *m, float *pl, float *pr, float *dif)
       lapack_int LAPACKE_ztgsen (int matrix_layout, lapack_int ijob,
           lapack_logical wantq, lapack_logical wantz, const lapack_logical
           *select, lapack_int n, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double
           *alpha, lapack_complex_double *beta, lapack_complex_double *q,
           lapack_int ldq, lapack_complex_double *z, lapack_int ldz, lapack_int
           *m, double *pl, double *pr, double *dif)
       lapack_int LAPACKE_stgsja (int matrix_layout, char jobu, char jobv, char
           jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
           lapack_int l, float *a, lapack_int lda, float *b, lapack_int ldb,
           float tola, float tolb, float *alpha, float *beta, float *u,
           lapack_int ldu, float *v, lapack_int ldv, float *q, lapack_int ldq,
           lapack_int *ncycle)
       lapack_int LAPACKE_dtgsja (int matrix_layout, char jobu, char jobv, char
           jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
           lapack_int l, double *a, lapack_int lda, double *b, lapack_int ldb,
           double tola, double tolb, double *alpha, double *beta, double *u,
           lapack_int ldu, double *v, lapack_int ldv, double *q, lapack_int
           ldq, lapack_int *ncycle)
       lapack_int LAPACKE_ctgsja (int matrix_layout, char jobu, char jobv, char
           jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
           lapack_int l, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, float tola, float tolb,
           float *alpha, float *beta, lapack_complex_float *u, lapack_int ldu,
           lapack_complex_float *v, lapack_int ldv, lapack_complex_float *q,
           lapack_int ldq, lapack_int *ncycle)
       lapack_int LAPACKE_ztgsja (int matrix_layout, char jobu, char jobv, char
           jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
           lapack_int l, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb, double tola, double tolb,
           double *alpha, double *beta, lapack_complex_double *u, lapack_int
           ldu, lapack_complex_double *v, lapack_int ldv, lapack_complex_double
           *q, lapack_int ldq, lapack_int *ncycle)
       lapack_int LAPACKE_stgsna (int matrix_layout, char job, char howmny,
           const lapack_logical *select, lapack_int n, const float *a,
           lapack_int lda, const float *b, lapack_int ldb, const float *vl,
           lapack_int ldvl, const float *vr, lapack_int ldvr, float *s, float
           *dif, lapack_int mm, lapack_int *m)
       lapack_int LAPACKE_dtgsna (int matrix_layout, char job, char howmny,
           const lapack_logical *select, lapack_int n, const double *a,
           lapack_int lda, const double *b, lapack_int ldb, const double *vl,
           lapack_int ldvl, const double *vr, lapack_int ldvr, double *s,
           double *dif, lapack_int mm, lapack_int *m)
       lapack_int LAPACKE_ctgsna (int matrix_layout, char job, char howmny,
           const lapack_logical *select, lapack_int n, const
           lapack_complex_float *a, lapack_int lda, const lapack_complex_float
           *b, lapack_int ldb, const lapack_complex_float *vl, lapack_int ldvl,
           const lapack_complex_float *vr, lapack_int ldvr, float *s, float
           *dif, lapack_int mm, lapack_int *m)
       lapack_int LAPACKE_ztgsna (int matrix_layout, char job, char howmny,
           const lapack_logical *select, lapack_int n, const
           lapack_complex_double *a, lapack_int lda, const
           lapack_complex_double *b, lapack_int ldb, const
           lapack_complex_double *vl, lapack_int ldvl, const
           lapack_complex_double *vr, lapack_int ldvr, double *s, double *dif,
           lapack_int mm, lapack_int *m)

that’s the chunk 💅 still more synopsis energy loading, so keep scrolling bestie ✨

okay bestie we're still deep in the SYNOPSIS trenches and honestly? this is the triangular packed era of the list and it's lowkey giving "I memorized the whole LAPACK catalog" main character energy 💅 no cap, let's keep going, we're not even close to done ✨

🌀 the tgsyl girlies (Sylvester equation o'clock)

like, these ones solve the (generalized) Sylvester equation for you, which is such a mood 💜 four precisions, one job:

lapack_int LAPACKE_stgsyl (int matrix_layout, char trans, lapack_int
    ijob, lapack_int m, lapack_int n, const float *a, lapack_int lda,
    const float *b, lapack_int ldb, float *c, lapack_int ldc, const
    float *d, lapack_int ldd, const float *e, lapack_int lde, float *f,
    lapack_int ldf, float *scale, float *dif)
lapack_int LAPACKE_dtgsyl (int matrix_layout, char trans, lapack_int
    ijob, lapack_int m, lapack_int n, const double *a, lapack_int lda,
    const double *b, lapack_int ldb, double *c, lapack_int ldc, const
    double *d, lapack_int ldd, const double *e, lapack_int lde, double
    *f, lapack_int ldf, double *scale, double *dif)
lapack_int LAPACKE_ctgsyl (int matrix_layout, char trans, lapack_int
    ijob, lapack_int m, lapack_int n, const lapack_complex_float *a,
    lapack_int lda, const lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *c, lapack_int ldc, const lapack_complex_float
    *d, lapack_int ldd, const lapack_complex_float *e, lapack_int lde,
    lapack_complex_float *f, lapack_int ldf, float *scale, float *dif)
lapack_int LAPACKE_ztgsyl (int matrix_layout, char trans, lapack_int
    ijob, lapack_int m, lapack_int n, const lapack_complex_double *a,
    lapack_int lda, const lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *c, lapack_int ldc, const
    lapack_complex_double *d, lapack_int ldd, const
    lapack_complex_double *e, lapack_int lde, lapack_complex_double *f,
    lapack_int ldf, double *scale, double *dif)

🎀 tpcon — condition number of a packed triangular matrix

you know the vibe: packed storage, triangular matrix, how close to singular is it 🫶

lapack_int LAPACKE_stpcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const float *ap, float *rcond)
lapack_int LAPACKE_dtpcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const double *ap, double *rcond)
lapack_int LAPACKE_ctpcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const lapack_complex_float *ap, float *rcond)
lapack_int LAPACKE_ztpcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const lapack_complex_double *ap, double *rcond)

💀 tprfs — the error-bound bestie

refines a solution AND gives you ferr/berr so you can vibe-check how wrong you were 😭

lapack_int LAPACKE_stprfs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const float *ap, const
    float *b, lapack_int ldb, const float *x, lapack_int ldx, float
    *ferr, float *berr)
lapack_int LAPACKE_dtprfs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const double *ap, const
    double *b, lapack_int ldb, const double *x, lapack_int ldx, double
    *ferr, double *berr)
lapack_int LAPACKE_ctprfs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const lapack_complex_float
    *ap, const lapack_complex_float *b, lapack_int ldb, const
    lapack_complex_float *x, lapack_int ldx, float *ferr, float *berr)
lapack_int LAPACKE_ztprfs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const
    lapack_complex_double *ap, const lapack_complex_double *b,
    lapack_int ldb, const lapack_complex_double *x, lapack_int ldx,
    double *ferr, double *berr)

🧚 tptri — triangular inverse, packed edition

it inverts ap in place, that's the whole personality ✨

lapack_int LAPACKE_stptri (int matrix_layout, char uplo, char diag,
    lapack_int n, float *ap)
lapack_int LAPACKE_dtptri (int matrix_layout, char uplo, char diag,
    lapack_int n, double *ap)
lapack_int LAPACKE_ctptri (int matrix_layout, char uplo, char diag,
    lapack_int n, lapack_complex_float *ap)
lapack_int LAPACKE_ztptri (int matrix_layout, char uplo, char diag,
    lapack_int n, lapack_complex_double *ap)

🦋 tptrs — triangular solve, packed, multiple right-hand sides

solves A*X = B or A**T*X = B or A**H*X = B for you, no big deal 🔥

lapack_int LAPACKE_stptrs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const float *ap, float *b,
    lapack_int ldb)
lapack_int LAPACKE_dtptrs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const double *ap, double
    *b, lapack_int ldb)
lapack_int LAPACKE_ctptrs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const lapack_complex_float
    *ap, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_ztptrs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const
    lapack_complex_double *ap, lapack_complex_double *b, lapack_int ldb)

🌸 tpttf — packed triangular ➡️ Rectangular Full Packed

glow-up transformation arc, honestly 🎀 packed ap goes in, arf comes out:

lapack_int LAPACKE_stpttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const float *ap, float *arf)
lapack_int LAPACKE_dtpttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const double *ap, double *arf)
lapack_int LAPACKE_ctpttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_float *ap, lapack_complex_float
    *arf)
lapack_int LAPACKE_ztpttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_double *ap, lapack_complex_double
    *arf)

🌈 tpttr — packed triangular ➡️ full rectangular

same energy but the other direction, unpacking that glow-up into a with leading dimension lda 👑

lapack_int LAPACKE_stpttr (int matrix_layout, char uplo, lapack_int n,
    const float *ap, float *a, lapack_int lda)
lapack_int LAPACKE_dtpttr (int matrix_layout, char uplo, lapack_int n,
    const double *ap, double *a, lapack_int lda)
lapack_int LAPACKE_ctpttr (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float *ap, lapack_complex_float *a, lapack_int
    lda)
lapack_int LAPACKE_ztpttr (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double *ap, lapack_complex_double *a,
    lapack_int lda)

💜 trcon — condition number, but make it full storage

packed was cute, this one takes the whole rectangle with lda 🫶

lapack_int LAPACKE_strcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const float *a, lapack_int lda, float *rcond)
lapack_int LAPACKE_dtrcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const double *a, lapack_int lda, double *rcond)
lapack_int LAPACKE_ctrcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const lapack_complex_float *a, lapack_int lda,
    float *rcond)
lapack_int LAPACKE_ztrcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const lapack_complex_double *a, lapack_int lda,
    double *rcond)

👑 trevc — eigenvectors of a triangular matrix, step into my office

select is a lapack_logical * here for the real ones (and a const lapack_logical * for the complex ones, bestie, don't @ me) ✨ plus vl, vr, mm and an output m:

lapack_int LAPACKE_strevc (int matrix_layout, char side, char howmny,
    lapack_logical *select, lapack_int n, const float *t, lapack_int
    ldt, float *vl, lapack_int ldvl, float *vr, lapack_int ldvr,
    lapack_int mm, lapack_int *m)
lapack_int LAPACKE_dtrevc (int matrix_layout, char side, char howmny,
    lapack_logical *select, lapack_int n, const double *t, lapack_int
    ldt, double *vl, lapack_int ldvl, double *vr, lapack_int ldvr,
    lapack_int mm, lapack_int *m)
lapack_int LAPACKE_ctrevc (int matrix_layout, char side, char howmny,
    const lapack_logical *select, lapack_int n, lapack_complex_float *t,
    lapack_int ldt, lapack_complex_float *vl, lapack_int ldvl,
    lapack_complex_float *vr, lapack_int ldvr, lapack_int mm, lapack_int
    *m)
lapack_int LAPACKE_ztrevc (int matrix_layout, char side, char howmny,
    const lapack_logical *select, lapack_int n, lapack_complex_double
    *t, lapack_int ldt, lapack_complex_double *vl, lapack_int ldvl,
    lapack_complex_double *vr, lapack_int ldvr, lapack_int mm,
    lapack_int *m)
🚨 tiny note bestie: for ctrevc and ztrevc that t is not const (it's lapack_complex_float *t / lapack_complex_double *t), and select IS const there. the real versions get mutable select and const t. do not mix those up, i'm begging 🙈

🍓 trexc — swap two eigenvalues, reorder the Schur form

compq decides if it's bringing q along for the ride, and ifst/ilst are pointers in the real versions but plain lapack_int values in the complex ones 💅 literally look at them:

lapack_int LAPACKE_strexc (int matrix_layout, char compq, lapack_int n,
    float *t, lapack_int ldt, float *q, lapack_int ldq, lapack_int
    *ifst, lapack_int *ilst)
lapack_int LAPACKE_dtrexc (int matrix_layout, char compq, lapack_int n,
    double *t, lapack_int ldt, double *q, lapack_int ldq, lapack_int
    *ifst, lapack_int *ilst)
lapack_int LAPACKE_ctrexc (int matrix_layout, char compq, lapack_int n,
    lapack_complex_float *t, lapack_int ldt, lapack_complex_float *q,
    lapack_int ldq, lapack_int ifst, lapack_int ilst)
lapack_int LAPACKE_ztrexc (int matrix_layout, char compq, lapack_int n,
    lapack_complex_double *t, lapack_int ldt, lapack_complex_double *q,
    lapack_int ldq, lapack_int ifst, lapack_int ilst)

⭐ trrfs — refine that triangular solve, get the error bounds

ferr and berr again, we stay obsessed 😌

lapack_int LAPACKE_strrfs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const float *a, lapack_int
    lda, const float *b, lapack_int ldb, const float *x, lapack_int ldx,
    float *ferr, float *berr)
lapack_int LAPACKE_dtrrfs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const double *a,
    lapack_int lda, const double *b, lapack_int ldb, const double *x,
    lapack_int ldx, double *ferr, double *berr)
lapack_int LAPACKE_ctrrfs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const lapack_complex_float
    *a, lapack_int lda, const lapack_complex_float *b, lapack_int ldb,
    const lapack_complex_float *x, lapack_int ldx, float *ferr, float
    *berr)
lapack_int LAPACKE_ztrrfs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *b, lapack_int ldb, const
    lapack_complex_double *x, lapack_int ldx, double *ferr, double
    *berr)

🧚‍♀️ trsen — reorder the Schur decomposition, get s and sep too

job and compq are the vibe setters, select picks your faves, and you get m, s and sep back 💖 note the real ones squeeze out wr and wi while the complex ones just hand you w:

lapack_int LAPACKE_strsen (int matrix_layout, char job, char compq,
    const lapack_logical *select, lapack_int n, float *t, lapack_int
    ldt, float *q, lapack_int ldq, float *wr, float *wi, lapack_int *m,
    float *s, float *sep)
lapack_int LAPACKE_dtrsen (int matrix_layout, char job, char compq,
    const lapack_logical *select, lapack_int n, double *t, lapack_int
    ldt, double *q, lapack_int ldq, double *wr, double *wi, lapack_int
    *m, double *s, double *sep)
lapack_int LAPACKE_ctrsen (int matrix_layout, char job, char compq,
    const lapack_logical *select, lapack_int n, lapack_complex_float *t,
    lapack_int ldt, lapack_complex_float *q, lapack_int ldq,
    lapack_complex_float *w, lapack_int *m, float *s, float *sep)
lapack_int LAPACKE_ztrsen (int matrix_layout, char job, char compq,
    const lapack_logical *select, lapack_int n, lapack_complex_double
    *t, lapack_int ldt, lapack_complex_double *q, lapack_int ldq,
    lapack_complex_double *w, lapack_int *m, double *s, double *sep)

🔥 trsna — condition numbers of the eigenvalues, the whole point tbh

job, howmny, select, t, vl, vr, s, sep, mm, and out comes m. it's giving final boss of the triangular section 🌈 and yes we're stopping mid-family here, ztrsna is coming in the next part, don't come for me 💀

lapack_int LAPACKE_strsna (int matrix_layout, char job, char howmny,
    const lapack_logical *select, lapack_int n, const float *t,
    lapack_int ldt, const float *vl, lapack_int ldvl, const float *vr,
    lapack_int ldvr, float *s, float *sep, lapack_int mm, lapack_int *m)
lapack_int LAPACKE_dtrsna (int matrix_layout, char job, char howmny,
    const lapack_logical *select, lapack_int n, const double *t,
    lapack_int ldt, const double *vl, lapack_int ldvl, const double *vr,
    lapack_int ldvr, double *s, double *sep, lapack_int mm, lapack_int
    *m)
lapack_int LAPACKE_ctrsna (int matrix_layout, char job, char howmny,
    const lapack_logical *select, lapack_int n, const
    lapack_complex_float *t, lapack_int ldt, const lapack_complex_float
    *vl, lapack_int ldvl, const lapack_complex_float *vr, lapack_int
    ldvr, float *s, float *sep, lapack_int mm, lapack_int *m)

that's where we're at bestie, ztrsna and friends are literally right there waiting 🫶

Bestie, next chunk of the function roll-call. Same energy: sig, sig, sig, and I'm gonna hype each little family so none of them feel left out 🫶

🦋 the tr* girlies

First up, ztrsna — the lone complex-double representative here in this stretch, repping the select/howmny lifestyle with s and sep on the side:

lapack_int LAPACKE_ztrsna (int matrix_layout, char job, char howmny,
    const lapack_logical *select, lapack_int n, const
    lapack_complex_double *t, lapack_int ldt, const
    lapack_complex_double *vl, lapack_int ldvl, const
    lapack_complex_double *vr, lapack_int ldvr, double *s, double *sep,
    lapack_int mm, lapack_int *m)

And then the whole trsyl squad, all four precisions, every one of them rocking trana, tranb, isgn, and a scale pointer at the very end (she's important, don't ghost her):

lapack_int LAPACKE_strsyl (int matrix_layout, char trana, char tranb,
    lapack_int isgn, lapack_int m, lapack_int n, const float *a,
    lapack_int lda, const float *b, lapack_int ldb, float *c, lapack_int
    ldc, float *scale)
lapack_int LAPACKE_dtrsyl (int matrix_layout, char trana, char tranb,
    lapack_int isgn, lapack_int m, lapack_int n, const double *a,
    lapack_int lda, const double *b, lapack_int ldb, double *c,
    lapack_int ldc, double *scale)
lapack_int LAPACKE_ctrsyl (int matrix_layout, char trana, char tranb,
    lapack_int isgn, lapack_int m, lapack_int n, const
    lapack_complex_float *a, lapack_int lda, const lapack_complex_float
    *b, lapack_int ldb, lapack_complex_float *c, lapack_int ldc, float
    *scale)
lapack_int LAPACKE_ztrsyl (int matrix_layout, char trana, char tranb,
    lapack_int isgn, lapack_int m, lapack_int n, const
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double *c,
    lapack_int ldc, double *scale)

Next the triangular trio-of-trio: trtri (the inverse crew), trtrs (the solve crew), trttf (the transpose-then-arf crew), and trttp (the plain-old-ap crew). All four precisions each, no crumbs 🍓

lapack_int LAPACKE_strtri (int matrix_layout, char uplo, char diag,
    lapack_int n, float *a, lapack_int lda)
lapack_int LAPACKE_dtrtri (int matrix_layout, char uplo, char diag,
    lapack_int n, double *a, lapack_int lda)
lapack_int LAPACKE_ctrtri (int matrix_layout, char uplo, char diag,
    lapack_int n, lapack_complex_float *a, lapack_int lda)
lapack_int LAPACKE_ztrtri (int matrix_layout, char uplo, char diag,
    lapack_int n, lapack_complex_double *a, lapack_int lda)
lapack_int LAPACKE_strtrs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const float *a, lapack_int
    lda, float *b, lapack_int ldb)
lapack_int LAPACKE_dtrtrs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const double *a,
    lapack_int lda, double *b, lapack_int ldb)
lapack_int LAPACKE_ctrtrs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const lapack_complex_float
    *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_ztrtrs (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const
    lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
    lapack_int ldb)
lapack_int LAPACKE_strttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const float *a, lapack_int lda, float *arf)
lapack_int LAPACKE_dtrttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const double *a, lapack_int lda, double *arf)
lapack_int LAPACKE_ctrttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *arf)
lapack_int LAPACKE_ztrttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *arf)
lapack_int LAPACKE_strttp (int matrix_layout, char uplo, lapack_int n,
    const float *a, lapack_int lda, float *ap)
lapack_int LAPACKE_dtrttp (int matrix_layout, char uplo, lapack_int n,
    const double *a, lapack_int lda, double *ap)
lapack_int LAPACKE_ctrttp (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float *a, lapack_int lda, lapack_complex_float
    *ap)
lapack_int LAPACKE_ztrttp (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *ap)

✨ tzrzf — short king, big energy

Four lines, matrix_layout, m, n, a matrix, and a tau. She's compact and she knows it:

lapack_int LAPACKE_stzrzf (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, float *tau)
lapack_int LAPACKE_dtzrzf (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, double *tau)
lapack_int LAPACKE_ctzrzf (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_complex_float
    *tau)
lapack_int LAPACKE_ztzrzf (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_complex_double
    *tau)

💜 the ung** glow-up era (complex only, she's exclusive)

ungbr comes in two flavours and takes vect:

lapack_int LAPACKE_cungbr (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int k, lapack_complex_float *a, lapack_int lda,
    const lapack_complex_float *tau)
lapack_int LAPACKE_zungbr (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int k, lapack_complex_double *a, lapack_int
    lda, const lapack_complex_double *tau)

unghr brings ilo and ihi to the party:

lapack_int LAPACKE_cunghr (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, lapack_complex_float *a, lapack_int lda, const
    lapack_complex_float *tau)
lapack_int LAPACKE_zunghr (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau)

Then the m/n/k twinsies — unglq, ungql, ungqr, ungrq — four pairs, same shape, different last letter (and like… that last letter is doing SO much work, respect):

lapack_int LAPACKE_cunglq (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_float *a, lapack_int lda, const
    lapack_complex_float *tau)
lapack_int LAPACKE_zunglq (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau)
lapack_int LAPACKE_cungql (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_float *a, lapack_int lda, const
    lapack_complex_float *tau)
lapack_int LAPACKE_zungql (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau)
lapack_int LAPACKE_cungqr (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_float *a, lapack_int lda, const
    lapack_complex_float *tau)
lapack_int LAPACKE_zungqr (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau)
lapack_int LAPACKE_cungrq (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_float *a, lapack_int lda, const
    lapack_complex_float *tau)
lapack_int LAPACKE_zungrq (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau)

And ungtr closes out this block with uplo and no m/n/k at all — she's built different:

lapack_int LAPACKE_cungtr (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float *a, lapack_int lda, const lapack_complex_float
    *tau)
lapack_int LAPACKE_zungtr (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau)

👑 the unm** collective — same vibes, side and trans unlocked

unmbr — it's giving full option menu (vect, side, trans, m, n, k) plus a c output matrix:

lapack_int LAPACKE_cunmbr (int matrix_layout, char vect, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const
    lapack_complex_float *a, lapack_int lda, const lapack_complex_float
    *tau, lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zunmbr (int matrix_layout, char vect, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau, lapack_complex_double *c, lapack_int
    ldc)

unmhr swaps vect for ilo + ihi:

lapack_int LAPACKE_cunmhr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const
    lapack_complex_float *a, lapack_int lda, const lapack_complex_float
    *tau, lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zunmhr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau, lapack_complex_double *c, lapack_int
    ldc)

Then the m/n/k set: unmlq, unmql, unmqr, unmrq — all with side and trans up front, c and ldc bringing up the rear:

lapack_int LAPACKE_cunmlq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float
    *a, lapack_int lda, const lapack_complex_float *tau,
    lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zunmlq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau, lapack_complex_double *c, lapack_int
    ldc)
lapack_int LAPACKE_cunmql (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float
    *a, lapack_int lda, const lapack_complex_float *tau,
    lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zunmql (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau, lapack_complex_double *c, lapack_int
    ldc)
lapack_int LAPACKE_cunmqr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float
    *a, lapack_int lda, const lapack_complex_float *tau,
    lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zunmqr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau, lapack_complex_double *c, lapack_int
    ldc)
lapack_int LAPACKE_cunmrq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float
    *a, lapack_int lda, const lapack_complex_float *tau,
    lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zunmrq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau, lapack_complex_double *c, lapack_int
    ldc)

unmrz is the bonus-boss version with an extra l wedged in there (ngl I clocked it immediately):

lapack_int LAPACKE_cunmrz (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, const
    lapack_complex_float *a, lapack_int lda, const lapack_complex_float
    *tau, lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zunmrz (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, const
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *tau, lapack_complex_double *c, lapack_int
    ldc)

And this part cuts off mid-unmtr — cunmtr is here in full, zunmtr is left hanging right at const lapack_complex_double *tau,… don't worry bestie, it gets finished next part 😭💅

lapack_int LAPACKE_cunmtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const lapack_complex_float *a,
    lapack_int lda, const lapack_complex_float *tau,
    lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zunmtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const lapack_complex_double *a,
    lapack_int lda, const lapack_complex_double *tau,

…and to finish off that declaration from before, the tail end looks like this (yes, it's a leftover line, she's just vibing):

           lapack_complex_double *c, lapack_int ldc)
       lapack_int LAPACKE_cupgtr (int matrix_layout, char uplo, lapack_int n,
           const lapack_complex_float *ap, const lapack_complex_float *tau,
           lapack_complex_float *q, lapack_int ldq)
       lapack_int LAPACKE_zupgtr (int matrix_layout, char uplo, lapack_int n,
           const lapack_complex_double *ap, const lapack_complex_double *tau,
           lapack_complex_double *q, lapack_int ldq)

✨ two of them, c and z, same shape, different precision. ok and then their sibling:

       lapack_int LAPACKE_cupmtr (int matrix_layout, char side, char uplo, char
           trans, lapack_int m, lapack_int n, const lapack_complex_float *ap,
           const lapack_complex_float *tau, lapack_complex_float *c, lapack_int
           ldc)
       lapack_int LAPACKE_zupmtr (int matrix_layout, char side, char uplo, char
           trans, lapack_int m, lapack_int n, const lapack_complex_double *ap,
           const lapack_complex_double *tau, lapack_complex_double *c,
           lapack_int ldc)

note the side 👀 she brought an extra char parameter to the party, iconic behavior.


🦋 the bdsdc girlies

       lapack_int LAPACKE_sbdsdc_work (int matrix_layout, char uplo, char
           compq, lapack_int n, float *d, float *e, float *u, lapack_int ldu,
           float *vt, lapack_int ldvt, float *q, lapack_int *iq, float *work,
           lapack_int *iwork)
       lapack_int LAPACKE_dbdsdc_work (int matrix_layout, char uplo, char
           compq, lapack_int n, double *d, double *e, double *u, lapack_int
           ldu, double *vt, lapack_int ldvt, double *q, lapack_int *iq, double
           *work, lapack_int *iwork)

ok so these two are highkey the "moving apartments" type — they take u, vt, q, iq, work, iwork, all of it. very main character energy, takes up the whole group chat 💀

then the bdsvdx duo, which is the same vibe but with ns, s, and z in the mix:

       lapack_int LAPACKE_sbdsvdx_work (int matrix_layout, char uplo, char
           jobz, char range, lapack_int n, float *d, float *e, float vl, float
           vu, lapack_int il, lapack_int iu, lapack_int *ns, float *s, float
           *z, lapack_int ldz, float *work, lapack_int *iwork)
       lapack_int LAPACKE_dbdsvdx_work (int matrix_layout, char uplo, char
           jobz, char range, lapack_int n, double *d, double *e, double vl,
           double vu, lapack_int il, lapack_int iu, lapack_int *ns, double *s,
           double *z, lapack_int ldz, double *work, lapack_int *iwork)

jobz and range both chars, vl/vu, il/iu — she's got options and she's not afraid to use them.


💅 bdsqr — the whole squad shows up

four of them fr fr, one per type:

       lapack_int LAPACKE_sbdsqr_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int ncvt, lapack_int nru, lapack_int ncc, float *d, float
           *e, float *vt, lapack_int ldvt, float *u, lapack_int ldu, float *c,
           lapack_int ldc, float *work)
       lapack_int LAPACKE_dbdsqr_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int ncvt, lapack_int nru, lapack_int ncc, double *d,
           double *e, double *vt, lapack_int ldvt, double *u, lapack_int ldu,
           double *c, lapack_int ldc, double *work)
       lapack_int LAPACKE_cbdsqr_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int ncvt, lapack_int nru, lapack_int ncc, float *d, float
           *e, lapack_complex_float *vt, lapack_int ldvt, lapack_complex_float
           *u, lapack_int ldu, lapack_complex_float *c, lapack_int ldc, float
           *work)
       lapack_int LAPACKE_zbdsqr_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int ncvt, lapack_int nru, lapack_int ncc, double *d,
           double *e, lapack_complex_double *vt, lapack_int ldvt,
           lapack_complex_double *u, lapack_int ldu, lapack_complex_double *c,
           lapack_int ldc, double *work)

things to notice bestie: ncvt, nru, ncc — three whole counts, and ldvt, ldu, ldc — three whole leading dimensions. she said be thorough. also the c/z ones keep d and e as plain float/double while vt, u, c go complex. the way that's consistent across both. ate. 🎀


🫶 disna — only two, tiny icon

       lapack_int LAPACKE_sdisna_work (char job, lapack_int m, lapack_int n,
           const float *d, float *sep)
       lapack_int LAPACKE_ddisna_work (char job, lapack_int m, lapack_int n,
           const double *d, double *sep)

no matrix_layout here 💀 she's built different. just job, m, n, d, sep. minimal, clean, no notes.


🌈 gbbrd — the fancy one with a vector param

       lapack_int LAPACKE_sgbbrd_work (int matrix_layout, char vect, lapack_int
           m, lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku, float
           *ab, lapack_int ldab, float *d, float *e, float *q, lapack_int ldq,
           float *pt, lapack_int ldpt, float *c, lapack_int ldc, float *work)
       lapack_int LAPACKE_dgbbrd_work (int matrix_layout, char vect, lapack_int
           m, lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku,
           double *ab, lapack_int ldab, double *d, double *e, double *q,
           lapack_int ldq, double *pt, lapack_int ldpt, double *c, lapack_int
           ldc, double *work)
       lapack_int LAPACKE_cgbbrd_work (int matrix_layout, char vect, lapack_int
           m, lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku,
           lapack_complex_float *ab, lapack_int ldab, float *d, float *e,
           lapack_complex_float *q, lapack_int ldq, lapack_complex_float *pt,
           lapack_int ldpt, lapack_complex_float *c, lapack_int ldc,
           lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zgbbrd_work (int matrix_layout, char vect, lapack_int
           m, lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku,
           lapack_complex_double *ab, lapack_int ldab, double *d, double *e,
           lapack_complex_double *q, lapack_int ldq, lapack_complex_double *pt,
           lapack_int ldpt, lapack_complex_double *c, lapack_int ldc,
           lapack_complex_double *work, double *rwork)

q and pt and c all in one signature — she's the friend who brings snacks, drinks, and a playlist 🍓 and pls note the complex ones get that extra rwork at the end. not me pointing out that asymmetry 🙈


⭐ gbcon — converged and serving

       lapack_int LAPACKE_sgbcon_work (int matrix_layout, char norm, lapack_int
           n, lapack_int kl, lapack_int ku, const float *ab, lapack_int ldab,
           const lapack_int *ipiv, float anorm, float *rcond, float *work,
           lapack_int *iwork)
       lapack_int LAPACKE_dgbcon_work (int matrix_layout, char norm, lapack_int
           n, lapack_int kl, lapack_int ku, const double *ab, lapack_int ldab,
           const lapack_int *ipiv, double anorm, double *rcond, double *work,
           lapack_int *iwork)
       lapack_int LAPACKE_cgbcon_work (int matrix_layout, char norm, lapack_int
           n, lapack_int kl, lapack_int ku, const lapack_complex_float *ab,
           lapack_int ldab, const lapack_int *ipiv, float anorm, float *rcond,
           lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zgbcon_work (int matrix_layout, char norm, lapack_int
           n, lapack_int kl, lapack_int ku, const lapack_complex_double *ab,
           lapack_int ldab, const lapack_int *ipiv, double anorm, double
           *rcond, lapack_complex_double *work, double *rwork)

norm is a char (iconic), ipiv is const lapack_int * (respectful), anorm is passed by value, rcond is the output. the real ones get iwork, the complex ones get rwork — same drama, different accessory 💅


🧚 gbequ and her louder cousin gbequb

       lapack_int LAPACKE_sgbequ_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const float *ab,
           lapack_int ldab, float *r, float *c, float *rowcnd, float *colcnd,
           float *amax)
       lapack_int LAPACKE_dgbequ_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const double *ab,
           lapack_int ldab, double *r, double *c, double *rowcnd, double
           *colcnd, double *amax)
       lapack_int LAPACKE_cgbequ_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const
           lapack_complex_float *ab, lapack_int ldab, float *r, float *c, float
           *rowcnd, float *colcnd, float *amax)
       lapack_int LAPACKE_zgbequ_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const
           lapack_complex_double *ab, lapack_int ldab, double *r, double *c,
           double *rowcnd, double *colcnd, double *amax)

and the b version, which is literally the identical signature list, just with a b on the name:

       lapack_int LAPACKE_sgbequb_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const float *ab,
           lapack_int ldab, float *r, float *c, float *rowcnd, float *colcnd,
           float *amax)
       lapack_int LAPACKE_dgbequb_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const double *ab,
           lapack_int ldab, double *r, double *c, double *rowcnd, double
           *colcnd, double *amax)
       lapack_int LAPACKE_cgbequb_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const
           lapack_complex_float *ab, lapack_int ldab, float *r, float *c, float
           *rowcnd, float *colcnd, float *amax)
       lapack_int LAPACKE_zgbequb_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const
           lapack_complex_double *ab, lapack_int ldab, double *r, double *c,
           double *rowcnd, double *colcnd, double *amax)

the way they're twins. no notes, just r, c, rowcnd, colcnd, amax in every single one. consistent queen 👑


🔥 gbrfs — came to refine

       lapack_int LAPACKE_sgbrfs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
           float *ab, lapack_int ldab, const float *afb, lapack_int ldafb,
           const lapack_int *ipiv, const float *b, lapack_int ldb, float *x,
           lapack_int ldx, float *ferr, float *berr, float *work, lapack_int
           *iwork)
       lapack_int LAPACKE_dgbrfs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
           double *ab, lapack_int ldab, const double *afb, lapack_int ldafb,
           const lapack_int *ipiv, const double *b, lapack_int ldb, double *x,
           lapack_int ldx, double *ferr, double *berr, double *work, lapack_int
           *iwork)
       lapack_int LAPACKE_cgbrfs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
           lapack_complex_float *ab, lapack_int ldab, const
           lapack_complex_float *afb, lapack_int ldafb, const lapack_int *ipiv,
           const lapack_complex_float *b, lapack_int ldb, lapack_complex_float
           *x, lapack_int ldx, float *ferr, float *berr, lapack_complex_float
           *work, float *rwork)
       lapack_int LAPACKE_zgbrfs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
           lapack_complex_double *ab, lapack_int ldab, const
           lapack_complex_double *afb, lapack_int ldafb, const lapack_int
           *ipiv, const lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork)

ok so we got ab and afb, ldab and ldafb, b and x, ldb and ldx, plus ferr and berr. that's a lot of parallel universes happening in one function call, and honestly? she pulls it off. 💖


👑 gbrfsx — gbrfs but make it extra

       lapack_int LAPACKE_sgbrfsx_work (int matrix_layout, char trans, char
           equed, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
           const float *ab, lapack_int ldab, const float *afb, lapack_int
           ldafb, const lapack_int *ipiv, const float *r, const float *c, const
           float *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond,
           float *berr, lapack_int n_err_bnds, float *err_bnds_norm, float
           *err_bnds_comp, lapack_int nparams, float *params, float *work,
           lapack_int *iwork)
       lapack_int LAPACKE_dgbrfsx_work (int matrix_layout, char trans, char
           equed, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
           const double *ab, lapack_int ldab, const double *afb, lapack_int
           ldafb, const lapack_int *ipiv, const double *r, const double *c,
           const double *b, lapack_int ldb, double *x, lapack_int ldx, double
           *rcond, double *berr, lapack_int n_err_bnds, double *err_bnds_norm,
           double *err_bnds_comp, lapack_int nparams, double *params, double
           *work, lapack_int *iwork)
       lapack_int LAPACKE_cgbrfsx_work (int matrix_layout, char trans, char
           equed, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
           const lapack_complex_float *ab, lapack_int ldab, const
           lapack_complex_float *afb, lapack_int ldafb, const lapack_int *ipiv,
           const float *r, const float *c, const lapack_complex_float *b,
           lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float
           *rcond, float *berr, lapack_int n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int nparams, float *params,
           lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zgbrfsx_work (int matrix_layout, char trans, char
           equed, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,

and yes, that's where we stop for now — cliffhanger mid-signature, the audacity 😭 the s, d, and c versions are fully here with equed, r, c, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params and their work arrays; the z one is still mid-sentence and we're gonna pick her up next time. 🦋

okay so we're still deep in the prototype lineup, bestie — no cap, every single signature below is exactly as it appears, so don't let the group-chat energy fool you 💅✨

const lapack_complex_double *ab, lapack_int ldab, const lapack_complex_double *afb, lapack_int ldafb, const lapack_int *ipiv, const double *r, const double *c, const lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double *rcond, double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double *params, lapack_complex_double *work, double *rwork)
lapack_int LAPACKE_sgbsv_work (int matrix_layout, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, float *ab, lapack_int ldab, lapack_int *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_dgbsv_work (int matrix_layout, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, double *ab, lapack_int ldab, lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_cgbsv_work (int matrix_layout, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, lapack_complex_float *ab, lapack_int ldab, lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zgbsv_work (int matrix_layout, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, lapack_complex_double *ab, lapack_int ldab, lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
lapack_int LAPACKE_sgbsvx_work (int matrix_layout, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, float *ab, lapack_int ldab, float *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, float *r, float *c, float *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond, float *ferr, float *berr, float *work, lapack_int *iwork)
lapack_int LAPACKE_dgbsvx_work (int matrix_layout, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, double *ab, lapack_int ldab, double *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, double *r, double *c, double *b, lapack_int ldb, double *x, lapack_int ldx, double *rcond, double *ferr, double *berr, double *work, lapack_int *iwork)
lapack_int LAPACKE_cgbsvx_work (int matrix_layout, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, lapack_complex_float *ab, lapack_int ldab, lapack_complex_float *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, float *r, float *c, lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float *rcond, float *ferr, float *berr, lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zgbsvx_work (int matrix_layout, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, lapack_complex_double *ab, lapack_int ldab, lapack_complex_double *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, double *r, double *c, lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double *rcond, double *ferr, double *berr, lapack_complex_double *work, double *rwork)
lapack_int LAPACKE_sgbsvxx_work (int matrix_layout, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, float *ab, lapack_int ldab, float *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, float *r, float *c, float *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond, float *rpvgrw, float *berr, lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float *params, float *work, lapack_int *iwork)
lapack_int LAPACKE_dgbsvxx_work (int matrix_layout, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, double *ab, lapack_int ldab, double *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, double *r, double *c, double *b, lapack_int ldb, double *x, lapack_int ldx, double *rcond, double *rpvgrw, double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double *params, double *work, lapack_int *iwork)
lapack_int LAPACKE_cgbsvxx_work (int matrix_layout, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, lapack_complex_float *ab, lapack_int ldab, lapack_complex_float *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, float *r, float *c, lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float *rcond, float *rpvgrw, float *berr, lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float *params, lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zgbsvxx_work (int matrix_layout, char fact, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, lapack_complex_double *ab, lapack_int ldab, lapack_complex_double *afb, lapack_int ldafb, lapack_int *ipiv, char *equed, double *r, double *c, lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double *rcond, double *rpvgrw, double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double *params, lapack_complex_double *work, double *rwork)
lapack_int LAPACKE_sgbtrf_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, float *ab, lapack_int ldab, lapack_int *ipiv)
lapack_int LAPACKE_dgbtrf_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, double *ab, lapack_int ldab, lapack_int *ipiv)
lapack_int LAPACKE_cgbtrf_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, lapack_complex_float *ab, lapack_int ldab, lapack_int *ipiv)
lapack_int LAPACKE_zgbtrf_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, lapack_complex_double *ab, lapack_int ldab, lapack_int *ipiv)
lapack_int LAPACKE_sgbtrs_work (int matrix_layout, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const float *ab, lapack_int ldab, const lapack_int *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_dgbtrs_work (int matrix_layout, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const double *ab, lapack_int ldab, const lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_cgbtrs_work (int matrix_layout, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const lapack_complex_float *ab, lapack_int ldab, const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zgbtrs_work (int matrix_layout, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const lapack_complex_double *ab, lapack_int ldab, const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
lapack_int LAPACKE_sgebak_work (int matrix_layout, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi, const float *scale, lapack_int m, float *v, lapack_int ldv)
lapack_int LAPACKE_dgebak_work (int matrix_layout, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi, const double *scale, lapack_int m, double *v, lapack_int ldv)
lapack_int LAPACKE_cgebak_work (int matrix_layout, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi, const float *scale, lapack_int m, lapack_complex_float *v, lapack_int ldv)
lapack_int LAPACKE_zgebak_work (int matrix_layout, char job, char side, lapack_int n, lapack_int ilo, lapack_int ihi, const double *scale, lapack_int m, lapack_complex_double *v, lapack_int ldv)
lapack_int LAPACKE_sgebal_work (int matrix_layout, char job, lapack_int n, float *a, lapack_int lda, lapack_int *ilo, lapack_int *ihi, float *scale)
lapack_int LAPACKE_dgebal_work (int matrix_layout, char job, lapack_int n, double *a, lapack_int lda, lapack_int *ilo, lapack_int *ihi, double *scale)
lapack_int LAPACKE_cgebal_work (int matrix_layout, char job, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int *ilo, lapack_int *ihi, float *scale)
lapack_int LAPACKE_zgebal_work (int matrix_layout, char job, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int *ilo, lapack_int *ihi, double *scale)
lapack_int LAPACKE_sgebrd_work (int matrix_layout, lapack_int m, lapack_int n, float *a, lapack_int lda, float *d, float *e, float *tauq, float *taup, float *work, lapack_int lwork)
lapack_int LAPACKE_dgebrd_work (int matrix_layout, lapack_int m, lapack_int n, double *a, lapack_int lda, double *d, double *e, double *tauq, double *taup, double *work, lapack_int lwork)
lapack_int LAPACKE_cgebrd_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, float *d, float *e, lapack_complex_float *tauq, lapack_complex_float *taup, lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zgebrd_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, double *d, double *e, lapack_complex_double *tauq, lapack_complex_double *taup, lapack_complex_double *work, lapack_int lwork)
lapack_int LAPACKE_sgecon_work (int matrix_layout, char norm, lapack_int n, const float *a, lapack_int lda, float anorm, float *rcond, float *work, lapack_int *iwork)
lapack_int LAPACKE_dgecon_work (int matrix_layout, char norm, lapack_int n, const double *a, lapack_int lda, double anorm, double *rcond, double *work, lapack_int *iwork)
lapack_int LAPACKE_cgecon_work (int matrix_layout, char norm, lapack_int n, const lapack_complex_float *a, lapack_int lda, float anorm, float *rcond, lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zgecon_work (int matrix_layout, char norm, lapack_int n, const lapack_complex_double *a, lapack_int lda, double anorm, double *rcond, lapack_complex_double *work, double *rwork)
lapack_int LAPACKE_sgeequ_work (int matrix_layout, lapack_int m, lapack_int n, const float *a, lapack_int lda, float *r, float *c, float *rowcnd, float *colcnd, float *amax)
lapack_int LAPACKE_dgeequ_work (int matrix_layout, lapack_int m, lapack_int n, const double *a, lapack_int lda, double *r, double *c, double *rowcnd, double *colcnd, double *amax)
lapack_int LAPACKE_cgeequ_work (int matrix_layout, lapack_int m, lapack_int n, const lapack_complex_float *a, lapack_int lda, float *r, float *c, float *rowcnd, float *colcnd, float *amax)
lapack_int LAPACKE_zgeequ_work (int matrix_layout, lapack_int m, lapack_int n, const lapack_complex_double *a, lapack_int lda, double *r, double *c, double *rowcnd, double *colcnd, double *amax)
lapack_int LAPACKE_sgeequb_work (int matrix_layout, lapack_int m,

…and we're picking up mid-signature, because that's just how the group chat scrolls 💀 — single-precision geequb was literally in the middle of handing out its argument list:

lapack_int n, const float *a, lapack_int lda, float *r, float *c,
    float *rowcnd, float *colcnd, float *amax)
lapack_int LAPACKE_dgeequb_work (int matrix_layout, lapack_int m,
    lapack_int n, const double *a, lapack_int lda, double *r, double *c,
    double *rowcnd, double *colcnd, double *amax)
lapack_int LAPACKE_cgeequb_work (int matrix_layout, lapack_int m,
    lapack_int n, const lapack_complex_float *a, lapack_int lda, float
    *r, float *c, float *rowcnd, float *colcnd, float *amax)
lapack_int LAPACKE_zgeequb_work (int matrix_layout, lapack_int m,
    lapack_int n, const lapack_complex_double *a, lapack_int lda, double
    *r, double *c, double *rowcnd, double *colcnd, double *amax)

Not me noticing that all four of these are the exact same shape but with a different precision 💅 the complex ones (c and z) still hand you back plain float / double for r, c, rowcnd, colcnd and amax — the scaling vibes are real, periodt ✨


🦋 the gees squad

Four of them, four precisions, and the way that the select argument is typed differently for real vs complex is lowkey iconic:

lapack_int LAPACKE_sgees_work (int matrix_layout, char jobvs, char sort,
    LAPACK_S_SELECT2 select, lapack_int n, float *a, lapack_int lda,
    lapack_int *sdim, float *wr, float *wi, float *vs, lapack_int ldvs,
    float *work, lapack_int lwork, lapack_logical *bwork)
lapack_int LAPACKE_dgees_work (int matrix_layout, char jobvs, char sort,
    LAPACK_D_SELECT2 select, lapack_int n, double *a, lapack_int lda,
    lapack_int *sdim, double *wr, double *wi, double *vs, lapack_int
    ldvs, double *work, lapack_int lwork, lapack_logical *bwork)
lapack_int LAPACKE_cgees_work (int matrix_layout, char jobvs, char sort,
    LAPACK_C_SELECT1 select, lapack_int n, lapack_complex_float *a,
    lapack_int lda, lapack_int *sdim, lapack_complex_float *w,
    lapack_complex_float *vs, lapack_int ldvs, lapack_complex_float
    *work, lapack_int lwork, float *rwork, lapack_logical *bwork)
lapack_int LAPACKE_zgees_work (int matrix_layout, char jobvs, char sort,
    LAPACK_Z_SELECT1 select, lapack_int n, lapack_complex_double *a,
    lapack_int lda, lapack_int *sdim, lapack_complex_double *w,
    lapack_complex_double *vs, lapack_int ldvs, lapack_complex_double
    *work, lapack_int lwork, double *rwork, lapack_logical *bwork)

Real ones get LAPACK_S_SELECT2 / LAPACK_D_SELECT2 and split their outputs into wr + wi 🌸 complex ones get LAPACK_C_SELECT1 / LAPACK_Z_SELECT1, a single w, and that extra rwork zooming in at the end. Everyone shares jobvs, sort, n, a, lda, sdim, vs, ldvs, work, lwork and the lil lapack_logical *bwork at the very back 🫶


🔥 the geesx squad (same but extra)

geesx is gees after a glow-up: there's a new char sense bestie, a rconde, a rcondv, and on real precisions an iwork + liwork couple tagging along at the end:

lapack_int LAPACKE_sgeesx_work (int matrix_layout, char jobvs, char
    sort, LAPACK_S_SELECT2 select, char sense, lapack_int n, float *a,
    lapack_int lda, lapack_int *sdim, float *wr, float *wi, float *vs,
    lapack_int ldvs, float *rconde, float *rcondv, float *work,
    lapack_int lwork, lapack_int *iwork, lapack_int liwork,
    lapack_logical *bwork)
lapack_int LAPACKE_dgeesx_work (int matrix_layout, char jobvs, char
    sort, LAPACK_D_SELECT2 select, char sense, lapack_int n, double *a,
    lapack_int lda, lapack_int *sdim, double *wr, double *wi, double
    *vs, lapack_int ldvs, double *rconde, double *rcondv, double *work,
    lapack_int lwork, lapack_int *iwork, lapack_int liwork,
    lapack_logical *bwork)
lapack_int LAPACKE_cgeesx_work (int matrix_layout, char jobvs, char
    sort, LAPACK_C_SELECT1 select, char sense, lapack_int n,
    lapack_complex_float *a, lapack_int lda, lapack_int *sdim,
    lapack_complex_float *w, lapack_complex_float *vs, lapack_int ldvs,
    float *rconde, float *rcondv, lapack_complex_float *work, lapack_int
    lwork, float *rwork, lapack_logical *bwork)
lapack_int LAPACKE_zgeesx_work (int matrix_layout, char jobvs, char
    sort, LAPACK_Z_SELECT1 select, char sense, lapack_int n,
    lapack_complex_double *a, lapack_int lda, lapack_int *sdim,
    lapack_complex_double *w, lapack_complex_double *vs, lapack_int
    ldvs, double *rconde, double *rcondv, lapack_complex_double *work,
    lapack_int lwork, double *rwork, lapack_logical *bwork)

Ok so real talk 🍓 — the c and z versions trade iwork/liwork for rwork, while s and d keep the iwork/liwork duo and have no rwork. Not confusing at all bestie 💀 literally just read the line twice and you're fine.


👑 geev — four lines, zero ambiguity

lapack_int LAPACKE_sgeev_work (int matrix_layout, char jobvl, char
    jobvr, lapack_int n, float *a, lapack_int lda, float *wr, float *wi,
    float *vl, lapack_int ldvl, float *vr, lapack_int ldvr, float *work,
    lapack_int lwork)
lapack_int LAPACKE_dgeev_work (int matrix_layout, char jobvl, char
    jobvr, lapack_int n, double *a, lapack_int lda, double *wr, double
    *wi, double *vl, lapack_int ldvl, double *vr, lapack_int ldvr,
    double *work, lapack_int lwork)
lapack_int LAPACKE_cgeev_work (int matrix_layout, char jobvl, char
    jobvr, lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *w, lapack_complex_float *vl, lapack_int ldvl,
    lapack_complex_float *vr, lapack_int ldvr, lapack_complex_float
    *work, lapack_int lwork, float *rwork)
lapack_int LAPACKE_zgeev_work (int matrix_layout, char jobvl, char
    jobvr, lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *w, lapack_complex_double *vl, lapack_int
    ldvl, lapack_complex_double *vr, lapack_int ldvr,
    lapack_complex_double *work, lapack_int lwork, double *rwork)

jobvl + jobvr twin flags, vl/ldvl and vr/ldvr twin matrix args — very matching-set energy ✨ and yes the complex couples bring rwork to the party again, no cap.


🌈 geevx — the extended cut

lapack_int LAPACKE_sgeevx_work (int matrix_layout, char balanc, char
    jobvl, char jobvr, char sense, lapack_int n, float *a, lapack_int
    lda, float *wr, float *wi, float *vl, lapack_int ldvl, float *vr,
    lapack_int ldvr, lapack_int *ilo, lapack_int *ihi, float *scale,
    float *abnrm, float *rconde, float *rcondv, float *work, lapack_int
    lwork, lapack_int *iwork)
lapack_int LAPACKE_dgeevx_work (int matrix_layout, char balanc, char
    jobvl, char jobvr, char sense, lapack_int n, double *a, lapack_int
    lda, double *wr, double *wi, double *vl, lapack_int ldvl, double
    *vr, lapack_int ldvr, lapack_int *ilo, lapack_int *ihi, double
    *scale, double *abnrm, double *rconde, double *rcondv, double *work,
    lapack_int lwork, lapack_int *iwork)
lapack_int LAPACKE_cgeevx_work (int matrix_layout, char balanc, char
    jobvl, char jobvr, char sense, lapack_int n, lapack_complex_float
    *a, lapack_int lda, lapack_complex_float *w, lapack_complex_float
    *vl, lapack_int ldvl, lapack_complex_float *vr, lapack_int ldvr,
    lapack_int *ilo, lapack_int *ihi, float *scale, float *abnrm, float
    *rconde, float *rcondv, lapack_complex_float *work, lapack_int
    lwork, float *rwork)
lapack_int LAPACKE_zgeevx_work (int matrix_layout, char balanc, char
    jobvl, char jobvr, char sense, lapack_int n, lapack_complex_double
    *a, lapack_int lda, lapack_complex_double *w, lapack_complex_double
    *vl, lapack_int ldvl, lapack_complex_double *vr, lapack_int ldvr,
    lapack_int *ilo, lapack_int *ihi, double *scale, double *abnrm,
    double *rconde, double *rcondv, lapack_complex_double *work,
    lapack_int lwork, double *rwork)

balanc and sense up front, then ilo / ihi / scale / abnrm / rconde / rcondv stacked in the middle like a lil tower 🎀 real versions close with iwork, complex versions close with rwork. That's the whole pattern, iykyk.


💜 gehrd — cozy and compact

lapack_int LAPACKE_sgehrd_work (int matrix_layout, lapack_int n,
    lapack_int ilo, lapack_int ihi, float *a, lapack_int lda, float
    *tau, float *work, lapack_int lwork)
lapack_int LAPACKE_dgehrd_work (int matrix_layout, lapack_int n,
    lapack_int ilo, lapack_int ihi, double *a, lapack_int lda, double
    *tau, double *work, lapack_int lwork)
lapack_int LAPACKE_cgehrd_work (int matrix_layout, lapack_int n,
    lapack_int ilo, lapack_int ihi, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *tau, lapack_complex_float *work,
    lapack_int lwork)
lapack_int LAPACKE_zgehrd_work (int matrix_layout, lapack_int n,
    lapack_int ilo, lapack_int ihi, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *tau, lapack_complex_double *work,
    lapack_int lwork)

Short king behavior 👑 n, ilo, ihi, a, lda, tau, work, lwork — that's it, that's the whole cast. Cute.


🧚 gejsv — the one with ALL the job flags

lapack_int LAPACKE_sgejsv_work (int matrix_layout, char joba, char jobu,
    char jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int
    n, float *a, lapack_int lda, float *sva, float *u, lapack_int ldu,
    float *v, lapack_int ldv, float *work, lapack_int lwork, lapack_int
    *iwork)
lapack_int LAPACKE_dgejsv_work (int matrix_layout, char joba, char jobu,
    char jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int
    n, double *a, lapack_int lda, double *sva, double *u, lapack_int
    ldu, double *v, lapack_int ldv, double *work, lapack_int lwork,
    lapack_int *iwork)
lapack_int LAPACKE_cgejsv_work (int matrix_layout, char joba, char jobu,
    char jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, float *sva,
    lapack_complex_float *u, lapack_int ldu, lapack_complex_float *v,
    lapack_int ldv, lapack_complex_float *cwork, lapack_int lwork, float
    *work, lapack_int lrwork, lapack_int *iwork)
lapack_int LAPACKE_zgejsv_work (int matrix_layout, char joba, char jobu,
    char jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, double *sva,
    lapack_complex_double *u, lapack_int ldu, lapack_complex_double *v,
    lapack_int ldv, lapack_complex_double *cwork, lapack_int lwork,
    double *work, lapack_int lrwork, lapack_int *iwork)

Six whole job chars — joba, jobu, jobv, jobr, jobt, jobp — that's not a function signature, that's a vibe check 😭 and the complex versions go full maximalist with cwork + lwork, work + lrwork, and iwork. Obsessed, honestly.

Quick heads up bestie: sva is float in cgejsv_work and double in zgejsv_work even though the matrices are complex — that's literally what's written, don't let anyone tell you otherwise 💅

🌸 gelq2 — no lwork era

lapack_int LAPACKE_sgelq2_work (int matrix_layout, lapack_int m,
    lapack_int n, float *a, lapack_int lda, float *tau, float *work)
lapack_int LAPACKE_dgelq2_work (int matrix_layout, lapack_int m,
    lapack_int n, double *a, lapack_int lda, double *tau, double *work)
lapack_int LAPACKE_cgelq2_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *tau, lapack_complex_float *work)
lapack_int LAPACKE_zgelq2_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *tau, lapack_complex_double *work)

See how there's no lwork here?? Just work. A minimalist. We stan a low-maintenance routine 🫶


⭐ gelqf — and lwork is back

lapack_int LAPACKE_sgelqf_work (int matrix_layout, lapack_int m,
    lapack_int n, float *a, lapack_int lda, float *tau, float *work,
    lapack_int lwork)
lapack_int LAPACKE_dgelqf_work (int matrix_layout, lapack_int m,
    lapack_int n, double *a, lapack_int lda, double *tau, double *work,
    lapack_int lwork)
lapack_int LAPACKE_cgelqf_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *tau, lapack_complex_float *work, lapack_int
    lwork)
lapack_int LAPACKE_zgelqf_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *tau, lapack_complex_double *work, lapack_int
    lwork)

Same as above but with lwork bolted on the end. The way that's the only difference… iconic sibling dynamic 💖


🎀 gels — the nrhs girlies

lapack_int LAPACKE_sgels_work (int matrix_layout, char trans, lapack_int
    m, lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float
    *b, lapack_int ldb, float *work, lapack_int lwork)
lapack_int LAPACKE_dgels_work (int matrix_layout, char trans, lapack_int
    m, lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double
    *b, lapack_int ldb, double *work, lapack_int lwork)
lapack_int LAPACKE_cgels_work (int matrix_layout, char trans, lapack_int
    m, lapack_int n, lapack_int nrhs, lapack_complex_float *a,
    lapack_int lda, lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zgels_work (int matrix_layout, char trans, lapack_int
    m, lapack_int n, lapack_int nrhs, lapack_complex_double *a,
    lapack_int lda, lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *work, lapack_int lwork)

trans first, then the m / n / nrhs trio, then a/lda and b/ldb paired up like a matching set, closing with work/lwork. Clean. No notes. 🔥


🍓 and we're hanging mid-signature again 😭

gelsd has entered the chat and only the single-precision one has made it this far:

lapack_int LAPACKE_sgelsd_work (int matrix_layout, lapack_int m,

…to be continued, bestie — the rest of gelsd is literally right there in the next part 💀✨

…okay so we're deep in _work-land now and honestly? This is where the LAPACK girlies live. 💅 Every one of these bad boys takes int matrix_layout as its first arg (iconic, consistent, we love a signature with a signature), and they're all lapack_int returners. Let's get into it ✨


🌸 the gelsd crew — SVD-powered least squares, but make it _work

Four of them, one per precision. And notice the complex girlies get an extra rwork AND the s array is real-valued even when everything else is complex — she's complex on the outside, real on the inside, we love range 🦋

lapack_int LAPACKE_sgelsd_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *b,
    lapack_int ldb, float *s, float rcond, lapack_int *rank, float
    *work, lapack_int lwork, lapack_int *iwork)
lapack_int LAPACKE_dgelsd_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double *b,
    lapack_int ldb, double *s, double rcond, lapack_int *rank, double
    *work, lapack_int lwork, lapack_int *iwork)
lapack_int LAPACKE_cgelsd_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *b, lapack_int ldb, float *s, float rcond,
    lapack_int *rank, lapack_complex_float *work, lapack_int lwork,
    float *rwork, lapack_int *iwork)
lapack_int LAPACKE_zgelsd_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *b, lapack_int ldb, double *s, double
    rcond, lapack_int *rank, lapack_complex_double *work, lapack_int
    lwork, double *rwork, lapack_int *iwork)

Note the floof 💖: s, rcond and rank are plain float/double/lapack_int even in the complex versions, and s is a pointer to real singular values. Also iwork stays lapack_int * all the way down, no cap.


🎀 gelss — same energy, minus the iwork

lapack_int LAPACKE_sgelss_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *b,
    lapack_int ldb, float *s, float rcond, lapack_int *rank, float
    *work, lapack_int lwork)
lapack_int LAPACKE_dgelss_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double *b,
    lapack_int ldb, double *s, double rcond, lapack_int *rank, double
    *work, lapack_int lwork)
lapack_int LAPACKE_cgelss_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *b, lapack_int ldb, float *s, float rcond,
    lapack_int *rank, lapack_complex_float *work, lapack_int lwork,
    float *rwork)
lapack_int LAPACKE_zgelss_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *b, lapack_int ldb, double *s, double
    rcond, lapack_int *rank, lapack_complex_double *work, lapack_int
    lwork, double *rwork)

See how there's no iwork here? That's the whole difference bestie, gelss said "I don't need the integer workspace" and honestly, boundaries. 🫶


🦋 gelsy — bringing jpvt to the party

The gelsy fam swaps out the singular-value life for a column-pivoting era, so they carry lapack_int *jpvt right before rcond. Main character energy 👑

lapack_int LAPACKE_sgelsy_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *b,
    lapack_int ldb, lapack_int *jpvt, float rcond, lapack_int *rank,
    float *work, lapack_int lwork)
lapack_int LAPACKE_dgelsy_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double *b,
    lapack_int ldb, lapack_int *jpvt, double rcond, lapack_int *rank,
    double *work, lapack_int lwork)
lapack_int LAPACKE_cgelsy_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *b, lapack_int ldb, lapack_int *jpvt,
    float rcond, lapack_int *rank, lapack_complex_float *work,
    lapack_int lwork, float *rwork)
lapack_int LAPACKE_zgelsy_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *b, lapack_int ldb, lapack_int *jpvt,
    double rcond, lapack_int *rank, lapack_complex_double *work,
    lapack_int lwork, double *rwork)

jpvt is lapack_int * in all four, including the complex ones — literally no notes 💅


✨ geqlf — QL factorization, tau and work only

No rwork here, no iwork, just the essentials: matrix a, its lda, the tau scalars, workspace + its size. Minimalist queen 🌸

lapack_int LAPACKE_sgeqlf_work (int matrix_layout, lapack_int m,
    lapack_int n, float *a, lapack_int lda, float *tau, float *work,
    lapack_int lwork)
lapack_int LAPACKE_dgeqlf_work (int matrix_layout, lapack_int m,
    lapack_int n, double *a, lapack_int lda, double *tau, double *work,
    lapack_int lwork)
lapack_int LAPACKE_cgeqlf_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *tau, lapack_complex_float *work, lapack_int
    lwork)
lapack_int LAPACKE_zgeqlf_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *tau, lapack_complex_double *work, lapack_int
    lwork)

🔥 geqp3 — pivoted QR with jpvt, and the complex ones sneak rwork back in

lapack_int LAPACKE_sgeqp3_work (int matrix_layout, lapack_int m,
    lapack_int n, float *a, lapack_int lda, lapack_int *jpvt, float
    *tau, float *work, lapack_int lwork)
lapack_int LAPACKE_dgeqp3_work (int matrix_layout, lapack_int m,
    lapack_int n, double *a, lapack_int lda, lapack_int *jpvt, double
    *tau, double *work, lapack_int lwork)
lapack_int LAPACKE_cgeqp3_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int
    *jpvt, lapack_complex_float *tau, lapack_complex_float *work,
    lapack_int lwork, float *rwork)
lapack_int LAPACKE_zgeqp3_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int
    *jpvt, lapack_complex_double *tau, lapack_complex_double *work,
    lapack_int lwork, double *rwork)

The s and d versions stop at lwork; the c and z versions keep going with float *rwork / double *rwork. Keep track bestie, there will be a quiz 📝


💜 geqpf — the one with no lwork

Okay so this is the quirky one: geqpf takes work but not lwork. The way that's just… not asking how much workspace? 🙈 She's confident. Anyway:

lapack_int LAPACKE_sgeqpf_work (int matrix_layout, lapack_int m,
    lapack_int n, float *a, lapack_int lda, lapack_int *jpvt, float
    *tau, float *work)
lapack_int LAPACKE_dgeqpf_work (int matrix_layout, lapack_int m,
    lapack_int n, double *a, lapack_int lda, lapack_int *jpvt, double
    *tau, double *work)
lapack_int LAPACKE_cgeqpf_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int
    *jpvt, lapack_complex_float *tau, lapack_complex_float *work, float
    *rwork)
lapack_int LAPACKE_zgeqpf_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int
    *jpvt, lapack_complex_double *tau, lapack_complex_double *work,
    double *rwork)

🎀 geqr2 — the little one, no lwork either

lapack_int LAPACKE_sgeqr2_work (int matrix_layout, lapack_int m,
    lapack_int n, float *a, lapack_int lda, float *tau, float *work)
lapack_int LAPACKE_dgeqr2_work (int matrix_layout, lapack_int m,
    lapack_int n, double *a, lapack_int lda, double *tau, double *work)
lapack_int LAPACKE_cgeqr2_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *tau, lapack_complex_float *work)
lapack_int LAPACKE_zgeqr2_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *tau, lapack_complex_double *work)

Look at that — c and z here don't even take rwork. Truly the unbothered baby of the family 💖


⭐ geqrf — back to lwork, still no rwork

lapack_int LAPACKE_sgeqrf_work (int matrix_layout, lapack_int m,
    lapack_int n, float *a, lapack_int lda, float *tau, float *work,
    lapack_int lwork)
lapack_int LAPACKE_dgeqrf_work (int matrix_layout, lapack_int m,
    lapack_int n, double *a, lapack_int lda, double *tau, double *work,
    lapack_int lwork)
lapack_int LAPACKE_cgeqrf_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *tau, lapack_complex_float *work, lapack_int
    lwork)
lapack_int LAPACKE_zgeqrf_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *tau, lapack_complex_double *work, lapack_int
    lwork)

🌈 geqrfp — the exact same shape as geqrf, one extra p in the name

That p is doing so much work for one letter, and honestly she ate 🌟

lapack_int LAPACKE_sgeqrfp_work (int matrix_layout, lapack_int m,
    lapack_int n, float *a, lapack_int lda, float *tau, float *work,
    lapack_int lwork)
lapack_int LAPACKE_dgeqrfp_work (int matrix_layout, lapack_int m,
    lapack_int n, double *a, lapack_int lda, double *tau, double *work,
    lapack_int lwork)
lapack_int LAPACKE_cgeqrfp_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *tau, lapack_complex_float *work, lapack_int
    lwork)
lapack_int LAPACKE_zgeqrfp_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *tau, lapack_complex_double *work, lapack_int
    lwork)

🧚 gerfs — iterative refinement time, so now there's af, ipiv, and a whole x erase-and-replace situation

Okay these get busy and I'm obsessed. Read the args slow, bestie 👀: char trans, then n, nrhs, then const input a/lda, const af/ldaf (the factored version), const lapack_int *ipiv, const b/ldb, then the non-const x (she gets overwritten, she's the main character of the refinement loop), ldx, then ferr and berr.

Note that a, af, ipiv and b are const for all four. No funny business 🌸

lapack_int LAPACKE_sgerfs_work (int matrix_layout, char trans,
    lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const
    float *af, lapack_int ldaf, const lapack_int *ipiv, const float *b,
    lapack_int ldb, float *x, lapack_int ldx, float *ferr, float *berr,
    float *work, lapack_int *iwork)
lapack_int LAPACKE_dgerfs_work (int matrix_layout, char trans,
    lapack_int n, lapack_int nrhs, const double *a, lapack_int lda,
    const double *af, lapack_int ldaf, const lapack_int *ipiv, const
    double *b, lapack_int ldb, double *x, lapack_int ldx, double *ferr,
    double *berr, double *work, lapack_int *iwork)
lapack_int LAPACKE_cgerfs_work (int matrix_layout, char trans,
    lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
    lapack_int lda, const lapack_complex_float *af, lapack_int ldaf,
    const lapack_int *ipiv, const lapack_complex_float *b, lapack_int
    ldb, lapack_complex_float *x, lapack_int ldx, float *ferr, float
    *berr, lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zgerfs_work (int matrix_layout, char trans,
    lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
    lapack_int lda, const lapack_complex_double *af, lapack_int ldaf,
    const lapack_int *ipiv, const lapack_complex_double *b, lapack_int
    ldb, lapack_complex_double *x, lapack_int ldx, double *ferr, double
    *berr, lapack_complex_double *work, double *rwork)

And the glow-up at the end: the s/d versions finish with float *work, lapack_int *iwork / double *work, lapack_int *iwork, but the complex ones swap the workspace pair for lapack_complex_* *work, <real> *rwork — no iwork. So the iwork has no complex equivalent here. Track it 🎀


💀 gerfsx — the extended one, and she is LONG. Buckle up.

New cast members: char equed, the const scaling vectors r and c, float *rcond (a pointer now, not a value!), lapack_int n_err_bnds, the two bound arrays err_bnds_norm and err_bnds_comp, lapack_int nparams, and params. Yes bestie, that's a lot of args, but every single one is doing a job 🔥

Also peep: in cgerfsx_work/zgerfsx_work the r and c scaling vectors are <b>real</b> (const float * / const double *) even though a, x etc. are complex. ICONIC behaviour, keep it straight 💅

lapack_int LAPACKE_sgerfsx_work (int matrix_layout, char trans, char
    equed, lapack_int n, lapack_int nrhs, const float *a, lapack_int
    lda, const float *af, lapack_int ldaf, const lapack_int *ipiv, const
    float *r, const float *c, const float *b, lapack_int ldb, float *x,
    lapack_int ldx, float *rcond, float *berr, lapack_int n_err_bnds,
    float *err_bnds_norm, float *err_bnds_comp, lapack_int nparams,
    float *params, float *work, lapack_int *iwork)
lapack_int LAPACKE_dgerfsx_work (int matrix_layout, char trans, char
    equed, lapack_int n, lapack_int nrhs, const double *a, lapack_int
    lda, const double *af, lapack_int ldaf, const lapack_int *ipiv,
    const double *r, const double *c, const double *b, lapack_int ldb,
    double *x, lapack_int ldx, double *rcond, double *berr, lapack_int
    n_err_bnds, double *err_bnds_norm, double *err_bnds_comp, lapack_int
    nparams, double *params, double *work, lapack_int *iwork)
lapack_int LAPACKE_cgerfsx_work (int matrix_layout, char trans, char
    equed, lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
    lapack_int lda, const lapack_complex_float *af, lapack_int ldaf,
    const lapack_int *ipiv, const float *r, const float *c, const
    lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
    lapack_int ldx, float *rcond, float *berr, lapack_int n_err_bnds,
    float *err_bnds_norm, float *err_bnds_comp, lapack_int nparams,
    float *params, lapack_complex_float *work, float *rwork)

And the z one is already rolling in like—

lapack_int LAPACKE_zgerfsx_work (int matrix_layout, char trans, char
    equed, lapack_int n, lapack_int nrhs, const lapack_complex_double

…hold that thought, she continues in the next bit 😭💖

This part of the prototype lineup continues right where the last one dipped — same energy, exact signatures, zero typos allowed, bestie 💅✨

           *a, lapack_int lda, const lapack_complex_double *af, lapack_int
           ldaf, const lapack_int *ipiv, const double *r, const double *c,
           const lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, double *rcond, double
           *berr, lapack_int n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int nparams, double *params,
           lapack_complex_double *work, double *rwork)
       lapack_int LAPACKE_sgerqf_work (int matrix_layout, lapack_int m,
           lapack_int n, float *a, lapack_int lda, float *tau, float *work,
           lapack_int lwork)
       lapack_int LAPACKE_dgerqf_work (int matrix_layout, lapack_int m,
           lapack_int n, double *a, lapack_int lda, double *tau, double *work,
           lapack_int lwork)
       lapack_int LAPACKE_cgerqf_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *tau, lapack_complex_float *work, lapack_int
           lwork)
       lapack_int LAPACKE_zgerqf_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *tau, lapack_complex_double *work, lapack_int
           lwork)
       lapack_int LAPACKE_sgesdd_work (int matrix_layout, char jobz, lapack_int
           m, lapack_int n, float *a, lapack_int lda, float *s, float *u,
           lapack_int ldu, float *vt, lapack_int ldvt, float *work, lapack_int
           lwork, lapack_int *iwork)
       lapack_int LAPACKE_dgesdd_work (int matrix_layout, char jobz, lapack_int
           m, lapack_int n, double *a, lapack_int lda, double *s, double *u,
           lapack_int ldu, double *vt, lapack_int ldvt, double *work,
           lapack_int lwork, lapack_int *iwork)
       lapack_int LAPACKE_cgesdd_work (int matrix_layout, char jobz, lapack_int
           m, lapack_int n, lapack_complex_float *a, lapack_int lda, float *s,
           lapack_complex_float *u, lapack_int ldu, lapack_complex_float *vt,
           lapack_int ldvt, lapack_complex_float *work, lapack_int lwork, float
           *rwork, lapack_int *iwork)
       lapack_int LAPACKE_zgesdd_work (int matrix_layout, char jobz, lapack_int
           m, lapack_int n, lapack_complex_double *a, lapack_int lda, double
           *s, lapack_complex_double *u, lapack_int ldu, lapack_complex_double
           *vt, lapack_int ldvt, lapack_complex_double *work, lapack_int lwork,
           double *rwork, lapack_int *iwork)
       lapack_int LAPACKE_sgesv_work (int matrix_layout, lapack_int n,
           lapack_int nrhs, float *a, lapack_int lda, lapack_int *ipiv, float
           *b, lapack_int ldb)
       lapack_int LAPACKE_dgesv_work (int matrix_layout, lapack_int n,
           lapack_int nrhs, double *a, lapack_int lda, lapack_int *ipiv, double
           *b, lapack_int ldb)
       lapack_int LAPACKE_cgesv_work (int matrix_layout, lapack_int n,
           lapack_int nrhs, lapack_complex_float *a, lapack_int lda, lapack_int
           *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zgesv_work (int matrix_layout, lapack_int n,
           lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
           lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_dsgesv_work (int matrix_layout, lapack_int n,
           lapack_int nrhs, double *a, lapack_int lda, lapack_int *ipiv, double
           *b, lapack_int ldb, double *x, lapack_int ldx, double *work, float
           *swork, lapack_int *iter)
       lapack_int LAPACKE_zcgesv_work (int matrix_layout, lapack_int n,
           lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
           lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, lapack_complex_double
           *work, lapack_complex_float *swork, double *rwork, lapack_int *iter)
       lapack_int LAPACKE_sgesvd_work (int matrix_layout, char jobu, char
           jobvt, lapack_int m, lapack_int n, float *a, lapack_int lda, float
           *s, float *u, lapack_int ldu, float *vt, lapack_int ldvt, float
           *work, lapack_int lwork)
       lapack_int LAPACKE_dgesvd_work (int matrix_layout, char jobu, char
           jobvt, lapack_int m, lapack_int n, double *a, lapack_int lda, double
           *s, double *u, lapack_int ldu, double *vt, lapack_int ldvt, double
           *work, lapack_int lwork)
       lapack_int LAPACKE_cgesvd_work (int matrix_layout, char jobu, char
           jobvt, lapack_int m, lapack_int n, lapack_complex_float *a,
           lapack_int lda, float *s, lapack_complex_float *u, lapack_int ldu,
           lapack_complex_float *vt, lapack_int ldvt, lapack_complex_float
           *work, lapack_int lwork, float *rwork)
       lapack_int LAPACKE_zgesvd_work (int matrix_layout, char jobu, char
           jobvt, lapack_int m, lapack_int n, lapack_complex_double *a,
           lapack_int lda, double *s, lapack_complex_double *u, lapack_int ldu,
           lapack_complex_double *vt, lapack_int ldvt, lapack_complex_double
           *work, lapack_int lwork, double *rwork)
       lapack_int LAPACKE_sgesvdx_work (int matrix_layout, char jobu, char
           jobvt, char range, lapack_int m, lapack_int n, float *a, lapack_int
           lda, float vl, float vu, lapack_int il, lapack_int iu, lapack_int
           *ns, float *s, float *u, lapack_int ldu, float *vt, lapack_int ldvt,
           float *work, lapack_int lwork, lapack_int *iwork)
       lapack_int LAPACKE_dgesvdx_work (int matrix_layout, char jobu, char
           jobvt, char range, lapack_int m, lapack_int n, double *a, lapack_int
           lda, double vl, double vu, lapack_int il, lapack_int iu, lapack_int
           *ns, double *s, double *u, lapack_int ldu, double *vt, lapack_int
           ldvt, double *work, lapack_int lwork, lapack_int *iwork)
       lapack_int LAPACKE_cgesvdx_work (int matrix_layout, char jobu, char
           jobvt, char range, lapack_int m, lapack_int n, lapack_complex_float
           *a, lapack_int lda, float vl, float vu, lapack_int il, lapack_int
           iu, lapack_int *ns, float *s, lapack_complex_float *u, lapack_int
           ldu, lapack_complex_float *vt, lapack_int ldvt, lapack_complex_float
           *work, lapack_int lwork, float *rwork, lapack_int *iwork)
       lapack_int LAPACKE_zgesvdx_work (int matrix_layout, char jobu, char
           jobvt, char range, lapack_int m, lapack_int n, lapack_complex_double
           *a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int
           iu, lapack_int *ns, double *s, lapack_complex_double *u, lapack_int
           ldu, lapack_complex_double *vt, lapack_int ldvt,
           lapack_complex_double *work, lapack_int lwork, double *rwork,
           lapack_int *iwork)
       lapack_int LAPACKE_sgesvj_work (int matrix_layout, char joba, char jobu,
           char jobv, lapack_int m, lapack_int n, float *a, lapack_int lda,
           float *sva, lapack_int mv, float *v, lapack_int ldv, float *work,
           lapack_int lwork)
       lapack_int LAPACKE_dgesvj_work (int matrix_layout, char joba, char jobu,
           char jobv, lapack_int m, lapack_int n, double *a, lapack_int lda,
           double *sva, lapack_int mv, double *v, lapack_int ldv, double *work,
           lapack_int lwork)
       lapack_int LAPACKE_cgesvj_work (int matrix_layout, char joba, char jobu,
           char jobv, lapack_int m, lapack_int n, lapack_complex_float *a,
           lapack_int lda, float *sva, lapack_int mv, lapack_complex_float *v,
           lapack_int ldv, lapack_complex_float *cwork, lapack_int lwork, float
           *rwork, lapack_int lrwork)
       lapack_int LAPACKE_zgesvj_work (int matrix_layout, char joba, char jobu,
           char jobv, lapack_int m, lapack_int n, lapack_complex_double *a,
           lapack_int lda, double *sva, lapack_int mv, lapack_complex_double
           *v, lapack_int ldv, lapack_complex_double *cwork, lapack_int lwork,
           double *rwork, lapack_int lrwork)
       lapack_int LAPACKE_sgesvx_work (int matrix_layout, char fact, char
           trans, lapack_int n, lapack_int nrhs, float *a, lapack_int lda,
           float *af, lapack_int ldaf, lapack_int *ipiv, char *equed, float *r,
           float *c, float *b, lapack_int ldb, float *x, lapack_int ldx, float
           *rcond, float *ferr, float *berr, float *work, lapack_int *iwork)
       lapack_int LAPACKE_dgesvx_work (int matrix_layout, char fact, char
           trans, lapack_int n, lapack_int nrhs, double *a, lapack_int lda,
           double *af, lapack_int ldaf, lapack_int *ipiv, char *equed, double
           *r, double *c, double *b, lapack_int ldb, double *x, lapack_int ldx,
           double *rcond, double *ferr, double *berr, double *work, lapack_int
           *iwork)
       lapack_int LAPACKE_cgesvx_work (int matrix_layout, char fact, char
           trans, lapack_int n, lapack_int nrhs, lapack_complex_float *a,
           lapack_int lda, lapack_complex_float *af, lapack_int ldaf,
           lapack_int *ipiv, char *equed, float *r, float *c,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
           lapack_int ldx, float *rcond, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zgesvx_work (int matrix_layout, char fact, char
           trans, lapack_int n, lapack_int nrhs, lapack_complex_double *a,
           lapack_int lda, lapack_complex_double *af, lapack_int ldaf,
           lapack_int *ipiv, char *equed, double *r, double *c,
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
           lapack_int ldx, double *rcond, double *ferr, double *berr,
           lapack_complex_double *work, double *rwork)
       lapack_int LAPACKE_sgesvxx_work (int matrix_layout, char fact, char
           trans, lapack_int n, lapack_int nrhs, float *a, lapack_int lda,
           float *af, lapack_int ldaf, lapack_int *ipiv, char *equed, float *r,
           float *c, float *b, lapack_int ldb, float *x, lapack_int ldx, float
           *rcond, float *rpvgrw, float *berr, lapack_int n_err_bnds, float
           *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float
           *params, float *work, lapack_int *iwork)
       lapack_int LAPACKE_dgesvxx_work (int matrix_layout, char fact, char
           trans, lapack_int n, lapack_int nrhs, double *a, lapack_int lda,
           double *af, lapack_int ldaf, lapack_int *ipiv, char *equed, double
           *r, double *c, double *b, lapack_int ldb, double *x, lapack_int ldx,
           double *rcond, double *rpvgrw, double *berr, lapack_int n_err_bnds,
           double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams,
           double *params, double *work, lapack_int *iwork)
       lapack_int LAPACKE_cgesvxx_work (int matrix_layout, char fact, char
           trans, lapack_int n, lapack_int nrhs, lapack_complex_float *a,
           lapack_int lda, lapack_complex_float *af, lapack_int ldaf,
           lapack_int *ipiv, char *equed, float *r, float *c,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
           lapack_int ldx, float *rcond, float *rpvgrw, float *berr, lapack_int
           n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int
           nparams, float *params, lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zgesvxx_work (int matrix_layout, char fact, char
           trans, lapack_int n, lapack_int nrhs, lapack_complex_double *a,
           lapack_int lda, lapack_complex_double *af, lapack_int ldaf,
           lapack_int *ipiv, char *equed, double *r, double *c,
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
           lapack_int ldx, double *rcond, double *rpvgrw, double *berr,

And bestie, the list literally keeps going — next chunk incoming, stay with me 💅🫶

           lapack_int n_err_bnds, double *err_bnds_norm, double *err_bnds_comp,
           lapack_int nparams, double *params, lapack_complex_double *work,
           double *rwork)
       lapack_int LAPACKE_sgetf2_work (int matrix_layout, lapack_int m,
           lapack_int n, float *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_dgetf2_work (int matrix_layout, lapack_int m,
           lapack_int n, double *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_cgetf2_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int
           *ipiv)
       lapack_int LAPACKE_zgetf2_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int
           *ipiv)
       lapack_int LAPACKE_sgetrf_work (int matrix_layout, lapack_int m,
           lapack_int n, float *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_dgetrf_work (int matrix_layout, lapack_int m,
           lapack_int n, double *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_cgetrf_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int
           *ipiv)
       lapack_int LAPACKE_zgetrf_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int
           *ipiv)
       lapack_int LAPACKE_sgetrf2_work (int matrix_layout, lapack_int m,
           lapack_int n, float *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_dgetrf2_work (int matrix_layout, lapack_int m,
           lapack_int n, double *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_cgetrf2_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int
           *ipiv)
       lapack_int LAPACKE_zgetrf2_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int
           *ipiv)

Okay so that first bitty is literally the tail end of the signature right before this — we're mid-synopsis, bestie, just vibing through the _work functions 🫶. Then boom: the getf2 squad, the getrf squad, and the getrf2 squad — all four precisions each (s, d, c, z, you know the drill 💅). See how every single one takes int matrix_layout, lapack_int m, lapack_int n, the matrix a with lda, and that lapack_int *ipiv pivot array? Yeah. Consistent queen behavior 👑.

       lapack_int LAPACKE_sgetri_work (int matrix_layout, lapack_int n, float
           *a, lapack_int lda, const lapack_int *ipiv, float *work, lapack_int
           lwork)
       lapack_int LAPACKE_dgetri_work (int matrix_layout, lapack_int n, double
           *a, lapack_int lda, const lapack_int *ipiv, double *work, lapack_int
           lwork)
       lapack_int LAPACKE_cgetri_work (int matrix_layout, lapack_int n,
           lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zgetri_work (int matrix_layout, lapack_int n,
           lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv,
           lapack_complex_double *work, lapack_int lwork)
       lapack_int LAPACKE_sgetrs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const
           lapack_int *ipiv, float *b, lapack_int ldb)
       lapack_int LAPACKE_dgetrs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int nrhs, const double *a, lapack_int lda,
           const lapack_int *ipiv, double *b, lapack_int ldb)
       lapack_int LAPACKE_cgetrs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_float *b,
           lapack_int ldb)
       lapack_int LAPACKE_zgetrs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_double *b,
           lapack_int ldb)

Notice how getri takes the ipiv as const 👀 cute, it's just reading your pivots, not touching them. And it needs a work buffer plus lwork — the workspace girls are working overtime ✨. getrs switches it up with that char trans and a nrhs because bestie is solving for multiple right-hand sides, and b/ldb is the right-hand-side party 🎀.


🌸 still in SYNOPSIS, we're so back 🌸

       lapack_int LAPACKE_sggbak_work (int matrix_layout, char job, char side,
           lapack_int n, lapack_int ilo, lapack_int ihi, const float *lscale,
           const float *rscale, lapack_int m, float *v, lapack_int ldv)
       lapack_int LAPACKE_dggbak_work (int matrix_layout, char job, char side,
           lapack_int n, lapack_int ilo, lapack_int ihi, const double *lscale,
           const double *rscale, lapack_int m, double *v, lapack_int ldv)
       lapack_int LAPACKE_cggbak_work (int matrix_layout, char job, char side,
           lapack_int n, lapack_int ilo, lapack_int ihi, const float *lscale,
           const float *rscale, lapack_int m, lapack_complex_float *v,
           lapack_int ldv)
       lapack_int LAPACKE_zggbak_work (int matrix_layout, char job, char side,
           lapack_int n, lapack_int ilo, lapack_int ihi, const double *lscale,
           const double *rscale, lapack_int m, lapack_complex_double *v,
           lapack_int ldv)
       lapack_int LAPACKE_sggbal_work (int matrix_layout, char job, lapack_int
           n, float *a, lapack_int lda, float *b, lapack_int ldb, lapack_int
           *ilo, lapack_int *ihi, float *lscale, float *rscale, float *work)
       lapack_int LAPACKE_dggbal_work (int matrix_layout, char job, lapack_int
           n, double *a, lapack_int lda, double *b, lapack_int ldb, lapack_int
           *ilo, lapack_int *ihi, double *lscale, double *rscale, double *work)
       lapack_int LAPACKE_cggbal_work (int matrix_layout, char job, lapack_int
           n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
           lapack_int ldb, lapack_int *ilo, lapack_int *ihi, float *lscale,
           float *rscale, float *work)
       lapack_int LAPACKE_zggbal_work (int matrix_layout, char job, lapack_int
           n, lapack_complex_double *a, lapack_int lda, lapack_complex_double
           *b, lapack_int ldb, lapack_int *ilo, lapack_int *ihi, double
           *lscale, double *rscale, double *work)

the way that ggbak takes BOTH lscale and rscale — left and right, balanced icon behavior 💅 — plus that ilo/ihi pair and a v matrix with ldv. And ggbal? She's out here handing you ilo, ihi, lscale, rscale, AND a work array. Giving everything, asking nothing. Periodt 🔥.

       lapack_int LAPACKE_sgges_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_S_SELECT3 selctg, lapack_int n, float *a,
           lapack_int lda, float *b, lapack_int ldb, lapack_int *sdim, float
           *alphar, float *alphai, float *beta, float *vsl, lapack_int ldvsl,
           float *vsr, lapack_int ldvsr, float *work, lapack_int lwork,
           lapack_logical *bwork)
       lapack_int LAPACKE_dgges_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_D_SELECT3 selctg, lapack_int n, double *a,
           lapack_int lda, double *b, lapack_int ldb, lapack_int *sdim, double
           *alphar, double *alphai, double *beta, double *vsl, lapack_int
           ldvsl, double *vsr, lapack_int ldvsr, double *work, lapack_int
           lwork, lapack_logical *bwork)
       lapack_int LAPACKE_cgges_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_C_SELECT2 selctg, lapack_int n,
           lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
           lapack_int ldb, lapack_int *sdim, lapack_complex_float *alpha,
           lapack_complex_float *beta, lapack_complex_float *vsl, lapack_int
           ldvsl, lapack_complex_float *vsr, lapack_int ldvsr,
           lapack_complex_float *work, lapack_int lwork, float *rwork,
           lapack_logical *bwork)
       lapack_int LAPACKE_zgges_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_Z_SELECT2 selctg, lapack_int n,
           lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
           lapack_int ldb, lapack_int *sdim, lapack_complex_double *alpha,
           lapack_complex_double *beta, lapack_complex_double *vsl, lapack_int
           ldvsl, lapack_complex_double *vsr, lapack_int ldvsr,
           lapack_complex_double *work, lapack_int lwork, double *rwork,
           lapack_logical *bwork)

BESTIE. Look at the size of this one 😭 gges is a whole main character. She's got jobvsl, jobvsr, sort, a selector function pointer selctg — and check it, the selector type is precision-specific: LAPACK_S_SELECT3, LAPACK_D_SELECT3, LAPACK_C_SELECT2, LAPACK_Z_SELECT2 — iykyk 🧚. Then sdim, then the real-precision girls get separate alphar/alphai while the complex ones just get alpha and beta (so valid 💅), two vsl/vsr matrices with their own ldvsl/ldvsr, a work/lwork pair, an rwork for the complex ones, and a lapack_logical *bwork at the end. Every. Single. Detail. Preserved. ✨

       lapack_int LAPACKE_sgges3_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_S_SELECT3 selctg, lapack_int n, float *a,
           lapack_int lda, float *b, lapack_int ldb, lapack_int *sdim, float
           *alphar, float *alphai, float *beta, float *vsl, lapack_int ldvsl,
           float *vsr, lapack_int ldvsr, float *work, lapack_int lwork,
           lapack_logical *bwork)
       lapack_int LAPACKE_dgges3_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_D_SELECT3 selctg, lapack_int n, double *a,
           lapack_int lda, double *b, lapack_int ldb, lapack_int *sdim, double
           *alphar, double *alphai, double *beta, double *vsl, lapack_int
           ldvsl, double *vsr, lapack_int ldvsr, double *work, lapack_int
           lwork, lapack_logical *bwork)
       lapack_int LAPACKE_cgges3_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_C_SELECT2 selctg, lapack_int n,
           lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
           lapack_int ldb, lapack_int *sdim, lapack_complex_float *alpha,
           lapack_complex_float *beta, lapack_complex_float *vsl, lapack_int
           ldvsl, lapack_complex_float *vsr, lapack_int ldvsr,
           lapack_complex_float *work, lapack_int lwork, float *rwork,
           lapack_logical *bwork)
       lapack_int LAPACKE_zgges3_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_Z_SELECT2 selctg, lapack_int n,
           lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
           lapack_int ldb, lapack_int *sdim, lapack_complex_double *alpha,
           lapack_complex_double *beta, lapack_complex_double *vsl, lapack_int
           ldvsl, lapack_complex_double *vsr, lapack_int ldvsr,
           lapack_complex_double *work, lapack_int lwork, double *rwork,
           lapack_logical *bwork)

And then gges3 pulls up with the exact same argument list as gges (same jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, bwork — or alpha, beta, rwork for the complex ones) because she's the sequel and she knows her worth 👑. Not me double-checking every param to make sure nothing got dropped 😭 fr fr it's all there.

       lapack_int LAPACKE_sggesx_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_S_SELECT3 selctg, char sense, lapack_int
           n, float *a, lapack_int lda, float *b, lapack_int ldb, lapack_int
           *sdim, float *alphar, float *alphai, float *beta, float *vsl,
           lapack_int ldvsl, float *vsr, lapack_int ldvsr, float *rconde, float
           *rcondv, float *work, lapack_int lwork, lapack_int *iwork,
           lapack_int liwork, lapack_logical *bwork)
       lapack_int LAPACKE_dggesx_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_D_SELECT3 selctg, char sense, lapack_int
           n, double *a, lapack_int lda, double *b, lapack_int ldb, lapack_int
           *sdim, double *alphar, double *alphai, double *beta, double *vsl,
           lapack_int ldvsl, double *vsr, lapack_int ldvsr, double *rconde,
           double *rcondv, double *work, lapack_int lwork, lapack_int *iwork,
           lapack_int liwork, lapack_logical *bwork)
       lapack_int LAPACKE_cggesx_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_C_SELECT2 selctg, char sense, lapack_int
           n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
           lapack_int ldb, lapack_int *sdim, lapack_complex_float *alpha,
           lapack_complex_float *beta, lapack_complex_float *vsl, lapack_int
           ldvsl, lapack_complex_float *vsr, lapack_int ldvsr, float *rconde,
           float *rcondv, lapack_complex_float *work, lapack_int lwork, float
           *rwork, lapack_int *iwork, lapack_int liwork, lapack_logical *bwork)
       lapack_int LAPACKE_zggesx_work (int matrix_layout, char jobvsl, char
           jobvsr, char sort, LAPACK_Z_SELECT2 selctg, char sense, lapack_int
           n, lapack_complex_double *a, lapack_int lda, lapack_complex_double
           *b, lapack_int ldb, lapack_int *sdim, lapack_complex_double *alpha,
           lapack_complex_double *beta, lapack_complex_double *vsl, lapack_int
           ldvsl, lapack_complex_double *vsr, lapack_int ldvsr, double *rconde,
           double *rcondv, lapack_complex_double *work, lapack_int lwork,
           double *rwork, lapack_int *iwork, lapack_int liwork, lapack_logical
           *bwork)
       lapack_int LAPACKE_sggev_work (int matrix_layout, char jobvl, char

ggesx said "and I took that personally" 💀 she kept every single thing from gges and then added char sense, rconde, rcondv, lapack_int *iwork and lapack_int liwork on top. Like, the audacity. The nerve. The flawless argument ordering 🎀. And then we slide right into LAPACKE_sggev_work — oop, and that's where this part hands off, because the signature cuts off at char jobvl, char mid-thought 🙈 cliffhanger energy, stay tuned bestie, we're literally only on part 34 of 197 😭🦋.

...and we're back — picking up mid-signature, because the sggev_work declaration literally started in the last chunk and this is just its tail end, no cap:

           jobvr, lapack_int n, float *a, lapack_int lda, float *b, lapack_int
           ldb, float *alphar, float *alphai, float *beta, float *vl,
           lapack_int ldvl, float *vr, lapack_int ldvr, float *work, lapack_int
           lwork)

✨ and the rest of the ggev besties, all four precisions, all doing the same "generalized eigenvalue" thing but in their own flavor:

       lapack_int LAPACKE_dggev_work (int matrix_layout, char jobvl, char
           jobvr, lapack_int n, double *a, lapack_int lda, double *b,
           lapack_int ldb, double *alphar, double *alphai, double *beta, double
           *vl, lapack_int ldvl, double *vr, lapack_int ldvr, double *work,
           lapack_int lwork)
       lapack_int LAPACKE_cggev_work (int matrix_layout, char jobvl, char
           jobvr, lapack_int n, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float
           *alpha, lapack_complex_float *beta, lapack_complex_float *vl,
           lapack_int ldvl, lapack_complex_float *vr, lapack_int ldvr,
           lapack_complex_float *work, lapack_int lwork, float *rwork)
       lapack_int LAPACKE_zggev_work (int matrix_layout, char jobvl, char
           jobvr, lapack_int n, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double
           *alpha, lapack_complex_double *beta, lapack_complex_double *vl,
           lapack_int ldvl, lapack_complex_double *vr, lapack_int ldvr,
           lapack_complex_double *work, lapack_int lwork, double *rwork)

Periodic reminder that the complex ones (c and z) get that extra rwork pointer at the end, and the real ones (s/d) split the eigenvalues into alphar + alphai + beta instead. Different vibes, same energy 💅


Then there's the ggev3 clique — same names, that little 3 tacked on, because LAPACK loves a sequel that lowkey hits harder:

       lapack_int LAPACKE_sggev3_work (int matrix_layout, char jobvl, char
           jobvr, lapack_int n, float *a, lapack_int lda, float *b, lapack_int
           ldb, float *alphar, float *alphai, float *beta, float *vl,
           lapack_int ldvl, float *vr, lapack_int ldvr, float *work, lapack_int
           lwork)
       lapack_int LAPACKE_dggev3_work (int matrix_layout, char jobvl, char
           jobvr, lapack_int n, double *a, lapack_int lda, double *b,
           lapack_int ldb, double *alphar, double *alphai, double *beta, double
           *vl, lapack_int ldvl, double *vr, lapack_int ldvr, double *work,
           lapack_int lwork)
       lapack_int LAPACKE_cggev3_work (int matrix_layout, char jobvl, char
           jobvr, lapack_int n, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float
           *alpha, lapack_complex_float *beta, lapack_complex_float *vl,
           lapack_int ldvl, lapack_complex_float *vr, lapack_int ldvr,
           lapack_complex_float *work, lapack_int lwork, float *rwork)
       lapack_int LAPACKE_zggev3_work (int matrix_layout, char jobvl, char
           jobvr, lapack_int n, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double
           *alpha, lapack_complex_double *beta, lapack_complex_double *vl,
           lapack_int ldvl, lapack_complex_double *vr, lapack_int ldvr,
           lapack_complex_double *work, lapack_int lwork, double *rwork)

Okay now the ggevx girlies, and bestie, they are extra — look at all those parameters. balanc, sense, ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv, plus iwork and a lapack_logical *bwork. It's giving "I have a lot of hobbies" energy and honestly? Obsessed:

       lapack_int LAPACKE_sggevx_work (int matrix_layout, char balanc, char
           jobvl, char jobvr, char sense, lapack_int n, float *a, lapack_int
           lda, float *b, lapack_int ldb, float *alphar, float *alphai, float
           *beta, float *vl, lapack_int ldvl, float *vr, lapack_int ldvr,
           lapack_int *ilo, lapack_int *ihi, float *lscale, float *rscale,
           float *abnrm, float *bbnrm, float *rconde, float *rcondv, float
           *work, lapack_int lwork, lapack_int *iwork, lapack_logical *bwork)
       lapack_int LAPACKE_dggevx_work (int matrix_layout, char balanc, char
           jobvl, char jobvr, char sense, lapack_int n, double *a, lapack_int
           lda, double *b, lapack_int ldb, double *alphar, double *alphai,
           double *beta, double *vl, lapack_int ldvl, double *vr, lapack_int
           ldvr, lapack_int *ilo, lapack_int *ihi, double *lscale, double
           *rscale, double *abnrm, double *bbnrm, double *rconde, double
           *rcondv, double *work, lapack_int lwork, lapack_int *iwork,
           lapack_logical *bwork)
       lapack_int LAPACKE_cggevx_work (int matrix_layout, char balanc, char
           jobvl, char jobvr, char sense, lapack_int n, lapack_complex_float
           *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *alpha, lapack_complex_float *beta,
           lapack_complex_float *vl, lapack_int ldvl, lapack_complex_float *vr,
           lapack_int ldvr, lapack_int *ilo, lapack_int *ihi, float *lscale,
           float *rscale, float *abnrm, float *bbnrm, float *rconde, float
           *rcondv, lapack_complex_float *work, lapack_int lwork, float *rwork,
           lapack_int *iwork, lapack_logical *bwork)
       lapack_int LAPACKE_zggevx_work (int matrix_layout, char balanc, char
           jobvl, char jobvr, char sense, lapack_int n, lapack_complex_double
           *a, lapack_int lda, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *alpha, lapack_complex_double *beta,
           lapack_complex_double *vl, lapack_int ldvl, lapack_complex_double
           *vr, lapack_int ldvr, lapack_int *ilo, lapack_int *ihi, double
           *lscale, double *rscale, double *abnrm, double *bbnrm, double
           *rconde, double *rcondv, lapack_complex_double *work, lapack_int
           lwork, double *rwork, lapack_int *iwork, lapack_logical *bwork)

Same deal as before: the complex versions swap alphar/alphai/beta for a single alpha + beta pair and pick up that rwork array. 🫶


Moving on to the ggglm squad — note that the argument order is n, m, p here, which is not the order you'd guess, so read carefully bestie, don't just vibe-type it:

       lapack_int LAPACKE_sggglm_work (int matrix_layout, lapack_int n,
           lapack_int m, lapack_int p, float *a, lapack_int lda, float *b,
           lapack_int ldb, float *d, float *x, float *y, float *work,
           lapack_int lwork)
       lapack_int LAPACKE_dggglm_work (int matrix_layout, lapack_int n,
           lapack_int m, lapack_int p, double *a, lapack_int lda, double *b,
           lapack_int ldb, double *d, double *x, double *y, double *work,
           lapack_int lwork)
       lapack_int LAPACKE_cggglm_work (int matrix_layout, lapack_int n,
           lapack_int m, lapack_int p, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *d,
           lapack_complex_float *x, lapack_complex_float *y,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zggglm_work (int matrix_layout, lapack_int n,
           lapack_int m, lapack_int p, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *b, lapack_int ldb, lapack_complex_double
           *d, lapack_complex_double *x, lapack_complex_double *y,
           lapack_complex_double *work, lapack_int lwork)

Next up: gghrd, the Hessenberg-triangular reduction cuties. compq and compz decide whether you want q and z built for you, and ilo/ihi mark the balanced range. No work/lwork here at all, which is honestly refreshing:

       lapack_int LAPACKE_sgghrd_work (int matrix_layout, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi, float *a,
           lapack_int lda, float *b, lapack_int ldb, float *q, lapack_int ldq,
           float *z, lapack_int ldz)
       lapack_int LAPACKE_dgghrd_work (int matrix_layout, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi, double *a,
           lapack_int lda, double *b, lapack_int ldb, double *q, lapack_int
           ldq, double *z, lapack_int ldz)
       lapack_int LAPACKE_cgghrd_work (int matrix_layout, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi,
           lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
           lapack_int ldb, lapack_complex_float *q, lapack_int ldq,
           lapack_complex_float *z, lapack_int ldz)
       lapack_int LAPACKE_zgghrd_work (int matrix_layout, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi,
           lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
           lapack_int ldb, lapack_complex_double *q, lapack_int ldq,
           lapack_complex_double *z, lapack_int ldz)

And gghd3 is the same gig but with a work/lwork situation, because apparently she couldn't leave the house without it:

       lapack_int LAPACKE_sgghd3_work (int matrix_layout, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi, float *a,
           lapack_int lda, float *b, lapack_int ldb, float *q, lapack_int ldq,
           float *z, lapack_int ldz, float *work, lapack_int lwork)
       lapack_int LAPACKE_dgghd3_work (int matrix_layout, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi, double *a,
           lapack_int lda, double *b, lapack_int ldb, double *q, lapack_int
           ldq, double *z, lapack_int ldz, double *work, lapack_int lwork)
       lapack_int LAPACKE_cgghd3_work (int matrix_layout, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi,
           lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
           lapack_int ldb, lapack_complex_float *q, lapack_int ldq,
           lapack_complex_float *z, lapack_int ldz, lapack_complex_float *work,
           lapack_int lwork)
       lapack_int LAPACKE_zgghd3_work (int matrix_layout, char compq, char
           compz, lapack_int n, lapack_int ilo, lapack_int ihi,
           lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
           lapack_int ldb, lapack_complex_double *q, lapack_int ldq,
           lapack_complex_double *z, lapack_int ldz, lapack_complex_double
           *work, lapack_int lwork)

gglse time — here the order is m, n, p (different from ggglm, see what I mean about reading carefully 😭):

       lapack_int LAPACKE_sgglse_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int p, float *a, lapack_int lda, float *b,
           lapack_int ldb, float *c, float *d, float *x, float *work,
           lapack_int lwork)
       lapack_int LAPACKE_dgglse_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int p, double *a, lapack_int lda, double *b,
           lapack_int ldb, double *c, double *d, double *x, double *work,
           lapack_int lwork)
       lapack_int LAPACKE_cgglse_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int p, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *c,
           lapack_complex_float *d, lapack_complex_float *x,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zgglse_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int p, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *b, lapack_int ldb, lapack_complex_double
           *c, lapack_complex_double *d, lapack_complex_double *x,
           lapack_complex_double *work, lapack_int lwork)

The QR-flavored duo, ggqrf and ggrqf. ggqrf goes n, m, p and hands you taua/taub:

       lapack_int LAPACKE_sggqrf_work (int matrix_layout, lapack_int n,
           lapack_int m, lapack_int p, float *a, lapack_int lda, float *taua,
           float *b, lapack_int ldb, float *taub, float *work, lapack_int
           lwork)
       lapack_int LAPACKE_dggqrf_work (int matrix_layout, lapack_int n,
           lapack_int m, lapack_int p, double *a, lapack_int lda, double *taua,
           double *b, lapack_int ldb, double *taub, double *work, lapack_int
           lwork)
       lapack_int LAPACKE_cggqrf_work (int matrix_layout, lapack_int n,
           lapack_int m, lapack_int p, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *taua, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *taub, lapack_complex_float *work, lapack_int
           lwork)
       lapack_int LAPACKE_zggqrf_work (int matrix_layout, lapack_int n,
           lapack_int m, lapack_int p, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *taua, lapack_complex_double *b,
           lapack_int ldb, lapack_complex_double *taub, lapack_complex_double
           *work, lapack_int lwork)

And ggrqf is the mirror twin, with the order flipped to m, p, n — because of course it is:

       lapack_int LAPACKE_sggrqf_work (int matrix_layout, lapack_int m,
           lapack_int p, lapack_int n, float *a, lapack_int lda, float *taua,
           float *b, lapack_int ldb, float *taub, float *work, lapack_int
           lwork)
       lapack_int LAPACKE_dggrqf_work (int matrix_layout, lapack_int m,
           lapack_int p, lapack_int n, double *a, lapack_int lda, double *taua,

catch you in the next chunk, where dggrqf_work finishes its whole sentence like a main character 💖

okay so we're still deep in the prototype zone, bestie — the SYNOPSIS is just going and going and honestly? iconic behavior 💅 here's the next batch, no skips, no cap.

first up, we're closing out that dggrqf from last time — here's the tail end of it:

           double *b, lapack_int ldb, double *taub, double *work, lapack_int
           lwork)

and now the rest of the ggrqf girlies — the c and z _work variants, both rocking matrix_layout, m, p, n, a, lda, taua, b, ldb, taub, work, and lwork 🫶:

       lapack_int LAPACKE_cggrqf_work (int matrix_layout, lapack_int m,
           lapack_int p, lapack_int n, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *taua, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *taub, lapack_complex_float *work, lapack_int
           lwork)
       lapack_int LAPACKE_zggrqf_work (int matrix_layout, lapack_int m,
           lapack_int p, lapack_int n, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *taua, lapack_complex_double *b,
           lapack_int ldb, lapack_complex_double *taub, lapack_complex_double
           *work, lapack_int lwork)

then we slide into the ggsvd family — all four precision flavors, each one a _work variant with jobu, jobv, jobq, m, n, p, *k, *l, a, lda, b, ldb, alpha, beta, u, ldu, v, ldv, q, ldq, work, and *iwork. the complex ones (c and z) also bring rwork along for the ride ✨:

       lapack_int LAPACKE_sggsvd_work (int matrix_layout, char jobu, char jobv,
           char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
           lapack_int *l, float *a, lapack_int lda, float *b, lapack_int ldb,
           float *alpha, float *beta, float *u, lapack_int ldu, float *v,
           lapack_int ldv, float *q, lapack_int ldq, float *work, lapack_int
           *iwork)
       lapack_int LAPACKE_dggsvd_work (int matrix_layout, char jobu, char jobv,
           char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
           lapack_int *l, double *a, lapack_int lda, double *b, lapack_int ldb,
           double *alpha, double *beta, double *u, lapack_int ldu, double *v,
           lapack_int ldv, double *q, lapack_int ldq, double *work, lapack_int
           *iwork)
       lapack_int LAPACKE_cggsvd_work (int matrix_layout, char jobu, char jobv,
           char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
           lapack_int *l, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, float *alpha, float *beta,
           lapack_complex_float *u, lapack_int ldu, lapack_complex_float *v,
           lapack_int ldv, lapack_complex_float *q, lapack_int ldq,
           lapack_complex_float *work, float *rwork, lapack_int *iwork)
       lapack_int LAPACKE_zggsvd_work (int matrix_layout, char jobu, char jobv,
           char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int *k,
           lapack_int *l, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb, double *alpha, double
           *beta, lapack_complex_double *u, lapack_int ldu,
           lapack_complex_double *v, lapack_int ldv, lapack_complex_double *q,
           lapack_int ldq, lapack_complex_double *work, double *rwork,
           lapack_int *iwork)

and then — plot twist — the ggsvd3 versions show up, same energy but with a lwork parameter in the mix too. that's four more, one per flavor 💖:

       lapack_int LAPACKE_sggsvd3_work (int matrix_layout, char jobu, char
           jobv, char jobq, lapack_int m, lapack_int n, lapack_int p,
           lapack_int *k, lapack_int *l, float *a, lapack_int lda, float *b,
           lapack_int ldb, float *alpha, float *beta, float *u, lapack_int ldu,
           float *v, lapack_int ldv, float *q, lapack_int ldq, float *work,
           lapack_int lwork, lapack_int *iwork)
       lapack_int LAPACKE_dggsvd3_work (int matrix_layout, char jobu, char
           jobv, char jobq, lapack_int m, lapack_int n, lapack_int p,
           lapack_int *k, lapack_int *l, double *a, lapack_int lda, double *b,
           lapack_int ldb, double *alpha, double *beta, double *u, lapack_int
           ldu, double *v, lapack_int ldv, double *q, lapack_int ldq, double
           *work, lapack_int lwork, lapack_int *iwork)
       lapack_int LAPACKE_cggsvd3_work (int matrix_layout, char jobu, char
           jobv, char jobq, lapack_int m, lapack_int n, lapack_int p,
           lapack_int *k, lapack_int *l, lapack_complex_float *a, lapack_int
           lda, lapack_complex_float *b, lapack_int ldb, float *alpha, float
           *beta, lapack_complex_float *u, lapack_int ldu, lapack_complex_float
           *v, lapack_int ldv, lapack_complex_float *q, lapack_int ldq,
           lapack_complex_float *work, lapack_int lwork, float *rwork,
           lapack_int *iwork)
       lapack_int LAPACKE_zggsvd3_work (int matrix_layout, char jobu, char
           jobv, char jobq, lapack_int m, lapack_int n, lapack_int p,
           lapack_int *k, lapack_int *l, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *b, lapack_int ldb, double *alpha, double
           *beta, lapack_complex_double *u, lapack_int ldu,
           lapack_complex_double *v, lapack_int ldv, lapack_complex_double *q,
           lapack_int ldq, lapack_complex_double *work, lapack_int lwork,
           double *rwork, lapack_int *iwork)

now the ggsvp crew 💜 — these take tola and tolb in their signature, and note the order shift: it's m, p, n. all four, and the complex ones carry rwork plus tau and work, while the real ones take tau and work too — just watch out, these don't have a lwork here 👀:

       lapack_int LAPACKE_sggsvp_work (int matrix_layout, char jobu, char jobv,
           char jobq, lapack_int m, lapack_int p, lapack_int n, float *a,
           lapack_int lda, float *b, lapack_int ldb, float tola, float tolb,
           lapack_int *k, lapack_int *l, float *u, lapack_int ldu, float *v,
           lapack_int ldv, float *q, lapack_int ldq, lapack_int *iwork, float
           *tau, float *work)
       lapack_int LAPACKE_dggsvp_work (int matrix_layout, char jobu, char jobv,
           char jobq, lapack_int m, lapack_int p, lapack_int n, double *a,
           lapack_int lda, double *b, lapack_int ldb, double tola, double tolb,
           lapack_int *k, lapack_int *l, double *u, lapack_int ldu, double *v,
           lapack_int ldv, double *q, lapack_int ldq, lapack_int *iwork, double
           *tau, double *work)
       lapack_int LAPACKE_cggsvp_work (int matrix_layout, char jobu, char jobv,
           char jobq, lapack_int m, lapack_int p, lapack_int n,
           lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
           lapack_int ldb, float tola, float tolb, lapack_int *k, lapack_int
           *l, lapack_complex_float *u, lapack_int ldu, lapack_complex_float
           *v, lapack_int ldv, lapack_complex_float *q, lapack_int ldq,
           lapack_int *iwork, float *rwork, lapack_complex_float *tau,
           lapack_complex_float *work)
       lapack_int LAPACKE_zggsvp_work (int matrix_layout, char jobu, char jobv,
           char jobq, lapack_int m, lapack_int p, lapack_int n,
           lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
           lapack_int ldb, double tola, double tolb, lapack_int *k, lapack_int
           *l, lapack_complex_double *u, lapack_int ldu, lapack_complex_double
           *v, lapack_int ldv, lapack_complex_double *q, lapack_int ldq,
           lapack_int *iwork, double *rwork, lapack_complex_double *tau,
           lapack_complex_double *work)

and the ggsvp3 versions? yup, same as ggsvp but they do bring lwork to the party. four more, all lined up 🌈:

       lapack_int LAPACKE_sggsvp3_work (int matrix_layout, char jobu, char
           jobv, char jobq, lapack_int m, lapack_int p, lapack_int n, float *a,
           lapack_int lda, float *b, lapack_int ldb, float tola, float tolb,
           lapack_int *k, lapack_int *l, float *u, lapack_int ldu, float *v,
           lapack_int ldv, float *q, lapack_int ldq, lapack_int *iwork, float
           *tau, float *work, lapack_int lwork)
       lapack_int LAPACKE_dggsvp3_work (int matrix_layout, char jobu, char
           jobv, char jobq, lapack_int m, lapack_int p, lapack_int n, double
           *a, lapack_int lda, double *b, lapack_int ldb, double tola, double
           tolb, lapack_int *k, lapack_int *l, double *u, lapack_int ldu,
           double *v, lapack_int ldv, double *q, lapack_int ldq, lapack_int
           *iwork, double *tau, double *work, lapack_int lwork)
       lapack_int LAPACKE_cggsvp3_work (int matrix_layout, char jobu, char
           jobv, char jobq, lapack_int m, lapack_int p, lapack_int n,
           lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
           lapack_int ldb, float tola, float tolb, lapack_int *k, lapack_int
           *l, lapack_complex_float *u, lapack_int ldu, lapack_complex_float
           *v, lapack_int ldv, lapack_complex_float *q, lapack_int ldq,
           lapack_int *iwork, float *rwork, lapack_complex_float *tau,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zggsvp3_work (int matrix_layout, char jobu, char
           jobv, char jobq, lapack_int m, lapack_int p, lapack_int n,
           lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
           lapack_int ldb, double tola, double tolb, lapack_int *k, lapack_int
           *l, lapack_complex_double *u, lapack_int ldu, lapack_complex_double
           *v, lapack_int ldv, lapack_complex_double *q, lapack_int ldq,
           lapack_int *iwork, double *rwork, lapack_complex_double *tau,
           lapack_complex_double *work, lapack_int lwork)

okay next: the gtcon cuties 🎀 — note these ones don't take matrix_layout at all, they're built different. they take norm, n, and all those const-y pointers: dl, d, du, du2, ipiv, then anorm, rcond, work, iwork (real flavors) or just work (complex flavors). the c/z ones skip iwork entirely, slay:

       lapack_int LAPACKE_sgtcon_work (char norm, lapack_int n, const float
           *dl, const float *d, const float *du, const float *du2, const
           lapack_int *ipiv, float anorm, float *rcond, float *work, lapack_int
           *iwork)
       lapack_int LAPACKE_dgtcon_work (char norm, lapack_int n, const double
           *dl, const double *d, const double *du, const double *du2, const
           lapack_int *ipiv, double anorm, double *rcond, double *work,
           lapack_int *iwork)
       lapack_int LAPACKE_cgtcon_work (char norm, lapack_int n, const
           lapack_complex_float *dl, const lapack_complex_float *d, const
           lapack_complex_float *du, const lapack_complex_float *du2, const
           lapack_int *ipiv, float anorm, float *rcond, lapack_complex_float
           *work)
       lapack_int LAPACKE_zgtcon_work (char norm, lapack_int n, const
           lapack_complex_double *dl, const lapack_complex_double *d, const
           lapack_complex_double *du, const lapack_complex_double *du2, const
           lapack_int *ipiv, double anorm, double *rcond, lapack_complex_double
           *work)

and the gtrfs fam 🔥 — back to matrix_layout, and they're loaded: trans, n, nrhs, a whole lineup of const pointers (dl, d, du, dlf, df, duf, du2, ipiv, b), then x, ldx, ferr, berr, work, iwork. the complex ones tack on rwork at the end, ngl that's a lot of parameters but she's serving:

       lapack_int LAPACKE_sgtrfs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int nrhs, const float *dl, const float *d,
           const float *du, const float *dlf, const float *df, const float
           *duf, const float *du2, const lapack_int *ipiv, const float *b,
           lapack_int ldb, float *x, lapack_int ldx, float *ferr, float *berr,
           float *work, lapack_int *iwork)
       lapack_int LAPACKE_dgtrfs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int nrhs, const double *dl, const double *d,
           const double *du, const double *dlf, const double *df, const double
           *duf, const double *du2, const lapack_int *ipiv, const double *b,
           lapack_int ldb, double *x, lapack_int ldx, double *ferr, double
           *berr, double *work, lapack_int *iwork)
       lapack_int LAPACKE_cgtrfs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *dl, const
           lapack_complex_float *d, const lapack_complex_float *du, const
           lapack_complex_float *dlf, const lapack_complex_float *df, const
           lapack_complex_float *duf, const lapack_complex_float *du2, const
           lapack_int *ipiv, const lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *x, lapack_int ldx, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zgtrfs_work (int matrix_layout, char trans,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *dl,
           const lapack_complex_double *d, const lapack_complex_double *du,
           const lapack_complex_double *dlf, const lapack_complex_double *df,
           const lapack_complex_double *duf, const lapack_complex_double *du2,
           const lapack_int *ipiv, const lapack_complex_double *b, lapack_int
           ldb, lapack_complex_double *x, lapack_int ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork)

and finally (for this chunk, anyway 😌) we got sgtsv_work starting up — matrix_layout, n, nrhs, and the mutable dl, d, du, b, plus ldb. the next batch picks up the rest of the gtsv squad, so hold that thought bestie 🌸:

       lapack_int LAPACKE_sgtsv_work (int matrix_layout, lapack_int n,
           lapack_int nrhs, float *dl, float *d, float *du, float *b,
           lapack_int ldb)

okay bestie, we're still in the function-signature era of this page and honestly it's giving "phone book but make it linear algebra" 💅 but like, we're powering through because that's what icons do. all of these are lapack_int-returning prototypes for the _work variants, k? let's go ✨

lapack_int LAPACKE_dgtsv_work (int matrix_layout, lapack_int n,
    lapack_int nrhs, double *dl, double *d, double *du, double *b,
    lapack_int ldb)
lapack_int LAPACKE_cgtsv_work (int matrix_layout, lapack_int n,
    lapack_int nrhs, lapack_complex_float *dl, lapack_complex_float *d,
    lapack_complex_float *du, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zgtsv_work (int matrix_layout, lapack_int n,
    lapack_int nrhs, lapack_complex_double *dl, lapack_complex_double
    *d, lapack_complex_double *du, lapack_complex_double *b, lapack_int
    ldb)

the dgtsv / cgtsv / zgtsv trio, all three rocking matrix_layout, n, nrhs, the dl / d / du diagonal squad, b, and ldb. real vs complex, double vs float, the whole 🌈 rainbow of it. we love a consistent family.


then the expert crew, gtsvx, because sometimes you want the whole ✨analysis✨ not just the answer:

lapack_int LAPACKE_sgtsvx_work (int matrix_layout, char fact, char
    trans, lapack_int n, lapack_int nrhs, const float *dl, const float
    *d, const float *du, float *dlf, float *df, float *duf, float *du2,
    lapack_int *ipiv, const float *b, lapack_int ldb, float *x,
    lapack_int ldx, float *rcond, float *ferr, float *berr, float *work,
    lapack_int *iwork)
lapack_int LAPACKE_dgtsvx_work (int matrix_layout, char fact, char
    trans, lapack_int n, lapack_int nrhs, const double *dl, const double
    *d, const double *du, double *dlf, double *df, double *duf, double
    *du2, lapack_int *ipiv, const double *b, lapack_int ldb, double *x,
    lapack_int ldx, double *rcond, double *ferr, double *berr, double
    *work, lapack_int *iwork)
lapack_int LAPACKE_cgtsvx_work (int matrix_layout, char fact, char
    trans, lapack_int n, lapack_int nrhs, const lapack_complex_float
    *dl, const lapack_complex_float *d, const lapack_complex_float *du,
    lapack_complex_float *dlf, lapack_complex_float *df,
    lapack_complex_float *duf, lapack_complex_float *du2, lapack_int
    *ipiv, const lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *x, lapack_int ldx, float *rcond, float *ferr,
    float *berr, lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zgtsvx_work (int matrix_layout, char fact, char
    trans, lapack_int n, lapack_int nrhs, const lapack_complex_double
    *dl, const lapack_complex_double *d, const lapack_complex_double
    *du, lapack_complex_double *dlf, lapack_complex_double *df,
    lapack_complex_double *duf, lapack_complex_double *du2, lapack_int
    *ipiv, const lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *x, lapack_int ldx, double *rcond, double
    *ferr, double *berr, lapack_complex_double *work, double *rwork)

note how the complex ones get a whole extra rwork to hang with while the real ones just vibe with work and iwork. not me being obsessed with fact and trans — those char args are lowkey the main characters here 🎀


factorization besties, gttrf — no matrix_layout in sight, they keep it simple:

lapack_int LAPACKE_sgttrf_work (lapack_int n, float *dl, float *d, float
    *du, float *du2, lapack_int *ipiv)
lapack_int LAPACKE_dgttrf_work (lapack_int n, double *dl, double *d,
    double *du, double *du2, lapack_int *ipiv)
lapack_int LAPACKE_cgttrf_work (lapack_int n, lapack_complex_float *dl,
    lapack_complex_float *d, lapack_complex_float *du,
    lapack_complex_float *du2, lapack_int *ipiv)
lapack_int LAPACKE_zgttrf_work (lapack_int n, lapack_complex_double *dl,
    lapack_complex_double *d, lapack_complex_double *du,
    lapack_complex_double *du2, lapack_int *ipiv)

then gttrs comes through to actually use that factorization, and she's back to matrix_layout, trans, n, nrhs, dl, d, du, du2, ipiv, b, ldb:

lapack_int LAPACKE_sgttrs_work (int matrix_layout, char trans,
    lapack_int n, lapack_int nrhs, const float *dl, const float *d,
    const float *du, const float *du2, const lapack_int *ipiv, float *b,
    lapack_int ldb)
lapack_int LAPACKE_dgttrs_work (int matrix_layout, char trans,
    lapack_int n, lapack_int nrhs, const double *dl, const double *d,
    const double *du, const double *du2, const lapack_int *ipiv, double
    *b, lapack_int ldb)
lapack_int LAPACKE_cgttrs_work (int matrix_layout, char trans,
    lapack_int n, lapack_int nrhs, const lapack_complex_float *dl, const
    lapack_complex_float *d, const lapack_complex_float *du, const
    lapack_complex_float *du2, const lapack_int *ipiv,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zgttrs_work (int matrix_layout, char trans,
    lapack_int n, lapack_int nrhs, const lapack_complex_double *dl,
    const lapack_complex_double *d, const lapack_complex_double *du,
    const lapack_complex_double *du2, const lapack_int *ipiv,
    lapack_complex_double *b, lapack_int ldb)

now we're entering hermitian-band territory and it's a whole vibe 💜 hbev says "just give me the eigenvalues, jobz decides if you want vectors too":

lapack_int LAPACKE_chbev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_float *ab, lapack_int
    ldab, float *w, lapack_complex_float *z, lapack_int ldz,
    lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zhbev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_double *ab, lapack_int
    ldab, double *w, lapack_complex_double *z, lapack_int ldz,
    lapack_complex_double *work, double *rwork)

hbevd ups the drama with lwork, lrwork, iwork, liwork — she plans ahead, she's organized, she's the friend with a color-coded calendar 🗓️✨

lapack_int LAPACKE_chbevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_float *ab, lapack_int
    ldab, float *w, lapack_complex_float *z, lapack_int ldz,
    lapack_complex_float *work, lapack_int lwork, float *rwork,
    lapack_int lrwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_zhbevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_double *ab, lapack_int
    ldab, double *w, lapack_complex_double *z, lapack_int ldz,
    lapack_complex_double *work, lapack_int lwork, double *rwork,
    lapack_int lrwork, lapack_int *iwork, lapack_int liwork)

and hbevx is the picky one — range, vl, vu, il, iu, abstol, m, plus q, ldq, ifail. she does NOT do "all the eigenvalues", she does exactly the ones she wants 🎯 iconic behavior honestly

lapack_int LAPACKE_chbevx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int kd, lapack_complex_float
    *ab, lapack_int ldab, lapack_complex_float *q, lapack_int ldq, float
    vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int
    *m, float *w, lapack_complex_float *z, lapack_int ldz,
    lapack_complex_float *work, float *rwork, lapack_int *iwork,
    lapack_int *ifail)
lapack_int LAPACKE_zhbevx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int kd, lapack_complex_double
    *ab, lapack_int ldab, lapack_complex_double *q, lapack_int ldq,
    double vl, double vu, lapack_int il, lapack_int iu, double abstol,
    lapack_int *m, double *w, lapack_complex_double *z, lapack_int ldz,
    lapack_complex_double *work, double *rwork, lapack_int *iwork,
    lapack_int *ifail)

hbgst — the "generalized → standard" glow-up, brought to you by ka, kb, ldab, ldbb, and a second matrix bb (she's const, so hands off 🫶):

lapack_int LAPACKE_chbgst_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float
    *ab, lapack_int ldab, const lapack_complex_float *bb, lapack_int
    ldbb, lapack_complex_float *x, lapack_int ldx, lapack_complex_float
    *work, float *rwork)
lapack_int LAPACKE_zhbgst_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double
    *ab, lapack_int ldab, const lapack_complex_double *bb, lapack_int
    ldbb, lapack_complex_double *x, lapack_int ldx,
    lapack_complex_double *work, double *rwork)

hbgv is the full generalized hermitian band eigenproblem, jobz and uplo running the show, w for the eigenvalues and z / ldz for the vectors:

lapack_int LAPACKE_chbgv_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float
    *ab, lapack_int ldab, lapack_complex_float *bb, lapack_int ldbb,
    float *w, lapack_complex_float *z, lapack_int ldz,
    lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zhbgv_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double
    *ab, lapack_int ldab, lapack_complex_double *bb, lapack_int ldbb,
    double *w, lapack_complex_double *z, lapack_int ldz,
    lapack_complex_double *work, double *rwork)

hbgvd is her deluxe sister with ALL the workspace sizes (lwork, lrwork, liwork):

lapack_int LAPACKE_chbgvd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float
    *ab, lapack_int ldab, lapack_complex_float *bb, lapack_int ldbb,
    float *w, lapack_complex_float *z, lapack_int ldz,
    lapack_complex_float *work, lapack_int lwork, float *rwork,
    lapack_int lrwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_zhbgvd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double
    *ab, lapack_int ldab, lapack_complex_double *bb, lapack_int ldbb,
    double *w, lapack_complex_double *z, lapack_int ldz,
    lapack_complex_double *work, lapack_int lwork, double *rwork,
    lapack_int lrwork, lapack_int *iwork, lapack_int liwork)

and hbgvx is the selective queen with range, vl, vu, il, iu, abstol, m, q, ldq, ifail — like she's got time for every eigenvalue? no bestie, she's busy 💅

lapack_int LAPACKE_chbgvx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
    lapack_complex_float *ab, lapack_int ldab, lapack_complex_float *bb,
    lapack_int ldbb, lapack_complex_float *q, lapack_int ldq, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m,
    float *w, lapack_complex_float *z, lapack_int ldz,
    lapack_complex_float *work, float *rwork, lapack_int *iwork,
    lapack_int *ifail)
lapack_int LAPACKE_zhbgvx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int ka, lapack_int kb,
    lapack_complex_double *ab, lapack_int ldab, lapack_complex_double
    *bb, lapack_int ldbb, lapack_complex_double *q, lapack_int ldq,
    double vl, double vu, lapack_int il, lapack_int iu, double abstol,
    lapack_int *m, double *w, lapack_complex_double *z, lapack_int ldz,
    lapack_complex_double *work, double *rwork, lapack_int *iwork,
    lapack_int *ifail)

hbtrd drops in with vect, uplo, n, kd, and hands you d, e, q, ldq — the reduction-to-tridiagonal moment ✨

lapack_int LAPACKE_chbtrd_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_float *ab, lapack_int
    ldab, float *d, float *e, lapack_complex_float *q, lapack_int ldq,
    lapack_complex_float *work)
lapack_int LAPACKE_zhbtrd_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_double *ab, lapack_int
    ldab, double *d, double *e, lapack_complex_double *q, lapack_int
    ldq, lapack_complex_double *work)

hecon with her condition-number energy — uplo, n, a, lda, ipiv, anorm, rcond:

lapack_int LAPACKE_checon_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_float *a, lapack_int lda, const lapack_int
    *ipiv, float anorm, float *rcond, lapack_complex_float *work)
lapack_int LAPACKE_zhecon_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_double *a, lapack_int lda, const lapack_int
    *ipiv, double anorm, double *rcond, lapack_complex_double *work)

heequb doing the equilibration thing with s, scond, amax:

lapack_int LAPACKE_cheequb_work (int matrix_layout, char uplo,
    lapack_int n, const lapack_complex_float *a, lapack_int lda, float
    *s, float *scond, float *amax, lapack_complex_float *work)
lapack_int LAPACKE_zheequb_work (int matrix_layout, char uplo,
    lapack_int n, const lapack_complex_double *a, lapack_int lda, double
    *s, double *scond, double *amax, lapack_complex_double *work)

and heev slides in right at the end, packing jobz, uplo, n, a, lda, w, work, lwork, rwork — she's mid-entrance and we're literally about to see where she goes 👀

lapack_int LAPACKE_cheev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_float *a, lapack_int lda, float *w,
    lapack_complex_float *work, lapack_int lwork, float *rwork)
lapack_int LAPACKE_zheev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_double *a, lapack_int lda, double *w,

okay we're literally mid-signature on zheev — hold that thought bestie, she's not done 💀

           lapack_complex_double *work, lapack_int lwork, double *rwork)
       lapack_int LAPACKE_cheevd_work (int matrix_layout, char jobz, char uplo,
           lapack_int n, lapack_complex_float *a, lapack_int lda, float *w,
           lapack_complex_float *work, lapack_int lwork, float *rwork,
           lapack_int lrwork, lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_zheevd_work (int matrix_layout, char jobz, char uplo,
           lapack_int n, lapack_complex_double *a, lapack_int lda, double *w,
           lapack_complex_double *work, lapack_int lwork, double *rwork,
           lapack_int lrwork, lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_cheevr_work (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_complex_float *a, lapack_int
           lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
           lapack_int *m, float *w, lapack_complex_float *z, lapack_int ldz,
           lapack_int *isuppz, lapack_complex_float *work, lapack_int lwork,
           float *rwork, lapack_int lrwork, lapack_int *iwork, lapack_int
           liwork)
       lapack_int LAPACKE_zheevr_work (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_complex_double *a, lapack_int
           lda, double vl, double vu, lapack_int il, lapack_int iu, double
           abstol, lapack_int *m, double *w, lapack_complex_double *z,
           lapack_int ldz, lapack_int *isuppz, lapack_complex_double *work,
           lapack_int lwork, double *rwork, lapack_int lrwork, lapack_int
           *iwork, lapack_int liwork)
       lapack_int LAPACKE_cheevx_work (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_complex_float *a, lapack_int
           lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
           lapack_int *m, float *w, lapack_complex_float *z, lapack_int ldz,
           lapack_complex_float *work, lapack_int lwork, float *rwork,
           lapack_int *iwork, lapack_int *ifail)
       lapack_int LAPACKE_zheevx_work (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_complex_double *a, lapack_int
           lda, double vl, double vu, lapack_int il, lapack_int iu, double
           abstol, lapack_int *m, double *w, lapack_complex_double *z,
           lapack_int ldz, lapack_complex_double *work, lapack_int lwork,
           double *rwork, lapack_int *iwork, lapack_int *ifail)

okay so we're still in the great wall of prototypes and honestly? we're eating 💅 notice the pattern bestie: every single one of these comes in a c-flavoured twin and a z-flavoured twin, and the whole signature is identical except float ↔ double and lapack_complex_float ↔ lapack_complex_double. it's giving matched set. it's giving his-and-his crystal. 🎀

and yes, isuppz, abstol, vl, vu: darling the range-finder era. some of these take matrix_layout` first like it's the VIP wristband at the door. keep your eyes on the argument order, she does not forgive. 💀

       lapack_int LAPACKE_chegst_work (int matrix_layout, lapack_int itype,
           char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda,
           const lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zhegst_work (int matrix_layout, lapack_int itype,
           char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda,
           const lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_chegv_work (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, lapack_complex_float *a, lapack_int
           lda, lapack_complex_float *b, lapack_int ldb, float *w,
           lapack_complex_float *work, lapack_int lwork, float *rwork)
       lapack_int LAPACKE_zhegv_work (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *b, lapack_int ldb, double *w,
           lapack_complex_double *work, lapack_int lwork, double *rwork)
       lapack_int LAPACKE_chegvd_work (int matrix_layout, lapack_int itype,
           char jobz, char uplo, lapack_int n, lapack_complex_float *a,
           lapack_int lda, lapack_complex_float *b, lapack_int ldb, float *w,
           lapack_complex_float *work, lapack_int lwork, float *rwork,
           lapack_int lrwork, lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_zhegvd_work (int matrix_layout, lapack_int itype,
           char jobz, char uplo, lapack_int n, lapack_complex_double *a,
           lapack_int lda, lapack_complex_double *b, lapack_int ldb, double *w,
           lapack_complex_double *work, lapack_int lwork, double *rwork,
           lapack_int lrwork, lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_chegvx_work (int matrix_layout, lapack_int itype,
           char jobz, char range, char uplo, lapack_int n, lapack_complex_float
           *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb, float
           vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int
           *m, float *w, lapack_complex_float *z, lapack_int ldz,
           lapack_complex_float *work, lapack_int lwork, float *rwork,
           lapack_int *iwork, lapack_int *ifail)
       lapack_int LAPACKE_zhegvx_work (int matrix_layout, lapack_int itype,
           char jobz, char range, char uplo, lapack_int n,
           lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
           lapack_int ldb, double vl, double vu, lapack_int il, lapack_int iu,
           double abstol, lapack_int *m, double *w, lapack_complex_double *z,
           lapack_int ldz, lapack_complex_double *work, lapack_int lwork,
           double *rwork, lapack_int *iwork, lapack_int *ifail)

the gst / gv / gvd / gvx quad is here and it is highkey the most extra branch of the family 🫶 like gvx woke up and chose to take itype, jobz, range, uplo, vl, vu, il, iu, abstol, a *m out-param, a workspace, rwork, iwork AND an ifail array. twelve out of ten arguments, no notes. she's booked and busy. 👑

also luv that b is const in chegst_work/zhegst_work but not const in the gv line — do not "clean that up", okay? copy it exactly as it is, that's the assignment. 🙈

       lapack_int LAPACKE_cherfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
           const lapack_complex_float *af, lapack_int ldaf, const lapack_int
           *ipiv, const lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *x, lapack_int ldx, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zherfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
           const lapack_complex_double *af, lapack_int ldaf, const lapack_int
           *ipiv, const lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork)
       lapack_int LAPACKE_cherfsx_work (int matrix_layout, char uplo, char
           equed, lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, const lapack_complex_float *af, lapack_int ldaf,
           const lapack_int *ipiv, const float *s, const lapack_complex_float
           *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float
           *rcond, float *berr, lapack_int n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int nparams, float *params,
           lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zherfsx_work (int matrix_layout, char uplo, char
           equed, lapack_int n, lapack_int nrhs, const lapack_complex_double
           *a, lapack_int lda, const lapack_complex_double *af, lapack_int
           ldaf, const lapack_int *ipiv, const double *s, const
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
           lapack_int ldx, double *rcond, double *berr, lapack_int n_err_bnds,
           double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams,
           double *params, lapack_complex_double *work, double *rwork)

the rfs crew 💀 this is the "bestie can you double-check my work" line of the family. she wants a AND af, she wants the ipiv history, and she'll hand you back ferr and berr so you can vibe check how wrong you were. iconic honestly. ✨

then rfsx said "and what if we ALSO tracked equed, s, rcond, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params" and everyone clapped. that is a LOT of arguments. do not lose one. not even nparams. not even params, plural, separately from everything else. 🍓

       lapack_int LAPACKE_chesv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda,
           lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zhesv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
           lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *work, lapack_int lwork)
       lapack_int LAPACKE_chesvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, lapack_complex_float *af, lapack_int ldaf,
           lapack_int *ipiv, const lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *x, lapack_int ldx, float *rcond, float *ferr,
           float *berr, lapack_complex_float *work, lapack_int lwork, float
           *rwork)
       lapack_int LAPACKE_zhesvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_int lda, lapack_complex_double *af, lapack_int ldaf,
           lapack_int *ipiv, const lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, double *rcond, double
           *ferr, double *berr, lapack_complex_double *work, lapack_int lwork,
           double *rwork)
       lapack_int LAPACKE_chesvxx_work (int matrix_layout, char fact, char
           uplo, lapack_int n, lapack_int nrhs, lapack_complex_float *a,
           lapack_int lda, lapack_complex_float *af, lapack_int ldaf,
           lapack_int *ipiv, char *equed, float *s, lapack_complex_float *b,
           lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float
           *rcond, float *rpvgrw, float *berr, lapack_int n_err_bnds, float
           *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float
           *params, lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zhesvxx_work (int matrix_layout, char fact, char
           uplo, lapack_int n, lapack_int nrhs, lapack_complex_double *a,
           lapack_int lda, lapack_complex_double *af, lapack_int ldaf,
           lapack_int *ipiv, char *equed, double *s, lapack_complex_double *b,
           lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double
           *rcond, double *rpvgrw, double *berr, lapack_int n_err_bnds, double
           *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double
           *params, lapack_complex_double *work, double *rwork)

sv → svx → svxx is literally the glow-up pipeline 😭 plain sv just solves it and minds her business. svx shows up with fact, af, ldaf, rcond, ferr, berr and a rwork. and svxx?? svxx has equed and s and rpvgrw and the whole err_bnds situation. she is EXTRA and we love her for it. 💖

tiny detail bestie: in chesvxx_work / zhesvxx_work the equed is a plain char * (not const), and a / af / b / x are non-const too — unlike chesvx_work where a and b are const. it's giving "she might edit your inputs, so maybe don't pass your only copy". 🙈 i'm just reading the signature, don't come for me.

       lapack_int LAPACKE_chetrd_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float *a, lapack_int lda, float *d, float *e,
           lapack_complex_float *tau, lapack_complex_float *work, lapack_int
           lwork)
       lapack_int LAPACKE_zhetrd_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double *a, lapack_int lda, double *d, double *e,
           lapack_complex_double *tau, lapack_complex_double *work, lapack_int
           lwork)
       lapack_int LAPACKE_chetrf_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zhetrf_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv,
           lapack_complex_double *work, lapack_int lwork)
       lapack_int LAPACKE_chetri_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv,
           lapack_complex_float *work)
       lapack_int LAPACKE_zhetri_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv,
           lapack_complex_double *work)
       lapack_int LAPACKE_chetrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zhetrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)

the tr block!! 🎀 trd gives you d, e and tau (the tridiagonal era). trf factors and hands you ipiv. tri inverts and eats ipiv as const — side eye, she's just reading it, she's a good guest. and trs solves using ipiv as const again, with nrhs and ldb in the mix. 🔥

notice chetri_work and zhetri_work have NO lwork argument. none. zero. not a crumb. don't you dare add one. the vibes are complete without it. 💅

       lapack_int LAPACKE_chfrk_work (int matrix_layout, char transr, char
           uplo, char trans, lapack_int n, lapack_int k, float alpha, const

and we end this batch on a cliffhanger 😭 LAPACKE_chfrk_work walks in with transr AND trans (two whole transposes, she's multilingual), uplo, n, k, alpha, and a const... something. and then the page just—

okay bestie, don't panic. the signature is literally cut off mid-line here. keep scrolling, the rest of chfrk_work (and whatever comes after) is in the next chunk. don't try to guess the missing bits, you'll get got. 🫶

the c/z twin energy continues, the argument order continues, and my patience for typing lapack_complex_double continues. see you in the next one, we're SO close. 🌈

okay so we're still parked in the SYNOPSIS zone 🫶 and it's just prototypes for days — which is honestly iconic of a header file, but bestie I need you to lock in because every single line here matters. no skimming, no "yeah yeah I get it", okay? 💅

First up: the poor thing that got cut in half last time. We're finishing the tail end of that signature — nothing to do but hand it its ending ✨

           lapack_complex_float *a, lapack_int lda, float beta,
           lapack_complex_float *c)

and then its double-precision twin shows up fully formed, like it heard us talking 🦋

       lapack_int LAPACKE_zhfrk_work (int matrix_layout, char transr, char
           uplo, char trans, lapack_int n, lapack_int k, double alpha, const
           lapack_complex_double *a, lapack_int lda, double beta,
           lapack_complex_double *c)

the hgeqz crew — four of them, one per precision 👑

Real versions first, <italic>s</italic> and <italic>d</italic>, and note they carry alphar + alphai as two separate arrays:

       lapack_int LAPACKE_shgeqz_work (int matrix_layout, char job, char compq,
           char compz, lapack_int n, lapack_int ilo, lapack_int ihi, float *h,
           lapack_int ldh, float *t, lapack_int ldt, float *alphar, float
           *alphai, float *beta, float *q, lapack_int ldq, float *z, lapack_int
           ldz, float *work, lapack_int lwork)
       lapack_int LAPACKE_dhgeqz_work (int matrix_layout, char job, char compq,
           char compz, lapack_int n, lapack_int ilo, lapack_int ihi, double *h,
           lapack_int ldh, double *t, lapack_int ldt, double *alphar, double
           *alphai, double *beta, double *q, lapack_int ldq, double *z,
           lapack_int ldz, double *work, lapack_int lwork)

Then the complex girlies <italic>c</italic> and <italic>z</italic> — same deal but the two alphas collapse into one array, and they get an extra <pink>rwork</pink> at the very end. hi bestie, we see you 👀

       lapack_int LAPACKE_chgeqz_work (int matrix_layout, char job, char compq,
           char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
           lapack_complex_float *h, lapack_int ldh, lapack_complex_float *t,
           lapack_int ldt, lapack_complex_float *alpha, lapack_complex_float
           *beta, lapack_complex_float *q, lapack_int ldq, lapack_complex_float
           *z, lapack_int ldz, lapack_complex_float *work, lapack_int lwork,
           float *rwork)
       lapack_int LAPACKE_zhgeqz_work (int matrix_layout, char job, char compq,
           char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
           lapack_complex_double *h, lapack_int ldh, lapack_complex_double *t,
           lapack_int ldt, lapack_complex_double *alpha, lapack_complex_double
           *beta, lapack_complex_double *q, lapack_int ldq,
           lapack_complex_double *z, lapack_int ldz, lapack_complex_double
           *work, lapack_int lwork, double *rwork)

hpcon — the condition-number duo 🎀 just <italic>c</italic> and <italic>z</italic>, no real versions hanging around:

       lapack_int LAPACKE_chpcon_work (int matrix_layout, char uplo, lapack_int
           n, const lapack_complex_float *ap, const lapack_int *ipiv, float
           anorm, float *rcond, lapack_complex_float *work)
       lapack_int LAPACKE_zhpcon_work (int matrix_layout, char uplo, lapack_int
           n, const lapack_complex_double *ap, const lapack_int *ipiv, double
           anorm, double *rcond, lapack_complex_double *work)

hpev — shortest one in the family ✨ just <pink>work</pink> and <pink>rwork</pink>, no length args, living simply:

       lapack_int LAPACKE_chpev_work (int matrix_layout, char jobz, char uplo,
           lapack_int n, lapack_complex_float *ap, float *w,
           lapack_complex_float *z, lapack_int ldz, lapack_complex_float *work,
           float *rwork)
       lapack_int LAPACKE_zhpev_work (int matrix_layout, char jobz, char uplo,
           lapack_int n, lapack_complex_double *ap, double *w,
           lapack_complex_double *z, lapack_int ldz, lapack_complex_double
           *work, double *rwork)

hpevd — the overachiever 🔥 because now we're doing three workspace arrays, each with its own length: lwork, lrwork, liwork:

       lapack_int LAPACKE_chpevd_work (int matrix_layout, char jobz, char uplo,
           lapack_int n, lapack_complex_float *ap, float *w,
           lapack_complex_float *z, lapack_int ldz, lapack_complex_float *work,
           lapack_int lwork, float *rwork, lapack_int lrwork, lapack_int
           *iwork, lapack_int liwork)
       lapack_int LAPACKE_zhpevd_work (int matrix_layout, char jobz, char uplo,
           lapack_int n, lapack_complex_double *ap, double *w,
           lapack_complex_double *z, lapack_int ldz, lapack_complex_double
           *work, lapack_int lwork, double *rwork, lapack_int lrwork,
           lapack_int *iwork, lapack_int liwork)

hpevx — same energy but with the whole range / vl / vu / il / iu / abstol situation plus m and ifail 💀 look at that argument list, it's giving final boss:

       lapack_int LAPACKE_chpevx_work (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_complex_float *ap, float vl,
           float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m,
           float *w, lapack_complex_float *z, lapack_int ldz,
           lapack_complex_float *work, float *rwork, lapack_int *iwork,
           lapack_int *ifail)
       lapack_int LAPACKE_zhpevx_work (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_complex_double *ap, double
           vl, double vu, lapack_int il, lapack_int iu, double abstol,
           lapack_int *m, double *w, lapack_complex_double *z, lapack_int ldz,
           lapack_complex_double *work, double *rwork, lapack_int *iwork,
           lapack_int *ifail)

hpgst — tiny icon, four args of vibes 🌸 note the itype and that bp is const:

       lapack_int LAPACKE_chpgst_work (int matrix_layout, lapack_int itype,
           char uplo, lapack_int n, lapack_complex_float *ap, const
           lapack_complex_float *bp)
       lapack_int LAPACKE_zhpgst_work (int matrix_layout, lapack_int itype,
           char uplo, lapack_int n, lapack_complex_double *ap, const
           lapack_complex_double *bp)

hpgv — now bp isn't const anymore 🙈 (it's lapack_complex_float *bp, no const, check it) and we picked up jobz, w, z, ldz, work, rwork:

       lapack_int LAPACKE_chpgv_work (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, lapack_complex_float *ap,
           lapack_complex_float *bp, float *w, lapack_complex_float *z,
           lapack_int ldz, lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zhpgv_work (int matrix_layout, lapack_int itype, char
           jobz, char uplo, lapack_int n, lapack_complex_double *ap,
           lapack_complex_double *bp, double *w, lapack_complex_double *z,
           lapack_int ldz, lapack_complex_double *work, double *rwork)

hpgvd — hpgv but make it extra 💅 now there's lwork, lrwork, iwork, liwork all up in here:

       lapack_int LAPACKE_chpgvd_work (int matrix_layout, lapack_int itype,
           char jobz, char uplo, lapack_int n, lapack_complex_float *ap,
           lapack_complex_float *bp, float *w, lapack_complex_float *z,
           lapack_int ldz, lapack_complex_float *work, lapack_int lwork, float
           *rwork, lapack_int lrwork, lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_zhpgvd_work (int matrix_layout, lapack_int itype,
           char jobz, char uplo, lapack_int n, lapack_complex_double *ap,
           lapack_complex_double *bp, double *w, lapack_complex_double *z,
           lapack_int ldz, lapack_complex_double *work, lapack_int lwork,
           double *rwork, lapack_int lrwork, lapack_int *iwork, lapack_int
           liwork)

hpgvx — the longest one so far, allegedly 😭 range, vl, vu, il, iu, abstol, m, ifail — all of it, no notes:

       lapack_int LAPACKE_chpgvx_work (int matrix_layout, lapack_int itype,
           char jobz, char range, char uplo, lapack_int n, lapack_complex_float
           *ap, lapack_complex_float *bp, float vl, float vu, lapack_int il,
           lapack_int iu, float abstol, lapack_int *m, float *w,
           lapack_complex_float *z, lapack_int ldz, lapack_complex_float *work,
           float *rwork, lapack_int *iwork, lapack_int *ifail)
       lapack_int LAPACKE_zhpgvx_work (int matrix_layout, lapack_int itype,
           char jobz, char range, char uplo, lapack_int n,
           lapack_complex_double *ap, lapack_complex_double *bp, double vl,
           double vu, lapack_int il, lapack_int iu, double abstol, lapack_int
           *m, double *w, lapack_complex_double *z, lapack_int ldz,
           lapack_complex_double *work, double *rwork, lapack_int *iwork,
           lapack_int *ifail)

hprfs — the refined-solution moment ✨ <pink>ferr</pink> and <pink>berr</pink> both show up, plus afp and ipiv and b/ldb/x/ldx. she's thorough:

       lapack_int LAPACKE_chprfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_float *ap, const
           lapack_complex_float *afp, const lapack_int *ipiv, const
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
           lapack_int ldx, float *ferr, float *berr, lapack_complex_float
           *work, float *rwork)
       lapack_int LAPACKE_zhprfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_double *ap, const
           lapack_complex_double *afp, const lapack_int *ipiv, const
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
           lapack_int ldx, double *ferr, double *berr, lapack_complex_double
           *work, double *rwork)

hpsv — short and sweet 🍓 nine args, ap / ipiv / b / ldb, done:

       lapack_int LAPACKE_chpsv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, lapack_complex_float *ap, lapack_int *ipiv,
           lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zhpsv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, lapack_complex_double *ap, lapack_int *ipiv,
           lapack_complex_double *b, lapack_int ldb)

hpsvx — and now with fact 👑 plus afp, rcond, ferr, berr, work, rwork. suddenly we're at an entire party:

       lapack_int LAPACKE_chpsvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *ap,
           lapack_complex_float *afp, lapack_int *ipiv, const
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
           lapack_int ldx, float *rcond, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zhpsvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *ap,
           lapack_complex_double *afp, lapack_int *ipiv, const
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
           lapack_int ldx, double *rcond, double *ferr, double *berr,
           lapack_complex_double *work, double *rwork)

hptrd — d, e, tau core 🎀 that's the whole personality:

       lapack_int LAPACKE_chptrd_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float *ap, float *d, float *e,
           lapack_complex_float *tau)
       lapack_int LAPACKE_zhptrd_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double *ap, double *d, double *e,
           lapack_complex_double *tau)

hptrf — literally four args after the layout stuff 😌 ap and ipiv, that's it, she's low maintenance:

       lapack_int LAPACKE_chptrf_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float *ap, lapack_int *ipiv)
       lapack_int LAPACKE_zhptrf_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double *ap, lapack_int *ipiv)

hptri — the inverse one, and yes ipiv is const here 🦋:

       lapack_int LAPACKE_chptri_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float *ap, const lapack_int *ipiv,
           lapack_complex_float *work)
       lapack_int LAPACKE_zhptri_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double *ap, const lapack_int *ipiv,
           lapack_complex_double *work)

hptrs — solving time, nrhs in the building 💜:

       lapack_int LAPACKE_chptrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_float *ap, const lapack_int
           *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zhptrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_double *ap, const
           lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)

the hsein era begins 🌈 and bestie, look at the shapes here. Real version has wr and wi, plus vl/ldvl and vr/ldvr, plus mm, m, work, ifaill, ifailr — and select is a lapack_logical * (not const!) in <italic>s</italic> and <italic>d</italic>:

       lapack_int LAPACKE_shsein_work (int matrix_layout, char job, char
           eigsrc, char initv, lapack_logical *select, lapack_int n, const
           float *h, lapack_int ldh, float *wr, const float *wi, float *vl,
           lapack_int ldvl, float *vr, lapack_int ldvr, lapack_int mm,
           lapack_int *m, float *work, lapack_int *ifaill, lapack_int *ifailr)
       lapack_int LAPACKE_dhsein_work (int matrix_layout, char job, char
           eigsrc, char initv, lapack_logical *select, lapack_int n, const
           double *h, lapack_int ldh, double *wr, const double *wi, double *vl,
           lapack_int ldvl, double *vr, lapack_int ldvr, lapack_int mm,
           lapack_int *m, double *work, lapack_int *ifaill, lapack_int *ifailr)

Complex version: select becomes const, wr/wi become one w, and <pink>rwork</pink> gets slipped in before the ifails 👀:

       lapack_int LAPACKE_chsein_work (int matrix_layout, char job, char
           eigsrc, char initv, const lapack_logical *select, lapack_int n,
           const lapack_complex_float *h, lapack_int ldh, lapack_complex_float
           *w, lapack_complex_float *vl, lapack_int ldvl, lapack_complex_float
           *vr, lapack_int ldvr, lapack_int mm, lapack_int *m,
           lapack_complex_float *work, float *rwork, lapack_int *ifaill,
           lapack_int *ifailr)

and then — cliffhanger 😭 — zhsein_work walks in and the manpage literally cuts her off mid-signature:

       lapack_int LAPACKE_zhsein_work (int matrix_layout, char job, char
           eigsrc, char initv, const lapack_logical *select, lapack_int n,
no cap, that's where this part ends. she's gonna finish her sentence in the next chunk and we'll be right there waiting 🫶

...and we're literally mid-signature, bestie 😭 no cap, the previous declaration just keeps going. Tail end of it, verbatim, don't touch:

           const lapack_complex_double *h, lapack_int ldh,
           lapack_complex_double *w, lapack_complex_double *vl, lapack_int
           ldvl, lapack_complex_double *vr, lapack_int ldvr, lapack_int mm,
           lapack_int *m, lapack_complex_double *work, double *rwork,
           lapack_int *ifaill, lapack_int *ifailr)

Iconic. Moving on ✨


🌸 the hseqr quartet (the _work versions)

Four of them, one per precision, all carrying matrix_layout, job, compz, n, ilo, ihi, ldh, ldz, and a lwork at the end. The s/d ones hand you back wr and wi as real arrays; the c/z ones just hand you a single complex w. That's the whole personality difference, iykyk 🎀

       lapack_int LAPACKE_shseqr_work (int matrix_layout, char job, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, float *h, lapack_int
           ldh, float *wr, float *wi, float *z, lapack_int ldz, float *work,
           lapack_int lwork)
       lapack_int LAPACKE_dhseqr_work (int matrix_layout, char job, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, double *h, lapack_int
           ldh, double *wr, double *wi, double *z, lapack_int ldz, double
           *work, lapack_int lwork)
       lapack_int LAPACKE_chseqr_work (int matrix_layout, char job, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float
           *h, lapack_int ldh, lapack_complex_float *w, lapack_complex_float
           *z, lapack_int ldz, lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zhseqr_work (int matrix_layout, char job, char compz,
           lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double
           *h, lapack_int ldh, lapack_complex_double *w, lapack_complex_double
           *z, lapack_int ldz, lapack_complex_double *work, lapack_int lwork)

🦋 lacgv — the tiny duo

Only two of these, because conjugate-transpose of a vector is a complex-only kind of situation 💅 Just n, x, incx. Two parameters and a dream.

       lapack_int LAPACKE_clacgv_work (lapack_int n, lapack_complex_float *x,
           lapack_int incx)
       lapack_int LAPACKE_zlacgv_work (lapack_int n, lapack_complex_double *x,
           lapack_int incx)

🔥 lacn2 — the estimate crew

The whole kase/isave/est situation. Note the real ones (s, d) also take float *x / double *x and an isgn array, while the complex ones (c, z) skip isgn entirely and use complex x. Not me noticing the details 👀

       lapack_int LAPACKE_slacn2_work (lapack_int n, float *v, float *x,
           lapack_int *isgn, float *est, lapack_int *kase, lapack_int *isave)
       lapack_int LAPACKE_dlacn2_work (lapack_int n, double *v, double *x,
           lapack_int *isgn, double *est, lapack_int *kase, lapack_int *isave)
       lapack_int LAPACKE_clacn2_work (lapack_int n, lapack_complex_float *v,
           lapack_complex_float *x, float *est, lapack_int *kase, lapack_int
           *isave)
       lapack_int LAPACKE_zlacn2_work (lapack_int n, lapack_complex_double *v,
           lapack_complex_double *x, double *est, lapack_int *kase, lapack_int
           *isave)

💖 lacpy — copy era

Four flavours, all with matrix_layout, uplo, m, n, lda, ldb, source a marked const, destination b. Copy-paste but make it linear algebra ✨

       lapack_int LAPACKE_slacpy_work (int matrix_layout, char uplo, lapack_int
           m, lapack_int n, const float *a, lapack_int lda, float *b,
           lapack_int ldb)
       lapack_int LAPACKE_dlacpy_work (int matrix_layout, char uplo, lapack_int
           m, lapack_int n, const double *a, lapack_int lda, double *b,
           lapack_int ldb)
       lapack_int LAPACKE_clacpy_work (int matrix_layout, char uplo, lapack_int
           m, lapack_int n, const lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zlacpy_work (int matrix_layout, char uplo, lapack_int
           m, lapack_int n, const lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb)

And then lacp2, which is the real-to-complex glow-up — const float *a on the way in, lapack_complex_float *b on the way out. Only c and z exist here, obviously:

       lapack_int LAPACKE_clacp2_work (int matrix_layout, char uplo, lapack_int
           m, lapack_int n, const float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zlacp2_work (int matrix_layout, char uplo, lapack_int
           m, lapack_int n, const double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb)

🧚 the conversion girlies

zlag2c, slag2d, dlag2s, clag2z — four little transformers, each going from one precision to another. Watch the names, because they are not symmetrical: zlag2c goes complex-double → complex-float (hence the sa output and ldsa), slag2d goes float → double, dlag2s goes double → float, and clag2z goes complex-float → complex-double. Also zlag2c is the only one that lists ldsa before lda — slay for consistency bestie 💀

       lapack_int LAPACKE_zlag2c_work (int matrix_layout, lapack_int m,
           lapack_int n, const lapack_complex_double *a, lapack_int lda,
           lapack_complex_float *sa, lapack_int ldsa)
       lapack_int LAPACKE_slag2d_work (int matrix_layout, lapack_int m,
           lapack_int n, const float *sa, lapack_int ldsa, double *a,
           lapack_int lda)
       lapack_int LAPACKE_dlag2s_work (int matrix_layout, lapack_int m,
           lapack_int n, const double *a, lapack_int lda, float *sa, lapack_int
           ldsa)
       lapack_int LAPACKE_clag2z_work (int matrix_layout, lapack_int m,
           lapack_int n, const lapack_complex_float *sa, lapack_int ldsa,
           lapack_complex_double *a, lapack_int lda)

👑 lagge — the general band gang

m, n, kl, ku, plus a const diagonal d, the a output with lda, an iseed array, and a work buffer. All four precisions, every one of them, no skips. Periodt.

       lapack_int LAPACKE_slagge_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const float *d, float
           *a, lapack_int lda, lapack_int *iseed, float *work)
       lapack_int LAPACKE_dlagge_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const double *d, double
           *a, lapack_int lda, lapack_int *iseed, double *work)
       lapack_int LAPACKE_clagge_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const float *d,
           lapack_complex_float *a, lapack_int lda, lapack_int *iseed,
           lapack_complex_float *work)
       lapack_int LAPACKE_zlagge_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int kl, lapack_int ku, const double *d,
           lapack_complex_double *a, lapack_int lda, lapack_int *iseed,
           lapack_complex_double *work)

And the Hermitian one is complex-only, naturally — just c and z, with k instead of kl/ku and a const float *d / const double *d doing the diagonal thing 🫶

       lapack_int LAPACKE_claghe_work (int matrix_layout, lapack_int n,
           lapack_int k, const float *d, lapack_complex_float *a, lapack_int
           lda, lapack_int *iseed, lapack_complex_float *work)
       lapack_int LAPACKE_zlaghe_work (int matrix_layout, lapack_int n,
           lapack_int k, const double *d, lapack_complex_double *a, lapack_int
           lda, lapack_int *iseed, lapack_complex_double *work)

🌈 lagsy — symmetric edition

Same shape of deal, n, k, d, a, lda, iseed, work, but all four precisions show up this time (the c and z ones take a real d and a complex a, which is the whole point, love that for them).

       lapack_int LAPACKE_slagsy_work (int matrix_layout, lapack_int n,
           lapack_int k, const float *d, float *a, lapack_int lda, lapack_int
           *iseed, float *work)
       lapack_int LAPACKE_dlagsy_work (int matrix_layout, lapack_int n,
           lapack_int k, const double *d, double *a, lapack_int lda, lapack_int
           *iseed, double *work)
       lapack_int LAPACKE_clagsy_work (int matrix_layout, lapack_int n,
           lapack_int k, const float *d, lapack_complex_float *a, lapack_int
           lda, lapack_int *iseed, lapack_complex_float *work)
       lapack_int LAPACKE_zlagsy_work (int matrix_layout, lapack_int n,
           lapack_int k, const double *d, lapack_complex_double *a, lapack_int
           lda, lapack_int *iseed, lapack_complex_double *work)

🎀 lapmr and lapmt — the permutation twins

Both take a lapack_logical forwrd (yes that's how it's spelled, keep it, do not "fix" it 💅), m, n, x, ldx, and an lapack_int *k. Both come in all four precisions. They're literally twins, so here they are, matching outfits and everything:

       lapack_int LAPACKE_slapmr_work (int matrix_layout, lapack_logical
           forwrd, lapack_int m, lapack_int n, float *x, lapack_int ldx,
           lapack_int *k)
       lapack_int LAPACKE_dlapmr_work (int matrix_layout, lapack_logical
           forwrd, lapack_int m, lapack_int n, double *x, lapack_int ldx,
           lapack_int *k)
       lapack_int LAPACKE_clapmr_work (int matrix_layout, lapack_logical
           forwrd, lapack_int m, lapack_int n, lapack_complex_float *x,
           lapack_int ldx, lapack_int *k)
       lapack_int LAPACKE_zlapmr_work (int matrix_layout, lapack_logical
           forwrd, lapack_int m, lapack_int n, lapack_complex_double *x,
           lapack_int ldx, lapack_int *k)
       lapack_int LAPACKE_slapmt_work (int matrix_layout, lapack_logical
           forwrd, lapack_int m, lapack_int n, float *x, lapack_int ldx,
           lapack_int *k)
       lapack_int LAPACKE_dlapmt_work (int matrix_layout, lapack_logical
           forwrd, lapack_int m, lapack_int n, double *x, lapack_int ldx,
           lapack_int *k)
       lapack_int LAPACKE_clapmt_work (int matrix_layout, lapack_logical
           forwrd, lapack_int m, lapack_int n, lapack_complex_float *x,
           lapack_int ldx, lapack_int *k)
       lapack_int LAPACKE_zlapmt_work (int matrix_layout, lapack_logical
           forwrd, lapack_int m, lapack_int n, lapack_complex_double *x,
           lapack_int ldx, lapack_int *k)

⭐ the little rotation guys

lartgp gives you cs, sn, r out of f and g — real only, s and d. lartgs takes x, y, sigma and gives cs and sn — also real only. Short, sweet, no matrix_layout in sight, which honestly? A vibe.

       lapack_int LAPACKE_slartgp_work (float f, float g, float *cs, float *sn,
           float *r)
       lapack_int LAPACKE_dlartgp_work (double f, double g, double *cs, double
           *sn, double *r)
       lapack_int LAPACKE_slartgs_work (float x, float y, float sigma, float
           *cs, float *sn)
       lapack_int LAPACKE_dlartgs_work (double x, double y, double sigma,
           double *cs, double *sn)

💜 lapy2 / lapy3 — the return-value girlies

Heads up: these two literally return a float or a double directly — no error code, no lapack_int, they just hand you the number. lapy2 takes x, y; lapy3 takes x, y, z. Real precisions only. Main character energy honestly 👑

       float LAPACKE_slapy2_work (float x, float y)
       double LAPACKE_dlapy2_work (double x, double y)
       float LAPACKE_slapy3_work (float x, float y, float z)
       double LAPACKE_dlapy3_work (double x, double y, double z)

Same deal for lamch, except it also takes a char cmach and still returns the value straight up:

       float LAPACKE_slamch_work (char cmach)
       double LAPACKE_dlamch_work (char cmach)

🔥 lange — norms, but make it general

matrix_layout, char norm, m, n, const matrix a, lda, and a work buffer. All four precisions. Also note the return type flips: float for s and c, double for d and z. Yes, clange returns a float — that's what it says, don't come for me 🙈

       float LAPACKE_slange_work (int matrix_layout, char norm, lapack_int m,
           lapack_int n, const float *a, lapack_int lda, float *work)
       double LAPACKE_dlange_work (int matrix_layout, char norm, lapack_int m,
           lapack_int n, const double *a, lapack_int lda, double *work)
       float LAPACKE_clange_work (int matrix_layout, char norm, lapack_int m,
           lapack_int n, const lapack_complex_float *a, lapack_int lda, float
           *work)
       double LAPACKE_zlange_work (int matrix_layout, char norm, lapack_int m,
           lapack_int n, const lapack_complex_double *a, lapack_int lda, double
           *work)

Hermitian norms drop the m and add a char uplo, because square and honest about it 🦋

       float LAPACKE_clanhe_work (int matrix_layout, char norm, char uplo,
           lapack_int n, const lapack_complex_float *a, lapack_int lda, float
           *work)
       double LAPACKE_zlanhe_work (int matrix_layout, char norm, char uplo,
           lapack_int n, const lapack_complex_double *a, lapack_int lda, double
           *work)

🍓 lacrm / larcm — the mixed-precision power couple

lacrm: complex a times real b, into complex c. larcm: real a times complex b, into complex c. Both have m, n, lda, ldb, ldc and a work array, and both exist only as c and z 🫶

       lapack_int LAPACKE_clacrm_work (int matrix_layout, lapack_int m,
           lapack_int n, const lapack_complex_float *a, lapack_int lda, const
           float *b, lapack_int ldb, lapack_complex_float *c, lapack_int ldc,
           float *work)
       lapack_int LAPACKE_zlacrm_work (int matrix_layout, lapack_int m,
           lapack_int n, const lapack_complex_double *a, lapack_int lda, const
           double *b, lapack_int ldb, lapack_complex_double *c, lapack_int ldc,
           double *work)
       lapack_int LAPACKE_clarcm_work (int matrix_layout, lapack_int m,
           lapack_int n, const float *a, lapack_int lda, const
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *c,
           lapack_int ldc, float *work)
       lapack_int LAPACKE_zlarcm_work (int matrix_layout, lapack_int m,
           lapack_int n, const double *a, lapack_int lda, const
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *c,
           lapack_int ldc, double *work)

🌸 lansy — symmetric norms

norm, uplo, n, a, lda, work, four precisions, returning float for s/c and double for d/z. Consistent queen.

       float LAPACKE_slansy_work (int matrix_layout, char norm, char uplo,
           lapack_int n, const float *a, lapack_int lda, float *work)
       double LAPACKE_dlansy_work (int matrix_layout, char norm, char uplo,
           lapack_int n, const double *a, lapack_int lda, double *work)
       float LAPACKE_clansy_work (int matrix_layout, char norm, char uplo,
           lapack_int n, const lapack_complex_float *a, lapack_int lda, float
           *work)
       double LAPACKE_zlansy_work (int matrix_layout, char norm, char uplo,
           lapack_int n, const lapack_complex_double *a, lapack_int lda, double
           *work)

🧚 lantr — triangular norms, and we're mid-sentence again

Adds a char diag on top of norm/uplo, and unlike lansy these take m and n. Four precisions, same return-type pattern, and then — of course — the last one is cut off mid-signature because the page keeps going. Below is exactly what's on the page, no guessing at the rest 👑💅

       float LAPACKE_slantr_work (int matrix_layout, char norm, char uplo, char
           diag, lapack_int m, lapack_int n, const float *a, lapack_int lda,
           float *work)
       double LAPACKE_dlantr_work (int matrix_layout, char norm, char uplo,
           char diag, lapack_int m, lapack_int n, const double *a, lapack_int
           lda, double *work)
       float LAPACKE_clantr_work (int matrix_layout, char norm, char uplo, char
           diag, lapack_int m, lapack_int n, const lapack_complex_float *a,
           lapack_int lda, float *work)
       double LAPACKE_zlantr_work (int matrix_layout, char norm, char uplo,
           char diag, lapack_int m, lapack_int n, const lapack_complex_double

...and that's where we cliffhang 🫠 more coming.

   *a, lapack_int lda, double *work)

...and that's the tail end of the previous call, bestie, no cap — we're mid-synopsis and we're staying mid-synopsis 💅


🦋 the larfb squad

Four of them, one per precision flavor (s, d, c, z — you know the drill by now 🌸). Blocked reflector appliers, all in their _work era:

lapack_int LAPACKE_slarfb_work (int matrix_layout, char side, char
    trans, char direct, char storev, lapack_int m, lapack_int n,
    lapack_int k, const float *v, lapack_int ldv, const float *t,
    lapack_int ldt, float *c, lapack_int ldc, float *work, lapack_int
    ldwork)
lapack_int LAPACKE_dlarfb_work (int matrix_layout, char side, char
    trans, char direct, char storev, lapack_int m, lapack_int n,
    lapack_int k, const double *v, lapack_int ldv, const double *t,
    lapack_int ldt, double *c, lapack_int ldc, double *work, lapack_int
    ldwork)
lapack_int LAPACKE_clarfb_work (int matrix_layout, char side, char
    trans, char direct, char storev, lapack_int m, lapack_int n,
    lapack_int k, const lapack_complex_float *v, lapack_int ldv, const
    lapack_complex_float *t, lapack_int ldt, lapack_complex_float *c,
    lapack_int ldc, lapack_complex_float *work, lapack_int ldwork)
lapack_int LAPACKE_zlarfb_work (int matrix_layout, char side, char
    trans, char direct, char storev, lapack_int m, lapack_int n,
    lapack_int k, const lapack_complex_double *v, lapack_int ldv, const
    lapack_complex_double *t, lapack_int ldt, lapack_complex_double *c,
    lapack_int ldc, lapack_complex_double *work, lapack_int ldwork)

Notice how side, trans, direct and storev are all just chillin' there as chars — that's four whole vibe checks before you even get to m 🫶


✨ larfg — no matrix_layout here, she's built different

Iconic behavior honestly. These four skip the layout argument entirely:

lapack_int LAPACKE_slarfg_work (lapack_int n, float *alpha, float *x,
    lapack_int incx, float *tau)
lapack_int LAPACKE_dlarfg_work (lapack_int n, double *alpha, double *x,
    lapack_int incx, double *tau)
lapack_int LAPACKE_clarfg_work (lapack_int n, lapack_complex_float
    *alpha, lapack_complex_float *x, lapack_int incx,
    lapack_complex_float *tau)
lapack_int LAPACKE_zlarfg_work (lapack_int n, lapack_complex_double
    *alpha, lapack_complex_double *x, lapack_int incx,
    lapack_complex_double *tau)

alpha and x and tau, oh my 💖


🎀 larft — the t generation girlies

matrix_layout, direct, storev, n, k, v, ldv, tau, t, ldt. That's the whole guest list:

lapack_int LAPACKE_slarft_work (int matrix_layout, char direct, char
    storev, lapack_int n, lapack_int k, const float *v, lapack_int ldv,
    const float *tau, float *t, lapack_int ldt)
lapack_int LAPACKE_dlarft_work (int matrix_layout, char direct, char
    storev, lapack_int n, lapack_int k, const double *v, lapack_int ldv,
    const double *tau, double *t, lapack_int ldt)
lapack_int LAPACKE_clarft_work (int matrix_layout, char direct, char
    storev, lapack_int n, lapack_int k, const lapack_complex_float *v,
    lapack_int ldv, const lapack_complex_float *tau,
    lapack_complex_float *t, lapack_int ldt)
lapack_int LAPACKE_zlarft_work (int matrix_layout, char direct, char
    storev, lapack_int n, lapack_int k, const lapack_complex_double *v,
    lapack_int ldv, const lapack_complex_double *tau,
    lapack_complex_double *t, lapack_int ldt)

🔥 larfx — same energy, but tau is a scalar now

Not a pointer, a whole scalar. She said "I'll be the value myself" 💀

lapack_int LAPACKE_slarfx_work (int matrix_layout, char side, lapack_int
    m, lapack_int n, const float *v, float tau, float *c, lapack_int
    ldc, float *work)
lapack_int LAPACKE_dlarfx_work (int matrix_layout, char side, lapack_int
    m, lapack_int n, const double *v, double tau, double *c, lapack_int
    ldc, double *work)
lapack_int LAPACKE_clarfx_work (int matrix_layout, char side, lapack_int
    m, lapack_int n, const lapack_complex_float *v, lapack_complex_float
    tau, lapack_complex_float *c, lapack_int ldc, lapack_complex_float
    *work)
lapack_int LAPACKE_zlarfx_work (int matrix_layout, char side, lapack_int
    m, lapack_int n, const lapack_complex_double *v,
    lapack_complex_double tau, lapack_complex_double *c, lapack_int ldc,
    lapack_complex_double *work)

🌈 larnv — random numbers, no matrix_layout in sight

idist, iseed, n, x. Seeding is her whole personality 🍓

lapack_int LAPACKE_slarnv_work (lapack_int idist, lapack_int *iseed,
    lapack_int n, float *x)
lapack_int LAPACKE_dlarnv_work (lapack_int idist, lapack_int *iseed,
    lapack_int n, double *x)
lapack_int LAPACKE_clarnv_work (lapack_int idist, lapack_int *iseed,
    lapack_int n, lapack_complex_float *x)
lapack_int LAPACKE_zlarnv_work (lapack_int idist, lapack_int *iseed,
    lapack_int n, lapack_complex_double *x)

💜 lascl — the scale-it-up crew

Heads up bestie: the complex ones take float cfrom, float cto for c and double cfrom, double cto for z — that's not a typo, I promise, I copied it exactly 🙈

lapack_int LAPACKE_slascl_work (int matrix_layout, char type, lapack_int
    kl, lapack_int ku, float cfrom, float cto, lapack_int m, lapack_int
    n, float *a, lapack_int lda)
lapack_int LAPACKE_dlascl_work (int matrix_layout, char type, lapack_int
    kl, lapack_int ku, double cfrom, double cto, lapack_int m,
    lapack_int n, double *a, lapack_int lda)
lapack_int LAPACKE_clascl_work (int matrix_layout, char type, lapack_int
    kl, lapack_int ku, float cfrom, float cto, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda)
lapack_int LAPACKE_zlascl_work (int matrix_layout, char type, lapack_int
    kl, lapack_int ku, double cfrom, double cto, lapack_int m,
    lapack_int n, lapack_complex_double *a, lapack_int lda)

⭐ laset — the alpha/beta four

uplo, m, n, alpha, beta, a, lda. Short, sweet, slays:

lapack_int LAPACKE_slaset_work (int matrix_layout, char uplo, lapack_int
    m, lapack_int n, float alpha, float beta, float *a, lapack_int lda)
lapack_int LAPACKE_dlaset_work (int matrix_layout, char uplo, lapack_int
    m, lapack_int n, double alpha, double beta, double *a, lapack_int
    lda)
lapack_int LAPACKE_claset_work (int matrix_layout, char uplo, lapack_int
    m, lapack_int n, lapack_complex_float alpha, lapack_complex_float
    beta, lapack_complex_float *a, lapack_int lda)
lapack_int LAPACKE_zlaset_work (int matrix_layout, char uplo, lapack_int
    m, lapack_int n, lapack_complex_double alpha, lapack_complex_double
    beta, lapack_complex_double *a, lapack_int lda)

Only two of these exist without complex — lasrt is real-only and lowkey doesn't care about your matrix_layout 😌

lapack_int LAPACKE_slasrt_work (char id, lapack_int n, float *d)
lapack_int LAPACKE_dlasrt_work (char id, lapack_int n, double *d)

🧚 lassq — scale and sumsq, both pointers

lapack_int LAPACKE_slassq_work (lapack_int n, float *x, lapack_int incx,
    float *scale, float *sumsq)
lapack_int LAPACKE_dlassq_work (lapack_int n, double *x, lapack_int
    incx, double *scale, double *sumsq)
lapack_int LAPACKE_classq_work (lapack_int n, lapack_complex_float *x,
    lapack_int incx, float *scale, float *sumsq)
lapack_int LAPACKE_zlassq_work (lapack_int n, lapack_complex_double *x,
    lapack_int incx, double *scale, double *sumsq)

👑 laswp — pivoting era

Now this one's got k1, k2, ipiv and incx all up in there:

lapack_int LAPACKE_slaswp_work (int matrix_layout, lapack_int n, float
    *a, lapack_int lda, lapack_int k1, lapack_int k2, const lapack_int
    *ipiv, lapack_int incx)
lapack_int LAPACKE_dlaswp_work (int matrix_layout, lapack_int n, double
    *a, lapack_int lda, lapack_int k1, lapack_int k2, const lapack_int
    *ipiv, lapack_int incx)
lapack_int LAPACKE_claswp_work (int matrix_layout, lapack_int n,
    lapack_complex_float *a, lapack_int lda, lapack_int k1, lapack_int
    k2, const lapack_int *ipiv, lapack_int incx)
lapack_int LAPACKE_zlaswp_work (int matrix_layout, lapack_int n,
    lapack_complex_double *a, lapack_int lda, lapack_int k1, lapack_int
    k2, const lapack_int *ipiv, lapack_int incx)

🌸 latms — the long one, she has everything

dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack... she ate and left no crumbs 🎀 Again, baby: clatms and zlatms take float *d / double *d and float cond / double cond exactly as written — copy-paste faithfully, bestie:

lapack_int LAPACKE_slatms_work (int matrix_layout, lapack_int m,
    lapack_int n, char dist, lapack_int *iseed, char sym, float *d,
    lapack_int mode, float cond, float dmax, lapack_int kl, lapack_int
    ku, char pack, float *a, lapack_int lda, float *work)
lapack_int LAPACKE_dlatms_work (int matrix_layout, lapack_int m,
    lapack_int n, char dist, lapack_int *iseed, char sym, double *d,
    lapack_int mode, double cond, double dmax, lapack_int kl, lapack_int
    ku, char pack, double *a, lapack_int lda, double *work)
lapack_int LAPACKE_clatms_work (int matrix_layout, lapack_int m,
    lapack_int n, char dist, lapack_int *iseed, char sym, float *d,
    lapack_int mode, float cond, float dmax, lapack_int kl, lapack_int
    ku, char pack, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *work)
lapack_int LAPACKE_zlatms_work (int matrix_layout, lapack_int m,
    lapack_int n, char dist, lapack_int *iseed, char sym, double *d,
    lapack_int mode, double cond, double dmax, lapack_int kl, lapack_int
    ku, char pack, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *work)

💅 lauum — triangular, uplo and done

lapack_int LAPACKE_slauum_work (int matrix_layout, char uplo, lapack_int
    n, float *a, lapack_int lda)
lapack_int LAPACKE_dlauum_work (int matrix_layout, char uplo, lapack_int
    n, double *a, lapack_int lda)
lapack_int LAPACKE_clauum_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *a, lapack_int lda)
lapack_int LAPACKE_zlauum_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *a, lapack_int lda)

🫶 opgtr / opmtr — packed friends

opgtr is the short one (ap, tau, q, ldq, work), and note: only s and d versions exist here, no complex girlies 😭

lapack_int LAPACKE_sopgtr_work (int matrix_layout, char uplo, lapack_int
    n, const float *ap, const float *tau, float *q, lapack_int ldq,
    float *work)
lapack_int LAPACKE_dopgtr_work (int matrix_layout, char uplo, lapack_int
    n, const double *ap, const double *tau, double *q, lapack_int ldq,
    double *work)

opmtr adds side, trans, m, n, c, ldc — a whole glow-up:

lapack_int LAPACKE_sopmtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const float *ap, const float
    *tau, float *c, lapack_int ldc, float *work)
lapack_int LAPACKE_dopmtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const double *ap, const
    double *tau, double *c, lapack_int ldc, double *work)

⭐ the org family — generators, all s/d, all with lwork

Starting with orgbr and her vect era:

lapack_int LAPACKE_sorgbr_work (int matrix_layout, char vect, lapack_int
    m, lapack_int n, lapack_int k, float *a, lapack_int lda, const float
    *tau, float *work, lapack_int lwork)
lapack_int LAPACKE_dorgbr_work (int matrix_layout, char vect, lapack_int
    m, lapack_int n, lapack_int k, double *a, lapack_int lda, const
    double *tau, double *work, lapack_int lwork)

orghr with her iconic ilo/ihi duo:

lapack_int LAPACKE_sorghr_work (int matrix_layout, lapack_int n,
    lapack_int ilo, lapack_int ihi, float *a, lapack_int lda, const
    float *tau, float *work, lapack_int lwork)
lapack_int LAPACKE_dorghr_work (int matrix_layout, lapack_int n,
    lapack_int ilo, lapack_int ihi, double *a, lapack_int lda, const
    double *tau, double *work, lapack_int lwork)

orglq, orgql, orgqr — the triple threat, same shape, different letters:

lapack_int LAPACKE_sorglq_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int k, float *a, lapack_int lda, const float
    *tau, float *work, lapack_int lwork)
lapack_int LAPACKE_dorglq_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int k, double *a, lapack_int lda, const double
    *tau, double *work, lapack_int lwork)
lapack_int LAPACKE_sorgql_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int k, float *a, lapack_int lda, const float
    *tau, float *work, lapack_int lwork)
lapack_int LAPACKE_dorgql_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int k, double *a, lapack_int lda, const double
    *tau, double *work, lapack_int lwork)
lapack_int LAPACKE_sorgqr_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int k, float *a, lapack_int lda, const float
    *tau, float *work, lapack_int lwork)
lapack_int LAPACKE_dorgqr_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int k, double *a, lapack_int lda, const double
    *tau, double *work, lapack_int lwork)

okay that's this chunk, we're literally still going, don't touch that dial 💖

okay so we are still in the prototype section and honestly bestie, it's giving "the compiler's group chat". every single one of these is a _work variant, which means you're driving stick: you hand over the scratch space, you own the consequences 💅

first up, the org girlies — they take your tau and give you back the goods, with m, n, k along for the ride:

lapack_int LAPACKE_sorgrq_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int k, float *a, lapack_int lda, const float
    *tau, float *work, lapack_int lwork)
lapack_int LAPACKE_dorgrq_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int k, double *a, lapack_int lda, const double
    *tau, double *work, lapack_int lwork)
lapack_int LAPACKE_sorgtr_work (int matrix_layout, char uplo, lapack_int
    n, float *a, lapack_int lda, const float *tau, float *work,
    lapack_int lwork)
lapack_int LAPACKE_dorgtr_work (int matrix_layout, char uplo, lapack_int
    n, double *a, lapack_int lda, const double *tau, double *work,
    lapack_int lwork)

see how orgtr swapped m/k for uplo? she's a triangle girlie, she doesn't need the whole grid ✨


then the orm squad rolls in — same energy but they're multiplicating into a c matrix and taking side/trans attitude along the way. ormbr is the one with BOTH vect and side, main character behaviour fr fr 👑

lapack_int LAPACKE_sormbr_work (int matrix_layout, char vect, char side,
    char trans, lapack_int m, lapack_int n, lapack_int k, const float
    *a, lapack_int lda, const float *tau, float *c, lapack_int ldc,
    float *work, lapack_int lwork)
lapack_int LAPACKE_dormbr_work (int matrix_layout, char vect, char side,
    char trans, lapack_int m, lapack_int n, lapack_int k, const double
    *a, lapack_int lda, const double *tau, double *c, lapack_int ldc,
    double *work, lapack_int lwork)
lapack_int LAPACKE_sormhr_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi,
    const float *a, lapack_int lda, const float *tau, float *c,
    lapack_int ldc, float *work, lapack_int lwork)
lapack_int LAPACKE_dormhr_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi,
    const double *a, lapack_int lda, const double *tau, double *c,
    lapack_int ldc, double *work, lapack_int lwork)

ilo/ihi in ormhr? yeah she's the holdout — she only works on the range you point at, no cap 🎯

and here's the lq/ql/qr trio, they're basically triplets separated at birth 🌸

lapack_int LAPACKE_sormlq_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const float *a,
    lapack_int lda, const float *tau, float *c, lapack_int ldc, float
    *work, lapack_int lwork)
lapack_int LAPACKE_dormlq_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const double *a,
    lapack_int lda, const double *tau, double *c, lapack_int ldc, double
    *work, lapack_int lwork)
lapack_int LAPACKE_sormql_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const float *a,
    lapack_int lda, const float *tau, float *c, lapack_int ldc, float
    *work, lapack_int lwork)
lapack_int LAPACKE_dormql_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const double *a,
    lapack_int lda, const double *tau, double *c, lapack_int ldc, double
    *work, lapack_int lwork)
lapack_int LAPACKE_sormqr_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const float *a,
    lapack_int lda, const float *tau, float *c, lapack_int ldc, float
    *work, lapack_int lwork)
lapack_int LAPACKE_dormqr_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const double *a,
    lapack_int lda, const double *tau, double *c, lapack_int ldc, double
    *work, lapack_int lwork)
lapack_int LAPACKE_sormrq_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const float *a,
    lapack_int lda, const float *tau, float *c, lapack_int ldc, float
    *work, lapack_int lwork)
lapack_int LAPACKE_dormrq_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const double *a,
    lapack_int lda, const double *tau, double *c, lapack_int ldc, double
    *work, lapack_int lwork)

and then ormrz shows up with an extra lapack_int l because she simply has more going on than everyone else 💀 notice she's built different — one more argument than her sisters, and that's iconic:

lapack_int LAPACKE_sormrz_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l, const
    float *a, lapack_int lda, const float *tau, float *c, lapack_int
    ldc, float *work, lapack_int lwork)
lapack_int LAPACKE_dormrz_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l, const
    double *a, lapack_int lda, const double *tau, double *c, lapack_int
    ldc, double *work, lapack_int lwork)

last of the orm fam — ormtr, the triangle one. she takes uplo instead of all those m/k numbers, so if you see uplo in an orm call you already know 🦋

lapack_int LAPACKE_sormtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const float *a, lapack_int
    lda, const float *tau, float *c, lapack_int ldc, float *work,
    lapack_int lwork)
lapack_int LAPACKE_dormtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const double *a, lapack_int
    lda, const double *tau, double *c, lapack_int ldc, double *work,
    lapack_int lwork)

okay NEW FAMILY, we love a clean break. the pb crew — banded symmetric positive-definite everything. four of them per function because of course: s = float, d = double, and then c/z go full complex with lapack_complex_float / lapack_complex_double AND they ditch iwork for rwork. the way the complex girlies need their own real workspace… we respect it 🫶

pbcon — condition number vibes, note the anorm going in and rcond coming out, and the iwork on the real ones:

lapack_int LAPACKE_spbcon_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, const float *ab, lapack_int ldab, float anorm,
    float *rcond, float *work, lapack_int *iwork)
lapack_int LAPACKE_dpbcon_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, const double *ab, lapack_int ldab, double anorm,
    double *rcond, double *work, lapack_int *iwork)
lapack_int LAPACKE_cpbcon_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, const lapack_complex_float *ab, lapack_int ldab,
    float anorm, float *rcond, lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zpbcon_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, const lapack_complex_double *ab, lapack_int ldab,
    double anorm, double *rcond, lapack_complex_double *work, double
    *rwork)

pbequ — the equilibration cutie. s, scond, amax out the door, no workspace at all, she travels light ✨

lapack_int LAPACKE_spbequ_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, const float *ab, lapack_int ldab, float *s, float
    *scond, float *amax)
lapack_int LAPACKE_dpbequ_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, const double *ab, lapack_int ldab, double *s,
    double *scond, double *amax)
lapack_int LAPACKE_cpbequ_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, const lapack_complex_float *ab, lapack_int ldab,
    float *s, float *scond, float *amax)
lapack_int LAPACKE_zpbequ_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, const lapack_complex_double *ab, lapack_int ldab,
    double *s, double *scond, double *amax)

pbrfs — refinement hours, she wants the ORIGINAL ab AND the FACTORED afb, plus b/x and the two error outputs ferr/berr. look at all those ld* values, she's thorough 💅

lapack_int LAPACKE_spbrfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, lapack_int nrhs, const float *ab, lapack_int ldab,
    const float *afb, lapack_int ldafb, const float *b, lapack_int ldb,
    float *x, lapack_int ldx, float *ferr, float *berr, float *work,
    lapack_int *iwork)
lapack_int LAPACKE_dpbrfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, lapack_int nrhs, const double *ab, lapack_int
    ldab, const double *afb, lapack_int ldafb, const double *b,
    lapack_int ldb, double *x, lapack_int ldx, double *ferr, double
    *berr, double *work, lapack_int *iwork)
lapack_int LAPACKE_cpbrfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, lapack_int nrhs, const lapack_complex_float *ab,
    lapack_int ldab, const lapack_complex_float *afb, lapack_int ldafb,
    const lapack_complex_float *b, lapack_int ldb, lapack_complex_float
    *x, lapack_int ldx, float *ferr, float *berr, lapack_complex_float
    *work, float *rwork)
lapack_int LAPACKE_zpbrfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, lapack_int nrhs, const lapack_complex_double *ab,
    lapack_int ldab, const lapack_complex_double *afb, lapack_int ldafb,
    const lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *x, lapack_int ldx, double *ferr, double
    *berr, lapack_complex_double *work, double *rwork)

pbstf — tiny queen, literally the shortest signature here. no workspace, no work/lwork, just uplo, n, kb, bb, ldbb. she said "I don't need an entourage" 🎀

lapack_int LAPACKE_spbstf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kb, float *bb, lapack_int ldbb)
lapack_int LAPACKE_dpbstf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kb, double *bb, lapack_int ldbb)
lapack_int LAPACKE_cpbstf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kb, lapack_complex_float *bb, lapack_int ldbb)
lapack_int LAPACKE_zpbstf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kb, lapack_complex_double *bb, lapack_int ldbb)

pbsv — the straight-up solver, also short and sweet. ab + b in, and yes both are non-const because she's writing back into them, no shame 🙈

lapack_int LAPACKE_spbsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, lapack_int nrhs, float *ab, lapack_int ldab, float
    *b, lapack_int ldb)
lapack_int LAPACKE_dpbsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, lapack_int nrhs, double *ab, lapack_int ldab,
    double *b, lapack_int ldb)
lapack_int LAPACKE_cpbsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, lapack_int nrhs, lapack_complex_float *ab,
    lapack_int ldab, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zpbsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, lapack_int nrhs, lapack_complex_double *ab,
    lapack_int ldab, lapack_complex_double *b, lapack_int ldb)

pbsvx — the deluxe edition, the one that says "expert" in the name and means it. fact, equed, s, rcond, ferr, berr, two workspaces… she has a whole beauty routine and you're gonna sit there and let her cook 👑

lapack_int LAPACKE_spbsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, float *ab, lapack_int
    ldab, float *afb, lapack_int ldafb, char *equed, float *s, float *b,
    lapack_int ldb, float *x, lapack_int ldx, float *rcond, float *ferr,
    float *berr, float *work, lapack_int *iwork)
lapack_int LAPACKE_dpbsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, double *ab, lapack_int
    ldab, double *afb, lapack_int ldafb, char *equed, double *s, double
    *b, lapack_int ldb, double *x, lapack_int ldx, double *rcond, double
    *ferr, double *berr, double *work, lapack_int *iwork)
lapack_int LAPACKE_cpbsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, lapack_complex_float
    *ab, lapack_int ldab, lapack_complex_float *afb, lapack_int ldafb,
    char *equed, float *s, lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *x, lapack_int ldx, float *rcond, float *ferr,
    float *berr, lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zpbsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, lapack_complex_double
    *ab, lapack_int ldab, lapack_complex_double *afb, lapack_int ldafb,
    char *equed, double *s, lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *x, lapack_int ldx, double *rcond, double
    *ferr, double *berr, lapack_complex_double *work, double *rwork)

and finally (for this part anyway 😌) pbtrf — the factorization core, minimal, no workspace params, just uplo, n, kd, ab, ldab. she's the reason the rest of them can even function, lowkey the backbone of the whole pb friend group:

lapack_int LAPACKE_spbtrf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, float *ab, lapack_int ldab)
lapack_int LAPACKE_dpbtrf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, double *ab, lapack_int ldab)
lapack_int LAPACKE_cpbtrf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int kd, lapack_complex_float *ab, lapack_int ldab)
lapack_int LAPACKE_zpbtrf_work (int matrix_layout, char uplo, lapack_int

...and we're picking up mid-signature, because of course we are 💀 the tail end of that last one is literally:

           n, lapack_int kd, lapack_complex_double *ab, lapack_int ldab)

cool cool cool, moving on 🫶

🦋 the pbtrs girlies (banded, positive definite, and ready to solve)

Same argument shape for all four, only the element type switches up — ab/ldab for the banded storage, b/ldb for the right-hand side, uplo to pick your triangle, n and kd doing their thing:

       lapack_int LAPACKE_spbtrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int kd, lapack_int nrhs, const float *ab, lapack_int ldab,
           float *b, lapack_int ldb)
       lapack_int LAPACKE_dpbtrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int kd, lapack_int nrhs, const double *ab, lapack_int
           ldab, double *b, lapack_int ldb)
       lapack_int LAPACKE_cpbtrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int kd, lapack_int nrhs, const lapack_complex_float *ab,
           lapack_int ldab, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zpbtrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int kd, lapack_int nrhs, const lapack_complex_double *ab,
           lapack_int ldab, lapack_complex_double *b, lapack_int ldb)

🎀 the pftrf era — packed, transposed-or-not, iconic

notice how a is not const here? that's because these babies write back into it, no cap ✨ and you get transr plus uplo, two chars of pure chaos:

       lapack_int LAPACKE_spftrf_work (int matrix_layout, char transr, char
           uplo, lapack_int n, float *a)
       lapack_int LAPACKE_dpftrf_work (int matrix_layout, char transr, char
           uplo, lapack_int n, double *a)
       lapack_int LAPACKE_cpftrf_work (int matrix_layout, char transr, char
           uplo, lapack_int n, lapack_complex_float *a)
       lapack_int LAPACKE_zpftrf_work (int matrix_layout, char transr, char
           uplo, lapack_int n, lapack_complex_double *a)

🧚 the pftri squad — literally the same list of args, different name

fr fr identical argument list to the pftrf crew above, only the function name changed. keep the receipts:

       lapack_int LAPACKE_spftri_work (int matrix_layout, char transr, char
           uplo, lapack_int n, float *a)
       lapack_int LAPACKE_dpftri_work (int matrix_layout, char transr, char
           uplo, lapack_int n, double *a)
       lapack_int LAPACKE_cpftri_work (int matrix_layout, char transr, char
           uplo, lapack_int n, lapack_complex_float *a)
       lapack_int LAPACKE_zpftri_work (int matrix_layout, char transr, char
           uplo, lapack_int n, lapack_complex_double *a)

💜 pftrs — now with a right-hand side bestie

transr, uplo, n, nrhs, const a, b, ldb. that's the whole vibe:

       lapack_int LAPACKE_spftrs_work (int matrix_layout, char transr, char
           uplo, lapack_int n, lapack_int nrhs, const float *a, float *b,
           lapack_int ldb)
       lapack_int LAPACKE_dpftrs_work (int matrix_layout, char transr, char
           uplo, lapack_int n, lapack_int nrhs, const double *a, double *b,
           lapack_int ldb)
       lapack_int LAPACKE_cpftrs_work (int matrix_layout, char transr, char
           uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zpftrs_work (int matrix_layout, char transr, char
           uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_complex_double *b, lapack_int ldb)

🌸 pocon — condition number hours 👑

okay so anorm in, rcond out, and look — work and iwork at the end, except for the complex ones where it's work (complex) + rwork (real). the way the real/complex split switches up the trailing args is such a mood:

       lapack_int LAPACKE_spocon_work (int matrix_layout, char uplo, lapack_int
           n, const float *a, lapack_int lda, float anorm, float *rcond, float
           *work, lapack_int *iwork)
       lapack_int LAPACKE_dpocon_work (int matrix_layout, char uplo, lapack_int
           n, const double *a, lapack_int lda, double anorm, double *rcond,
           double *work, lapack_int *iwork)
       lapack_int LAPACKE_cpocon_work (int matrix_layout, char uplo, lapack_int
           n, const lapack_complex_float *a, lapack_int lda, float anorm, float
           *rcond, lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zpocon_work (int matrix_layout, char uplo, lapack_int
           n, const lapack_complex_double *a, lapack_int lda, double anorm,
           double *rcond, lapack_complex_double *work, double *rwork)

⭐ poequ / poequb — the equilibration twins

no uplo here, bestie, we're not doing triangles today 🙈 just n, a, lda, then the triple threat s, scond, amax:

       lapack_int LAPACKE_spoequ_work (int matrix_layout, lapack_int n, const
           float *a, lapack_int lda, float *s, float *scond, float *amax)
       lapack_int LAPACKE_dpoequ_work (int matrix_layout, lapack_int n, const
           double *a, lapack_int lda, double *s, double *scond, double *amax)
       lapack_int LAPACKE_cpoequ_work (int matrix_layout, lapack_int n, const
           lapack_complex_float *a, lapack_int lda, float *s, float *scond,
           float *amax)
       lapack_int LAPACKE_zpoequ_work (int matrix_layout, lapack_int n, const
           lapack_complex_double *a, lapack_int lda, double *s, double *scond,
           double *amax)
       lapack_int LAPACKE_spoequb_work (int matrix_layout, lapack_int n, const
           float *a, lapack_int lda, float *s, float *scond, float *amax)
       lapack_int LAPACKE_dpoequb_work (int matrix_layout, lapack_int n, const
           double *a, lapack_int lda, double *s, double *scond, double *amax)
       lapack_int LAPACKE_cpoequb_work (int matrix_layout, lapack_int n, const
           lapack_complex_float *a, lapack_int lda, float *s, float *scond,
           float *amax)
       lapack_int LAPACKE_zpoequb_work (int matrix_layout, lapack_int n, const
           lapack_complex_double *a, lapack_int lda, double *s, double *scond,
           double *amax)

yes the ...b versions are byte-for-byte the same arg list as their non-b siblings, that's not a typo, that's just how she is 💅

🔥 porfs — the refined-solve fam

okok this is the big arg list and I need you to breathe. you got two matrices here: a/lda and af/ldaf. then b/ldb going in, x/ldx coming out, ferr + berr for the error estimates, and then work / iwork (or work / rwork if you're complex). slay:

       lapack_int LAPACKE_sporfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const float *a, lapack_int lda, const float *af,
           lapack_int ldaf, const float *b, lapack_int ldb, float *x,
           lapack_int ldx, float *ferr, float *berr, float *work, lapack_int
           *iwork)
       lapack_int LAPACKE_dporfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const double *a, lapack_int lda, const double
           *af, lapack_int ldaf, const double *b, lapack_int ldb, double *x,
           lapack_int ldx, double *ferr, double *berr, double *work, lapack_int
           *iwork)
       lapack_int LAPACKE_cporfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
           const lapack_complex_float *af, lapack_int ldaf, const
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
           lapack_int ldx, float *ferr, float *berr, lapack_complex_float
           *work, float *rwork)
       lapack_int LAPACKE_zporfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
           const lapack_complex_double *af, lapack_int ldaf, const
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
           lapack_int ldx, double *ferr, double *berr, lapack_complex_double
           *work, double *rwork)

🌈 porfsx — extreme mode, buckle up

same as above but now with equed, s, rcond, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params… it's giving main character energy with a 20-argument resume. note berr stays real (float/double) even in the complex versions, and s goes real there too:

       lapack_int LAPACKE_sporfsx_work (int matrix_layout, char uplo, char
           equed, lapack_int n, lapack_int nrhs, const float *a, lapack_int
           lda, const float *af, lapack_int ldaf, const float *s, const float
           *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond, float
           *berr, lapack_int n_err_bnds, float *err_bnds_norm, float
           *err_bnds_comp, lapack_int nparams, float *params, float *work,
           lapack_int *iwork)
       lapack_int LAPACKE_dporfsx_work (int matrix_layout, char uplo, char
           equed, lapack_int n, lapack_int nrhs, const double *a, lapack_int
           lda, const double *af, lapack_int ldaf, const double *s, const
           double *b, lapack_int ldb, double *x, lapack_int ldx, double *rcond,
           double *berr, lapack_int n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int nparams, double *params, double *work,
           lapack_int *iwork)
       lapack_int LAPACKE_cporfsx_work (int matrix_layout, char uplo, char
           equed, lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, const lapack_complex_float *af, lapack_int ldaf,
           const float *s, const lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *x, lapack_int ldx, float *rcond, float *berr,
           lapack_int n_err_bnds, float *err_bnds_norm, float *err_bnds_comp,
           lapack_int nparams, float *params, lapack_complex_float *work, float
           *rwork)
       lapack_int LAPACKE_zporfsx_work (int matrix_layout, char uplo, char
           equed, lapack_int n, lapack_int nrhs, const lapack_complex_double
           *a, lapack_int lda, const lapack_complex_double *af, lapack_int
           ldaf, const double *s, const lapack_complex_double *b, lapack_int
           ldb, lapack_complex_double *x, lapack_int ldx, double *rcond, double
           *berr, lapack_int n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int nparams, double *params,
           lapack_complex_double *work, double *rwork)

🍓 posv — short and sweet, obsessed

four args, four types, no const on a because she's getting factored in place, periodt:

       lapack_int LAPACKE_sposv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, float *a, lapack_int lda, float *b, lapack_int
           ldb)
       lapack_int LAPACKE_dposv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, double *a, lapack_int lda, double *b, lapack_int
           ldb)
       lapack_int LAPACKE_cposv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zposv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb)

also — notice there's no sposv/cposv in this batch, only dsposv and zcposv below. don't come for me, I'm just reading the list 💀

💀 dsposv / zcposv — the mixed-precision duo

these two are their own whole thing: extra x/ldx output, work, a real swork (float* for the double one, lapack_complex_float* for the complex-double one), rwork for zcposv, and iter at the very end. iykyk:

       lapack_int LAPACKE_dsposv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, double *a, lapack_int lda, double *b, lapack_int
           ldb, double *x, lapack_int ldx, double *work, float *swork,
           lapack_int *iter)
       lapack_int LAPACKE_zcposv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
           lapack_int ldx, lapack_complex_double *work, lapack_complex_float
           *swork, double *rwork, lapack_int *iter)

🎀 posvx — expert driver, fact-checked

now we've got fact and uplo up front, af/ldaf, a char *equed (a pointer, because she writes the equilibrated char back at you 👀), s, then the usual b→x glow-up plus rcond, ferr, berr, work, iwork/rwork:

       lapack_int LAPACKE_sposvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *af,
           lapack_int ldaf, char *equed, float *s, float *b, lapack_int ldb,
           float *x, lapack_int ldx, float *rcond, float *ferr, float *berr,
           float *work, lapack_int *iwork)
       lapack_int LAPACKE_dposvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double
           *af, lapack_int ldaf, char *equed, double *s, double *b, lapack_int
           ldb, double *x, lapack_int ldx, double *rcond, double *ferr, double
           *berr, double *work, lapack_int *iwork)
       lapack_int LAPACKE_cposvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
           lda, lapack_complex_float *af, lapack_int ldaf, char *equed, float
           *s, lapack_complex_float *b, lapack_int ldb, lapack_complex_float
           *x, lapack_int ldx, float *rcond, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zposvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *af, lapack_int ldaf, char *equed, double
           *s, lapack_complex_double *b, lapack_int ldb, lapack_complex_double
           *x, lapack_int ldx, double *rcond, double *ferr, double *berr,
           lapack_complex_double *work, double *rwork)

👑 posvxx — the final boss of this chunk

posvx but extra: rpvgrw snuck in right after rcond, and then n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params before work and iwork. she ate and left no crumbs:

       lapack_int LAPACKE_sposvxx_work (int matrix_layout, char fact, char
           uplo, lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float
           *af, lapack_int ldaf, char *equed, float *s, float *b, lapack_int
           ldb, float *x, lapack_int ldx, float *rcond, float *rpvgrw, float
           *berr, lapack_int n_err_bnds, float *err_bnds_norm, float
           *err_bnds_comp, lapack_int nparams, float *params, float *work,
           lapack_int *iwork)

and that's where this part cuts off — mid-family, naturally 😭 more incoming, don't go anywhere 🫶✨

okay so we are still in SYNOPSIS and the _work girlies have officially entered the chat 💅 every single prototype in this batch ends in _work, and like — the work pointer is literally right there in the signature, she's not hiding 🫶 also a lil decoder ring for the letter prefixes, since they're all visible in the types: s = float, d = double, c = lapack_complex_float, z = lapack_complex_double. iconic, consistent, no notes ✨


🌸 the posvxx crew

okay so first up, three of these: d, c, and z. notice what's not here — there's no s version in this batch, so don't come for me, I'm just reading the list 💀

look at this cast though: fact, equed, rpvgrw, and the error-bounds trio n_err_bnds, err_bnds_norm, err_bnds_comp. it's giving full main-character ensemble fr fr 👑

lapack_int LAPACKE_dposvxx_work (int matrix_layout, char fact, char
    uplo, lapack_int n, lapack_int nrhs, double *a, lapack_int lda,
    double *af, lapack_int ldaf, char *equed, double *s, double *b,
    lapack_int ldb, double *x, lapack_int ldx, double *rcond, double
    *rpvgrw, double *berr, lapack_int n_err_bnds, double *err_bnds_norm,
    double *err_bnds_comp, lapack_int nparams, double *params, double
    *work, lapack_int *iwork)
lapack_int LAPACKE_cposvxx_work (int matrix_layout, char fact, char
    uplo, lapack_int n, lapack_int nrhs, lapack_complex_float *a,
    lapack_int lda, lapack_complex_float *af, lapack_int ldaf, char
    *equed, float *s, lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *x, lapack_int ldx, float *rcond, float
    *rpvgrw, float *berr, lapack_int n_err_bnds, float *err_bnds_norm,
    float *err_bnds_comp, lapack_int nparams, float *params,
    lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zposvxx_work (int matrix_layout, char fact, char
    uplo, lapack_int n, lapack_int nrhs, lapack_complex_double *a,
    lapack_int lda, lapack_complex_double *af, lapack_int ldaf, char
    *equed, double *s, lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *x, lapack_int ldx, double *rcond, double
    *rpvgrw, double *berr, lapack_int n_err_bnds, double *err_bnds_norm,
    double *err_bnds_comp, lapack_int nparams, double *params,
    lapack_complex_double *work, double *rwork)

see how the complex girlies swap iwork for rwork at the end? highkey obsessed with the consistency 😌


🎀 potrf2 — the sequel (literally)

the 2 is part of the name, bestie, not a typo. these four are the shortest glow-ups in the whole batch and I respect the minimalism ✨

lapack_int LAPACKE_spotrf2_work (int matrix_layout, char uplo,
    lapack_int n, float *a, lapack_int lda)
lapack_int LAPACKE_dpotrf2_work (int matrix_layout, char uplo,
    lapack_int n, double *a, lapack_int lda)
lapack_int LAPACKE_cpotrf2_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float *a, lapack_int lda)
lapack_int LAPACKE_zpotrf2_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_double *a, lapack_int lda)

like, five arguments and a dream. we love a low-effort icon 💅


🦋 potrf — the original recipe

same vibe, no 2, still serving:

lapack_int LAPACKE_spotrf_work (int matrix_layout, char uplo, lapack_int
    n, float *a, lapack_int lda)
lapack_int LAPACKE_dpotrf_work (int matrix_layout, char uplo, lapack_int
    n, double *a, lapack_int lda)
lapack_int LAPACKE_cpotrf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *a, lapack_int lda)
lapack_int LAPACKE_zpotrf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *a, lapack_int lda)

same uplo, same n, same a, same lda. she's consistent, she's reliable, she's the friend who always texts back 🌸


💜 potri — the inverse girlies

lapack_int LAPACKE_spotri_work (int matrix_layout, char uplo, lapack_int
    n, float *a, lapack_int lda)
lapack_int LAPACKE_dpotri_work (int matrix_layout, char uplo, lapack_int
    n, double *a, lapack_int lda)
lapack_int LAPACKE_cpotri_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *a, lapack_int lda)
lapack_int LAPACKE_zpotri_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *a, lapack_int lda)

identical shape to potrf, which honestly? ate. no crumbs 🔥


🌈 potrs — and now she's got nrhs

ooh she brought a friend: nrhs. and both a pointers are const now, which is the code way of saying "hands off, don't touch" 🙈

lapack_int LAPACKE_spotrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const float *a, lapack_int lda, float *b,
    lapack_int ldb)
lapack_int LAPACKE_dpotrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const double *a, lapack_int lda, double *b,
    lapack_int ldb)
lapack_int LAPACKE_cpotrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zpotrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *b, lapack_int ldb)

🍓 ppcon — packed, with an anorm

lapack_int LAPACKE_sppcon_work (int matrix_layout, char uplo, lapack_int
    n, const float *ap, float anorm, float *rcond, float *work,
    lapack_int *iwork)
lapack_int LAPACKE_dppcon_work (int matrix_layout, char uplo, lapack_int
    n, const double *ap, double anorm, double *rcond, double *work,
    lapack_int *iwork)
lapack_int LAPACKE_cppcon_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_float *ap, float anorm, float *rcond,
    lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zppcon_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_double *ap, double anorm, double *rcond,
    lapack_complex_double *work, double *rwork)

note the packed ap is const in all four, and the real girlies get iwork while the complex girlies get rwork. matching sets, we love to see it 🎀


🧚 ppequ — no work array, she travels light

look at that — s, scond, amax, and not a single scratch pointer in sight. unbothered, moisturized, in her lane ✨

lapack_int LAPACKE_sppequ_work (int matrix_layout, char uplo, lapack_int
    n, const float *ap, float *s, float *scond, float *amax)
lapack_int LAPACKE_dppequ_work (int matrix_layout, char uplo, lapack_int
    n, const double *ap, double *s, double *scond, double *amax)
lapack_int LAPACKE_cppequ_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_float *ap, float *s, float *scond, float
    *amax)
lapack_int LAPACKE_zppequ_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_double *ap, double *s, double *scond, double
    *amax)

🫶 pprfs — the one with the most letters

okay this one is packed (pun fully intended, I'm so sorry 😭): she's got ap, afp, b, x, ferr, berr, plus work and iwork/rwork. a whole group chat in one signature.

lapack_int LAPACKE_spprfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const float *ap, const float *afp, const float
    *b, lapack_int ldb, float *x, lapack_int ldx, float *ferr, float
    *berr, float *work, lapack_int *iwork)
lapack_int LAPACKE_dpprfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const double *ap, const double *afp, const
    double *b, lapack_int ldb, double *x, lapack_int ldx, double *ferr,
    double *berr, double *work, lapack_int *iwork)
lapack_int LAPACKE_cpprfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_float *ap, const
    lapack_complex_float *afp, const lapack_complex_float *b, lapack_int
    ldb, lapack_complex_float *x, lapack_int ldx, float *ferr, float
    *berr, lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zpprfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_double *ap, const
    lapack_complex_double *afp, const lapack_complex_double *b,
    lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double
    *ferr, double *berr, lapack_complex_double *work, double *rwork)

three const pointers in a row. she said "read-only era" 💀


👑 ppsv — simple, chic, no notes

ap, b, ldb. that's it. that's the whole function. minimalism is a lifestyle 🌿

lapack_int LAPACKE_sppsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, float *ap, float *b, lapack_int ldb)
lapack_int LAPACKE_dppsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, double *ap, double *b, lapack_int ldb)
lapack_int LAPACKE_cppsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_float *ap, lapack_complex_float
    *b, lapack_int ldb)
lapack_int LAPACKE_zppsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_double *ap, lapack_complex_double
    *b, lapack_int ldb)

notice: no const here, unlike pprfs. the girlies are mutating 😳


💖 ppsvx — she's the whole package

fact, equed, rcond, ferr, berr — she really said "I'll do it all myself" and honestly? queen behavior 👑

lapack_int LAPACKE_sppsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, float *ap, float *afp, char *equed,
    float *s, float *b, lapack_int ldb, float *x, lapack_int ldx, float
    *rcond, float *ferr, float *berr, float *work, lapack_int *iwork)
lapack_int LAPACKE_dppsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, double *ap, double *afp, char *equed,
    double *s, double *b, lapack_int ldb, double *x, lapack_int ldx,
    double *rcond, double *ferr, double *berr, double *work, lapack_int
    *iwork)
lapack_int LAPACKE_cppsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float *ap,
    lapack_complex_float *afp, char *equed, float *s,
    lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
    lapack_int ldx, float *rcond, float *ferr, float *berr,
    lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zppsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double *ap,
    lapack_complex_double *afp, char *equed, double *s,
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
    lapack_int ldx, double *rcond, double *ferr, double *berr,
    lapack_complex_double *work, double *rwork)

equed is a char * in every single one — she's a pointer, she's quirky, she stays 🌸


🔥 pptrf, pptri, pptrs — the packed trilogy

three little families back to back, all riding the packed ap train:

lapack_int LAPACKE_spptrf_work (int matrix_layout, char uplo, lapack_int
    n, float *ap)
lapack_int LAPACKE_dpptrf_work (int matrix_layout, char uplo, lapack_int
    n, double *ap)
lapack_int LAPACKE_cpptrf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *ap)
lapack_int LAPACKE_zpptrf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *ap)
lapack_int LAPACKE_spptri_work (int matrix_layout, char uplo, lapack_int
    n, float *ap)
lapack_int LAPACKE_dpptri_work (int matrix_layout, char uplo, lapack_int
    n, double *ap)
lapack_int LAPACKE_cpptri_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *ap)
lapack_int LAPACKE_zpptri_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *ap)
lapack_int LAPACKE_spptrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const float *ap, float *b, lapack_int ldb)
lapack_int LAPACKE_dpptrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const double *ap, double *b, lapack_int ldb)
lapack_int LAPACKE_cpptrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_float *ap,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zpptrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_double *ap,
    lapack_complex_double *b, lapack_int ldb)

pptrf and pptri are twinsies (four args, ap, done). pptrs brought nrhs and made ap const. character development 💅


⭐ pstrf — the one with opinions

okay she's different. she's got piv, rank, AND tol — she's ranking things, she's pivoting, she has tolerance. main character energy fr fr 🔥

lapack_int LAPACKE_spstrf_work (int matrix_layout, char uplo, lapack_int
    n, float *a, lapack_int lda, lapack_int *piv, lapack_int *rank,
    float tol, float *work)
lapack_int LAPACKE_dpstrf_work (int matrix_layout, char uplo, lapack_int
    n, double *a, lapack_int lda, lapack_int *piv, lapack_int *rank,
    double tol, double *work)
lapack_int LAPACKE_cpstrf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_int *piv,
    lapack_int *rank, float tol, float *work)
lapack_int LAPACKE_zpstrf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_int *piv,
    lapack_int *rank, double tol, double *work)

tol is float for s/c and double for d/z — precision matching, she's thorough 🎀


🕯️ ptcon — wait, where's matrix_layout??

bestie. BESTIE. look closely. LAPACKE_sptcon_work does not start with matrix_layout. it just goes straight into lapack_int n. she's built different, she skipped the intro, she's mysterious 💀

lapack_int LAPACKE_sptcon_work (lapack_int n, const float *d, const
    float *e, float anorm, float *rcond, float *work)
lapack_int LAPACKE_dptcon_work (lapack_int n, const double *d, const
    double *e, double anorm, double *rcond, double *work)
lapack_int LAPACKE_cptcon_work (lapack_int n, const float *d, const
    lapack_complex_float *e, float anorm, float *rcond, float *work)
lapack_int LAPACKE_zptcon_work (lapack_int n, const double *d, const
    lapack_complex_double *e, double anorm, double *rcond, double *work)

note also: e is const float * for s, const double * for d, but const lapack_complex_float * for c and const lapack_complex_double * for z. the complex girlies brought their complex energy, we respect it 💜


🙈 spteqr — and we end on a CLIFFHANGER

she's mid-sentence. she's mid-signature. the line literally stops at float and honestly? same, girl, same 😭

lapack_int LAPACKE_spteqr_work (int matrix_layout, char compz,
    lapack_int n, float *d, float *e, float *z, lapack_int ldz, float

compz said "I'm not like other uplos" and we stan a unique parameter name 🌟

to be continued, obviously — she's not done and neither are we 💖

Okay so next up is the pteqr girlies — same exact routine, four different precisions, work array included 💅

lapack_int LAPACKE_dpteqr_work (int matrix_layout, char compz,
    lapack_int n, double *d, double *e, double *z, lapack_int ldz,
    double *work)
lapack_int LAPACKE_cpteqr_work (int matrix_layout, char compz,
    lapack_int n, float *d, float *e, lapack_complex_float *z,
    lapack_int ldz, float *work)
lapack_int LAPACKE_zpteqr_work (int matrix_layout, char compz,
    lapack_int n, double *d, double *e, lapack_complex_double *z,
    lapack_int ldz, double *work)

(the s one was already in the last part bestie, we're not redoing it, we're moving on ✨)


Now ptrfs — this is the refinement one, and notice that the complex versions get an extra char uplo and an extra rwork while the real ones don't. That's not a typo, that's just how complex rolls 😭

lapack_int LAPACKE_sptrfs_work (int matrix_layout, lapack_int n,
    lapack_int nrhs, const float *d, const float *e, const float *df,
    const float *ef, const float *b, lapack_int ldb, float *x,
    lapack_int ldx, float *ferr, float *berr, float *work)
lapack_int LAPACKE_dptrfs_work (int matrix_layout, lapack_int n,
    lapack_int nrhs, const double *d, const double *e, const double *df,
    const double *ef, const double *b, lapack_int ldb, double *x,
    lapack_int ldx, double *ferr, double *berr, double *work)
lapack_int LAPACKE_cptrfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const float *d, const lapack_complex_float *e,
    const float *df, const lapack_complex_float *ef, const
    lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
    lapack_int ldx, float *ferr, float *berr, lapack_complex_float
    *work, float *rwork)
lapack_int LAPACKE_zptrfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const double *d, const lapack_complex_double *e,
    const double *df, const lapack_complex_double *ef, const
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
    lapack_int ldx, double *ferr, double *berr, lapack_complex_double
    *work, double *rwork)

ptsv next — the solve. No uplo, no rwork, just vibes and a work array. Iconic minimalism 🎀

lapack_int LAPACKE_sptsv_work (int matrix_layout, lapack_int n,
    lapack_int nrhs, float *d, float *e, float *b, lapack_int ldb)
lapack_int LAPACKE_dptsv_work (int matrix_layout, lapack_int n,
    lapack_int nrhs, double *d, double *e, double *b, lapack_int ldb)
lapack_int LAPACKE_cptsv_work (int matrix_layout, lapack_int n,
    lapack_int nrhs, float *d, lapack_complex_float *e,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zptsv_work (int matrix_layout, lapack_int n,
    lapack_int nrhs, double *d, lapack_complex_double *e,
    lapack_complex_double *b, lapack_int ldb)

And ptsvx — the fancy version with fact, rcond, ferr, berr, the whole glow-up 💅 again, complex gets rwork and the real ones don't:

lapack_int LAPACKE_sptsvx_work (int matrix_layout, char fact, lapack_int
    n, lapack_int nrhs, const float *d, const float *e, float *df, float
    *ef, const float *b, lapack_int ldb, float *x, lapack_int ldx, float
    *rcond, float *ferr, float *berr, float *work)
lapack_int LAPACKE_dptsvx_work (int matrix_layout, char fact, lapack_int
    n, lapack_int nrhs, const double *d, const double *e, double *df,
    double *ef, const double *b, lapack_int ldb, double *x, lapack_int
    ldx, double *rcond, double *ferr, double *berr, double *work)
lapack_int LAPACKE_cptsvx_work (int matrix_layout, char fact, lapack_int
    n, lapack_int nrhs, const float *d, const lapack_complex_float *e,
    float *df, lapack_complex_float *ef, const lapack_complex_float *b,
    lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float
    *rcond, float *ferr, float *berr, lapack_complex_float *work, float
    *rwork)
lapack_int LAPACKE_zptsvx_work (int matrix_layout, char fact, lapack_int
    n, lapack_int nrhs, const double *d, const lapack_complex_double *e,
    double *df, lapack_complex_double *ef, const lapack_complex_double
    *b, lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double
    *rcond, double *ferr, double *berr, lapack_complex_double *work,
    double *rwork)

pttrf — factorization only, no matrix_layout at all, which is a whole mood. Literally just n, d, e and bye 🦋

lapack_int LAPACKE_spttrf_work (lapack_int n, float *d, float *e)
lapack_int LAPACKE_dpttrf_work (lapack_int n, double *d, double *e)
lapack_int LAPACKE_cpttrf_work (lapack_int n, float *d,
    lapack_complex_float *e)
lapack_int LAPACKE_zpttrf_work (lapack_int n, double *d,
    lapack_complex_double *e)

pttrs — the matching solve for that factorization. The real ones don't take uplo, the complex ones do. Yes that's a pattern. Yes we noticed. No we can't fix it 🔥

lapack_int LAPACKE_spttrs_work (int matrix_layout, lapack_int n,
    lapack_int nrhs, const float *d, const float *e, float *b,
    lapack_int ldb)
lapack_int LAPACKE_dpttrs_work (int matrix_layout, lapack_int n,
    lapack_int nrhs, const double *d, const double *e, double *b,
    lapack_int ldb)
lapack_int LAPACKE_cpttrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const float *d, const lapack_complex_float *e,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zpttrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const double *d, const lapack_complex_double *e,
    lapack_complex_double *b, lapack_int ldb)

Okay the p* era is over, we're entering the sbev era and it's giving tridiagonal-but-wider. kd is the bandwidth bestie, don't forget it 💜

lapack_int LAPACKE_ssbev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, float *ab, lapack_int ldab, float *w,
    float *z, lapack_int ldz, float *work)
lapack_int LAPACKE_dsbev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, double *ab, lapack_int ldab, double *w,
    double *z, lapack_int ldz, double *work)

sbevd is the same queen but algorithmic and she wants lwork, iwork and liwork from you upfront. Pay up 💀

lapack_int LAPACKE_ssbevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, float *ab, lapack_int ldab, float *w,
    float *z, lapack_int ldz, float *work, lapack_int lwork, lapack_int
    *iwork, lapack_int liwork)
lapack_int LAPACKE_dsbevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, double *ab, lapack_int ldab, double *w,
    double *z, lapack_int ldz, double *work, lapack_int lwork,
    lapack_int *iwork, lapack_int liwork)

sbevx is the expert one — range, vl, vu, il, iu, abstol, output m, plus ifail so it can literally tell you which vectors failed. Not me being perceived by the algorithm 🙈

lapack_int LAPACKE_ssbevx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int kd, float *ab, lapack_int
    ldab, float *q, lapack_int ldq, float vl, float vu, lapack_int il,
    lapack_int iu, float abstol, lapack_int *m, float *w, float *z,
    lapack_int ldz, float *work, lapack_int *iwork, lapack_int *ifail)
lapack_int LAPACKE_dsbevx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int kd, double *ab,
    lapack_int ldab, double *q, lapack_int ldq, double vl, double vu,
    lapack_int il, lapack_int iu, double abstol, lapack_int *m, double
    *w, double *z, lapack_int ldz, double *work, lapack_int *iwork,
    lapack_int *ifail)

sbgst — generalized problem reduction, and it takes two band matrices ab/bb with their own ka/kb bandwidths plus vect, uplo and an output x with ldx. It's giving very much "two besties, two bandwidths" 🫶

lapack_int LAPACKE_ssbgst_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, float *ab, lapack_int
    ldab, const float *bb, lapack_int ldbb, float *x, lapack_int ldx,
    float *work)
lapack_int LAPACKE_dsbgst_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, double *ab, lapack_int
    ldab, const double *bb, lapack_int ldbb, double *x, lapack_int ldx,
    double *work)

sbgv — generalized band eigenvalue problem. Same two-band energy, but it spits out w and z instead of x ✨

lapack_int LAPACKE_ssbgv_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, float *ab, lapack_int
    ldab, float *bb, lapack_int ldbb, float *w, float *z, lapack_int
    ldz, float *work)
lapack_int LAPACKE_dsbgv_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, double *ab, lapack_int
    ldab, double *bb, lapack_int ldbb, double *w, double *z, lapack_int
    ldz, double *work)

sbgvd — same as above but division-and-conquer coded, so it's lwork/iwork/liwork again. Keep your workspace budget in check bestie, she's greedy 💅

lapack_int LAPACKE_ssbgvd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, float *ab, lapack_int
    ldab, float *bb, lapack_int ldbb, float *w, float *z, lapack_int
    ldz, float *work, lapack_int lwork, lapack_int *iwork, lapack_int
    liwork)
lapack_int LAPACKE_dsbgvd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, double *ab, lapack_int
    ldab, double *bb, lapack_int ldbb, double *w, double *z, lapack_int
    ldz, double *work, lapack_int lwork, lapack_int *iwork, lapack_int
    liwork)

sbgvx — expert generalized band. Everything sbgvd has plus range, vl, vu, il, iu, abstol, q/ldq, output m and ifail. The longest signature so far and honestly? She earned it 👑

lapack_int LAPACKE_ssbgvx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int ka, lapack_int kb, float
    *ab, lapack_int ldab, float *bb, lapack_int ldbb, float *q,
    lapack_int ldq, float vl, float vu, lapack_int il, lapack_int iu,
    float abstol, lapack_int *m, float *w, float *z, lapack_int ldz,
    float *work, lapack_int *iwork, lapack_int *ifail)
lapack_int LAPACKE_dsbgvx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int ka, lapack_int kb, double
    *ab, lapack_int ldab, double *bb, lapack_int ldbb, double *q,
    lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu,
    double abstol, lapack_int *m, double *w, double *z, lapack_int ldz,
    double *work, lapack_int *iwork, lapack_int *ifail)

sbtrd — reduces a symmetric band matrix to tridiagonal. Note the vect/uplo combo, d and e for the diagonal and off-diagonal, and q/ldq for the orthogonal matrix if you asked for it 🌸

lapack_int LAPACKE_ssbtrd_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int kd, float *ab, lapack_int ldab, float *d,
    float *e, float *q, lapack_int ldq, float *work)
lapack_int LAPACKE_dsbtrd_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int kd, double *ab, lapack_int ldab, double *d,
    double *e, double *q, lapack_int ldq, double *work)

sfrk — the rank-k update in RFP (rectangular full packed) storage. Four chars of chaos: transr, uplo, trans. Plus alpha/beta and no work array because she doesn't need one, she's low maintenance 💜

lapack_int LAPACKE_ssfrk_work (int matrix_layout, char transr, char
    uplo, char trans, lapack_int n, lapack_int k, float alpha, const
    float *a, lapack_int lda, float beta, float *c)
lapack_int LAPACKE_dsfrk_work (int matrix_layout, char transr, char
    uplo, char trans, lapack_int n, lapack_int k, double alpha, const
    double *a, lapack_int lda, double beta, double *c)

spcon — condition number estimate for packed storage. Real versions get work + iwork; complex versions get just work because their iwork era is not now 🎀

lapack_int LAPACKE_sspcon_work (int matrix_layout, char uplo, lapack_int
    n, const float *ap, const lapack_int *ipiv, float anorm, float
    *rcond, float *work, lapack_int *iwork)
lapack_int LAPACKE_dspcon_work (int matrix_layout, char uplo, lapack_int
    n, const double *ap, const lapack_int *ipiv, double anorm, double
    *rcond, double *work, lapack_int *iwork)
lapack_int LAPACKE_cspcon_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_float *ap, const lapack_int *ipiv, float
    anorm, float *rcond, lapack_complex_float *work)
lapack_int LAPACKE_zspcon_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_double *ap, const lapack_int *ipiv, double
    anorm, double *rcond, lapack_complex_double *work)

spev — packed symmetric eigenvalues. ap in, w out, z/ldz if you want the vectors, work for the process 🌈

lapack_int LAPACKE_sspev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, float *ap, float *w, float *z, lapack_int ldz, float
    *work)
lapack_int LAPACKE_dspev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, double *ap, double *w, double *z, lapack_int ldz,
    double *work)

spevd — and here's where we hand off, because the d version wants lwork, iwork and liwork and the list keeps going in the next part 😭 don't worry, we're picking it right back up:

lapack_int LAPACKE_sspevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, float *ap, float *w, float *z, lapack_int ldz, float
    *work, lapack_int lwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_dspevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, double *ap, double *w, double *z, lapack_int ldz,

okay continuing the prototype parade 💅 still in the SYNOPSIS section, still no breath, still slaying. the previous block tails off with this lil leftover:

double *work, lapack_int lwork, lapack_int *iwork, lapack_int
liwork)

(that's the end of the previous _work signature, bestie — it just wrapped ugly 🫶)


the spevx girlies 💖

so spevx is the full-glow-up eigenvalue situation, and its _work twins are:

lapack_int LAPACKE_sspevx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, float *ap, float vl, float vu,
    lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w,
    float *z, lapack_int ldz, float *work, lapack_int *iwork, lapack_int
    *ifail)
lapack_int LAPACKE_dspevx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, double *ap, double vl, double vu,
    lapack_int il, lapack_int iu, double abstol, lapack_int *m, double
    *w, double *z, lapack_int ldz, double *work, lapack_int *iwork,
    lapack_int *ifail)

note the <pink>_work</pink> versions make you bring the workspace — work, iwork, ifail, all handed over by you, no freebies ✨


the packed generalized symmetric crew 🌸

spgst first — a two-line situation, ap in, bp read-only:

lapack_int LAPACKE_sspgst_work (int matrix_layout, lapack_int itype,
    char uplo, lapack_int n, float *ap, const float *bp)
lapack_int LAPACKE_dspgst_work (int matrix_layout, lapack_int itype,
    char uplo, lapack_int n, double *ap, const double *bp)

then spgv, which also gives you eigenvalues in w and eigenvectors in z:

lapack_int LAPACKE_sspgv_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, float *ap, float *bp, float *w, float
    *z, lapack_int ldz, float *work)
lapack_int LAPACKE_dspgv_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, double *ap, double *bp, double *w,
    double *z, lapack_int ldz, double *work)

spgvd is literally spgv but divide-and-conquer coded, and it brought lwork/liwork along 😤:

lapack_int LAPACKE_sspgvd_work (int matrix_layout, lapack_int itype,
    char jobz, char uplo, lapack_int n, float *ap, float *bp, float *w,
    float *z, lapack_int ldz, float *work, lapack_int lwork, lapack_int
    *iwork, lapack_int liwork)
lapack_int LAPACKE_dspgvd_work (int matrix_layout, lapack_int itype,
    char jobz, char uplo, lapack_int n, double *ap, double *bp, double
    *w, double *z, lapack_int ldz, double *work, lapack_int lwork,
    lapack_int *iwork, lapack_int liwork)

and spgvx is the picky one — range, vl/vu, il/iu, abstol, m out, plus ifail at the end:

lapack_int LAPACKE_sspgvx_work (int matrix_layout, lapack_int itype,
    char jobz, char range, char uplo, lapack_int n, float *ap, float
    *bp, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
    lapack_int *m, float *w, float *z, lapack_int ldz, float *work,
    lapack_int *iwork, lapack_int *ifail)
lapack_int LAPACKE_dspgvx_work (int matrix_layout, lapack_int itype,
    char jobz, char range, char uplo, lapack_int n, double *ap, double
    *bp, double vl, double vu, lapack_int il, lapack_int iu, double
    abstol, lapack_int *m, double *w, double *z, lapack_int ldz, double
    *work, lapack_int *iwork, lapack_int *ifail)

sprfs — the iterative-refinement baddies 🔥

all four precisions showed up, and the complex ones get <purple>rwork</purple> on top of work:

lapack_int LAPACKE_ssprfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const float *ap, const float *afp, const
    lapack_int *ipiv, const float *b, lapack_int ldb, float *x,
    lapack_int ldx, float *ferr, float *berr, float *work, lapack_int
    *iwork)
lapack_int LAPACKE_dsprfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const double *ap, const double *afp, const
    lapack_int *ipiv, const double *b, lapack_int ldb, double *x,
    lapack_int ldx, double *ferr, double *berr, double *work, lapack_int
    *iwork)
lapack_int LAPACKE_csprfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_float *ap, const
    lapack_complex_float *afp, const lapack_int *ipiv, const
    lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
    lapack_int ldx, float *ferr, float *berr, lapack_complex_float
    *work, float *rwork)
lapack_int LAPACKE_zsprfs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_double *ap, const
    lapack_complex_double *afp, const lapack_int *ipiv, const
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
    lapack_int ldx, double *ferr, double *berr, lapack_complex_double
    *work, double *rwork)

spsv / spsvx — solve szn 💅

spsv is the short one, ipiv out, b in-and-overwritten:

lapack_int LAPACKE_sspsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, float *ap, lapack_int *ipiv, float *b,
    lapack_int ldb)
lapack_int LAPACKE_dspsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, double *ap, lapack_int *ipiv, double *b,
    lapack_int ldb)
lapack_int LAPACKE_cspsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_float *ap, lapack_int *ipiv,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zspsv_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_double *ap, lapack_int *ipiv,
    lapack_complex_double *b, lapack_int ldb)

spsvx is the deluxe edition with fact, afp, rcond, ferr, berr — so many little output crumbs fr fr:

lapack_int LAPACKE_sspsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const float *ap, float *afp,
    lapack_int *ipiv, const float *b, lapack_int ldb, float *x,
    lapack_int ldx, float *rcond, float *ferr, float *berr, float *work,
    lapack_int *iwork)
lapack_int LAPACKE_dspsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const double *ap, double *afp,
    lapack_int *ipiv, const double *b, lapack_int ldb, double *x,
    lapack_int ldx, double *rcond, double *ferr, double *berr, double
    *work, lapack_int *iwork)
lapack_int LAPACKE_cspsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float *ap,
    lapack_complex_float *afp, lapack_int *ipiv, const
    lapack_complex_float *b, lapack_int ldb, lapack_complex_float *x,
    lapack_int ldx, float *rcond, float *ferr, float *berr,
    lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_zspsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_double *ap,
    lapack_complex_double *afp, lapack_int *ipiv, const
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
    lapack_int ldx, double *rcond, double *ferr, double *berr,
    lapack_complex_double *work, double *rwork)

sptrd / sptrf / sptri / sptrs — the tri-diagonal trio-plus-one 🎀

sptrd reduces and hands back d, e, tau:

lapack_int LAPACKE_ssptrd_work (int matrix_layout, char uplo, lapack_int
    n, float *ap, float *d, float *e, float *tau)
lapack_int LAPACKE_dsptrd_work (int matrix_layout, char uplo, lapack_int
    n, double *ap, double *d, double *e, double *tau)

sptrf factors and spills ipiv:

lapack_int LAPACKE_ssptrf_work (int matrix_layout, char uplo, lapack_int
    n, float *ap, lapack_int *ipiv)
lapack_int LAPACKE_dsptrf_work (int matrix_layout, char uplo, lapack_int
    n, double *ap, lapack_int *ipiv)
lapack_int LAPACKE_csptrf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *ap, lapack_int *ipiv)
lapack_int LAPACKE_zsptrf_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *ap, lapack_int *ipiv)

sptri takes ipiv back as const and wants work:

lapack_int LAPACKE_ssptri_work (int matrix_layout, char uplo, lapack_int
    n, float *ap, const lapack_int *ipiv, float *work)
lapack_int LAPACKE_dsptri_work (int matrix_layout, char uplo, lapack_int
    n, double *ap, const lapack_int *ipiv, double *work)
lapack_int LAPACKE_csptri_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *ap, const lapack_int *ipiv,
    lapack_complex_float *work)
lapack_int LAPACKE_zsptri_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *ap, const lapack_int *ipiv,
    lapack_complex_double *work)

and sptrs does the actual solving, b in place, ldb tagging along:

lapack_int LAPACKE_ssptrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const float *ap, const lapack_int *ipiv, float
    *b, lapack_int ldb)
lapack_int LAPACKE_dsptrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const double *ap, const lapack_int *ipiv, double
    *b, lapack_int ldb)
lapack_int LAPACKE_csptrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_float *ap, const lapack_int
    *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zsptrs_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_double *ap, const
    lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)

stebz — wait, where's matrix_layout?? 😭

not me noticing stebz is the icon who does NOT take a matrix_layout argument. she's different like that 💀

lapack_int LAPACKE_sstebz_work (char range, char order, lapack_int n,
    float vl, float vu, lapack_int il, lapack_int iu, float abstol,
    const float *d, const float *e, lapack_int *m, lapack_int *nsplit,
    float *w, lapack_int *iblock, lapack_int *isplit, float *work,
    lapack_int *iwork)
lapack_int LAPACKE_dstebz_work (char range, char order, lapack_int n,
    double vl, double vu, lapack_int il, lapack_int iu, double abstol,
    const double *d, const double *e, lapack_int *m, lapack_int *nsplit,
    double *w, lapack_int *iblock, lapack_int *isplit, double *work,
    lapack_int *iwork)

stedc — divide-and-conquer tridiagonal glow-up ✨

note the complex ones carry <lavender>rwork</lavender> and <lavender>lrwork</lavender> in addition to work/lwork/iwork/liwork. the full luggage set 🧳:

lapack_int LAPACKE_sstedc_work (int matrix_layout, char compz,
    lapack_int n, float *d, float *e, float *z, lapack_int ldz, float
    *work, lapack_int lwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_dstedc_work (int matrix_layout, char compz,
    lapack_int n, double *d, double *e, double *z, lapack_int ldz,
    double *work, lapack_int lwork, lapack_int *iwork, lapack_int
    liwork)
lapack_int LAPACKE_cstedc_work (int matrix_layout, char compz,
    lapack_int n, float *d, float *e, lapack_complex_float *z,
    lapack_int ldz, lapack_complex_float *work, lapack_int lwork, float
    *rwork, lapack_int lrwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_zstedc_work (int matrix_layout, char compz,
    lapack_int n, double *d, double *e, lapack_complex_double *z,
    lapack_int ldz, lapack_complex_double *work, lapack_int lwork,
    double *rwork, lapack_int lrwork, lapack_int *iwork, lapack_int
    liwork)

stegr — the MRRR queen 👑

jobz, range, vl/vu, il/iu, abstol, m out, w, z, ldz, isuppz, work/lwork/iwork/liwork. she has everything and she knows it 🌈

lapack_int LAPACKE_sstegr_work (int matrix_layout, char jobz, char
    range, lapack_int n, float *d, float *e, float vl, float vu,
    lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w,
    float *z, lapack_int ldz, lapack_int *isuppz, float *work,
    lapack_int lwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_dstegr_work (int matrix_layout, char jobz, char
    range, lapack_int n, double *d, double *e, double vl, double vu,
    lapack_int il, lapack_int iu, double abstol, lapack_int *m, double
    *w, double *z, lapack_int ldz, lapack_int *isuppz, double *work,
    lapack_int lwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_cstegr_work (int matrix_layout, char jobz, char
    range, lapack_int n, float *d, float *e, float vl, float vu,
    lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w,
    lapack_complex_float *z, lapack_int ldz, lapack_int *isuppz, float
    *work, lapack_int lwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_zstegr_work (int matrix_layout, char jobz, char
    range, lapack_int n, double *d, double *e, double vl, double vu,
    lapack_int il, lapack_int iu, double abstol, lapack_int *m, double
    *w, lapack_complex_double *z, lapack_int ldz, lapack_int *isuppz,
    double *work, lapack_int lwork, lapack_int *iwork, lapack_int
    liwork)

lowkey obsessed that cstegr and zstegr keep d/e/w real while z goes complex — that mix is so real 💜

okay that's this batch of prototypes, and there's so much more coming, don't you dare close the tab 🦋

okay so here's the next batch of LAPACKE_*_work prototypes — all of these are the "you bring your own workspace" versions, bestie, so every one of them has work/lwork and sometimes iwork/liwork hanging out at the end. 💅

🌸 the stein squad — s, d, c, z

lapack_int LAPACKE_sstein_work (int matrix_layout, lapack_int n, const
    float *d, const float *e, lapack_int m, const float *w, const
    lapack_int *iblock, const lapack_int *isplit, float *z, lapack_int
    ldz, float *work, lapack_int *iwork, lapack_int *ifailv)
lapack_int LAPACKE_dstein_work (int matrix_layout, lapack_int n, const
    double *d, const double *e, lapack_int m, const double *w, const
    lapack_int *iblock, const lapack_int *isplit, double *z, lapack_int
    ldz, double *work, lapack_int *iwork, lapack_int *ifailv)
lapack_int LAPACKE_cstein_work (int matrix_layout, lapack_int n, const
    float *d, const float *e, lapack_int m, const float *w, const
    lapack_int *iblock, const lapack_int *isplit, lapack_complex_float
    *z, lapack_int ldz, float *work, lapack_int *iwork, lapack_int
    *ifailv)
lapack_int LAPACKE_zstein_work (int matrix_layout, lapack_int n, const
    double *d, const double *e, lapack_int m, const double *w, const
    lapack_int *iblock, const lapack_int *isplit, lapack_complex_double
    *z, lapack_int ldz, double *work, lapack_int *iwork, lapack_int
    *ifailv)

okay so the whole stein fam shares one shape, and the only glow-up between them is precision/species — <purple>s</purple> = float, <purple>d</purple> = double, <purple>c</purple> = lapack_complex_float, <purple>z</purple> = lapack_complex_double. that's it, that's the whole personality.

  • matrix_layout — you're telling it how your array is laid out. yes it goes first, no you don't get to skip it. 🙈
  • n — the size, bestie. the dimension.
  • d and e — const pointers to your real scalars; e gets one fewer element in spirit so watch your edges.
  • m — the count. how many of the goods you actually want.
  • w — const array of the values.
  • iblock and isplit — const lapack_int * housekeeping arrays, carried along like emotional support besties.
  • z — where the output lands, with leading dimension ldz.
  • work — your workspace buffer (real type in every variant — even the complex ones 🙃).
  • iwork — the integer workspace.
  • ifailv — an output lapack_int * for the failure info. keep an eye on it. 👀

🎀 the stemr squad — s, d, c, z

lapack_int LAPACKE_sstemr_work (int matrix_layout, char jobz, char
    range, lapack_int n, float *d, float *e, float vl, float vu,
    lapack_int il, lapack_int iu, lapack_int *m, float *w, float *z,
    lapack_int ldz, lapack_int nzc, lapack_int *isuppz, lapack_logical
    *tryrac, float *work, lapack_int lwork, lapack_int *iwork,
    lapack_int liwork)
lapack_int LAPACKE_dstemr_work (int matrix_layout, char jobz, char
    range, lapack_int n, double *d, double *e, double vl, double vu,
    lapack_int il, lapack_int iu, lapack_int *m, double *w, double *z,
    lapack_int ldz, lapack_int nzc, lapack_int *isuppz, lapack_logical
    *tryrac, double *work, lapack_int lwork, lapack_int *iwork,
    lapack_int liwork)
lapack_int LAPACKE_cstemr_work (int matrix_layout, char jobz, char
    range, lapack_int n, float *d, float *e, float vl, float vu,
    lapack_int il, lapack_int iu, lapack_int *m, float *w,
    lapack_complex_float *z, lapack_int ldz, lapack_int nzc, lapack_int
    *isuppz, lapack_logical *tryrac, float *work, lapack_int lwork,
    lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_zstemr_work (int matrix_layout, char jobz, char
    range, lapack_int n, double *d, double *e, double vl, double vu,
    lapack_int il, lapack_int iu, lapack_int *m, double *w,
    lapack_complex_double *z, lapack_int ldz, lapack_int nzc, lapack_int
    *isuppz, lapack_logical *tryrac, double *work, lapack_int lwork,
    lapack_int *iwork, lapack_int liwork)

this one has so many arguments and honestly? it ate. here's the tour:

  • jobz and range — two char flags up front, bossing things around.
  • n — the usual size.
  • d / e — non-const this time (they get touched, no cap).
  • vl, vu — your value bounds (float/double depending on flavor).
  • il, iu — your index bounds (lapack_int).
  • m — a lapack_int * output for the count. it points, it tells.
  • w — output values.
  • z + ldz — output array and its leading dimension.
  • nzc — yep, another lapack_int.
  • isuppz — lapack_int * support-array situation.
  • tryrac — a lapack_logical *, iconique. ✨
  • work / lwork and iwork / liwork — real work buffer with its length, integer work buffer with its length. both come in with their sizes, so no guessing. 🫶

🦋 the steqr squad — s, d, c, z

lapack_int LAPACKE_ssteqr_work (int matrix_layout, char compz,
    lapack_int n, float *d, float *e, float *z, lapack_int ldz, float
    *work)
lapack_int LAPACKE_dsteqr_work (int matrix_layout, char compz,
    lapack_int n, double *d, double *e, double *z, lapack_int ldz,
    double *work)
lapack_int LAPACKE_csteqr_work (int matrix_layout, char compz,
    lapack_int n, float *d, float *e, lapack_complex_float *z,
    lapack_int ldz, float *work)
lapack_int LAPACKE_zsteqr_work (int matrix_layout, char compz,
    lapack_int n, double *d, double *e, lapack_complex_double *z,
    lapack_int ldz, double *work)

short king lineup ngl:

  • compz — one char telling it about the z situation.
  • n — the size.
  • d / e — non-const, they're getting edited.
  • z + ldz — output array + leading dimension.
  • work — a plain work pointer, no lwork here, that's just the mood. 💀

🧚 the sterf duo

lapack_int LAPACKE_ssterf_work (lapack_int n, float *d, float *e)
lapack_int LAPACKE_dsterf_work (lapack_int n, double *d, double *e)

look at these minimalists!! no matrix_layout, no work — just n, d, and e. real "doesn't need makeup" energy. two of them: s (float) and d (double). that's the whole function. slay. 👑

⭐ the stev duo

lapack_int LAPACKE_sstev_work (int matrix_layout, char jobz, lapack_int
    n, float *d, float *e, float *z, lapack_int ldz, float *work)
lapack_int LAPACKE_dstev_work (int matrix_layout, char jobz, lapack_int
    n, double *d, double *e, double *z, lapack_int ldz, double *work)

matrix_layout back in the chat, plus jobz, n, d, e, z + ldz, and a trusty work. clean, focused, gets the job done. 💅

💜 the stevd duo

lapack_int LAPACKE_sstevd_work (int matrix_layout, char jobz, lapack_int
    n, float *d, float *e, float *z, lapack_int ldz, float *work,
    lapack_int lwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_dstevd_work (int matrix_layout, char jobz, lapack_int
    n, double *d, double *e, double *z, lapack_int ldz, double *work,
    lapack_int lwork, lapack_int *iwork, lapack_int liwork)

same starting cast as stev — matrix_layout, jobz, n, d, e, z + ldz — but then it level'd up with the full workspace kit: work / lwork and iwork / liwork. glow-up era. ✨

🍓 the stevr duo

lapack_int LAPACKE_sstevr_work (int matrix_layout, char jobz, char
    range, lapack_int n, float *d, float *e, float vl, float vu,
    lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w,
    float *z, lapack_int ldz, lapack_int *isuppz, float *work,
    lapack_int lwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_dstevr_work (int matrix_layout, char jobz, char
    range, lapack_int n, double *d, double *e, double vl, double vu,
    lapack_int il, lapack_int iu, double abstol, lapack_int *m, double
    *w, double *z, lapack_int ldz, lapack_int *isuppz, double *work,
    lapack_int lwork, lapack_int *iwork, lapack_int liwork)

the "r" version came dressed — jobz, range, n, d, e, vl, vu, il, iu, abstol (a real-typed tolerance, yes ma'am), m (pointer output), w, z + ldz, isuppz, then work / lwork and iwork / liwork. full roster, no notes. 🌈

💀 the stevx duo

lapack_int LAPACKE_sstevx_work (int matrix_layout, char jobz, char
    range, lapack_int n, float *d, float *e, float vl, float vu,
    lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w,
    float *z, lapack_int ldz, float *work, lapack_int *iwork, lapack_int
    *ifail)
lapack_int LAPACKE_dstevx_work (int matrix_layout, char jobz, char
    range, lapack_int n, double *d, double *e, double vl, double vu,
    lapack_int il, lapack_int iu, double abstol, lapack_int *m, double
    *w, double *z, lapack_int ldz, double *work, lapack_int *iwork,
    lapack_int *ifail)

nearly the same vibe as stevr, but the tail swaps isuppz/liwork for work, iwork, and an ifail output pointer. watch that ifail, bestie, it's lowkey snitching when things go sideways. 👀

🌸 the sycon squad — s, d, c, z

lapack_int LAPACKE_ssycon_work (int matrix_layout, char uplo, lapack_int
    n, const float *a, lapack_int lda, const lapack_int *ipiv, float
    anorm, float *rcond, float *work, lapack_int *iwork)
lapack_int LAPACKE_dsycon_work (int matrix_layout, char uplo, lapack_int
    n, const double *a, lapack_int lda, const lapack_int *ipiv, double
    anorm, double *rcond, double *work, lapack_int *iwork)
lapack_int LAPACKE_csycon_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_float *a, lapack_int lda, const lapack_int
    *ipiv, float anorm, float *rcond, lapack_complex_float *work)
lapack_int LAPACKE_zsycon_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_double *a, lapack_int lda, const lapack_int
    *ipiv, double anorm, double *rcond, lapack_complex_double *work)

okay so this fam — note the sneaky difference: the real ones (ssycon/dsycon) carry both work and iwork, but the complex ones (csycon/zsycon) only get work. read the signature, don't assume. 🫶

  • uplo — a char telling it which triangle of a matters.
  • n — the size.
  • a — const matrix, with leading dimension lda.
  • ipiv — const lapack_int * pivot info, brought along.
  • anorm — a real-typed norm value (even in the complex versions — float/double).
  • rcond — output pointer for the reciprocal condition situation.
  • work — workspace, type matches the flavor.
  • iwork — integer workspace… but only for s/d. 🙃

🎀 the syequb squad — s, d, c, z

lapack_int LAPACKE_ssyequb_work (int matrix_layout, char uplo,
    lapack_int n, const float *a, lapack_int lda, float *s, float
    *scond, float *amax, float *work)
lapack_int LAPACKE_dsyequb_work (int matrix_layout, char uplo,
    lapack_int n, const double *a, lapack_int lda, double *s, double
    *scond, double *amax, double *work)
lapack_int LAPACKE_csyequb_work (int matrix_layout, char uplo,
    lapack_int n, const lapack_complex_float *a, lapack_int lda, float
    *s, float *scond, float *amax, lapack_complex_float *work)
lapack_int LAPACKE_zsyequb_work (int matrix_layout, char uplo,
    lapack_int n, const lapack_complex_double *a, lapack_int lda, double
    *s, double *scond, double *amax, lapack_complex_double *work)
  • uplo, n, a + lda — the usual opening act.
  • s, scond, amax — three real-typed output pointers (float for s/c, double for d/z — yes, even the complex ones output reals here 💅).
  • work — and a workspace that matches the actual matrix type. no iwork, keep it light.

⭐ the syev duo

lapack_int LAPACKE_ssyev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, float *a, lapack_int lda, float *w, float *work,
    lapack_int lwork)
lapack_int LAPACKE_dsyev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, double *a, lapack_int lda, double *w, double *work,
    lapack_int lwork)

jobz, uplo, n, a + lda (non-const, she's mutable), w for output values, and work / lwork. just the essentials, hydrated and unbothered. 💧

🧚 the syevd duo

lapack_int LAPACKE_ssyevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, float *a, lapack_int lda, float *w, float *work,
    lapack_int lwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_dsyevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, double *a, lapack_int lda, double *w, double *work,
    lapack_int lwork, lapack_int *iwork, lapack_int liwork)

syev but make it deluxe — same jobz, uplo, n, a + lda, w, then work / lwork plus iwork / liwork. the whole workspace family came to the function. 🎀

💜 the syevr duo

lapack_int LAPACKE_ssyevr_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, float *a, lapack_int lda, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m,
    float *w, float *z, lapack_int ldz, lapack_int *isuppz, float *work,
    lapack_int lwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_dsyevr_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, double *a, lapack_int lda, double
    vl, double vu, lapack_int il, lapack_int iu, double abstol,
    lapack_int *m, double *w, double *z, lapack_int ldz, lapack_int
    *isuppz, double *work, lapack_int lwork, lapack_int *iwork,
    lapack_int liwork)

three chars deep — jobz, range, uplo — then n, a + lda, vl, vu, il, iu, abstol, m (pointer output), w, z + ldz, isuppz, and the double workspace special: work / lwork + iwork / liwork. it's giving full send. 🔥

🍓 the syevx duo

lapack_int LAPACKE_ssyevx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, float *a, lapack_int lda, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m,
    float *w, float *z, lapack_int ldz, float *work, lapack_int lwork,
    lapack_int *iwork, lapack_int *ifail)
lapack_int LAPACKE_dsyevx_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, double *a, lapack_int lda, double
    vl, double vu, lapack_int il, lapack_int iu, double abstol,
    lapack_int *m, double *w, double *z, lapack_int ldz, double *work,
    lapack_int lwork, lapack_int *iwork, lapack_int *ifail)

same jobz/range/uplo trio, same n, a + lda, vl, vu, il, iu, abstol, m, w, z + ldz… then it goes work / lwork, iwork, and ifail instead of the isuppz/liwork combo. different tail, same brain. 💅

🌈 the sygst duo

lapack_int LAPACKE_ssygst_work (int matrix_layout, lapack_int itype,
    char uplo, lapack_int n, float *a, lapack_int lda, const float *b,
    lapack_int ldb)
lapack_int LAPACKE_dsygst_work (int matrix_layout, lapack_int itype,
    char uplo, lapack_int n, double *a, lapack_int lda, const double *b,
    lapack_int ldb)

so compact!! itype (a lapack_int first up, not a char — periodt), then uplo, n, a + lda (mutable), b (const) + ldb. no work in sight — she doesn't need one. 🧚

👑 the sygv duo

lapack_int LAPACKE_ssygv_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, float *a, lapack_int lda, float *b,
    lapack_int ldb, float *w, float *work, lapack_int lwork)
lapack_int LAPACKE_dsygv_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, double *a, lapack_int lda, double *b,
    lapack_int ldb, double *w, double *work, lapack_int lwork)

itype, jobz, uplo, n, a + lda, b + ldb, w (output), work / lwork. got that "g" for generalized energy and she's wearing it. ✨

🎀 the sygvd duo

lapack_int LAPACKE_ssygvd_work (int matrix_layout, lapack_int itype,
    char jobz, char uplo, lapack_int n, float *a, lapack_int lda, float
    *b, lapack_int ldb, float *w, float *work, lapack_int lwork,
    lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_dsygvd_work (int matrix_layout, lapack_int itype,
    char jobz, char uplo, lapack_int n, double *a, lapack_int lda,
    double *b, lapack_int ldb, double *w, double *work, lapack_int
    lwork, lapack_int *iwork, lapack_int liwork)

sygv plus the integer-workspace upgrade — work / lwork AND iwork / liwork. the "d" said "give her everything." 🫶

🔥 the sygvx duo

lapack_int LAPACKE_ssygvx_work (int matrix_layout, lapack_int itype,
    char jobz, char range, char uplo, lapack_int n, float *a, lapack_int
    lda, float *b, lapack_int ldb, float vl, float vu, lapack_int il,
    lapack_int iu, float abstol, lapack_int *m, float *w, float *z,
    lapack_int ldz, float *work, lapack_int lwork, lapack_int *iwork,
    lapack_int *ifail)
lapack_int LAPACKE_dsygvx_work (int matrix_layout, lapack_int itype,
    char jobz, char range, char uplo, lapack_int n, double *a,
    lapack_int lda, double *b, lapack_int ldb, double vl, double vu,

the absolute final boss roster of this batch — itype then the jobz, range, uplo trio, n, a + lda, b + ldb, vl, vu, and the signature keeps rolling into il, iu, abstol, m, w, z + ldz, work / lwork, iwork, ifail before it wraps up in the next stretch of this page. we are SO not done yet, bestie — hold the vibe. 💅🦋

okay so we're still deep in the prototype trenches and honestly? this is where the whole lapacke vibe really shows. 💅 first up, the tail end of the previous signature — the argument list just wrapped onto new lines, nothing sneaky:

           lapack_int il, lapack_int iu, double abstol, lapack_int *m, double
           *w, double *z, lapack_int ldz, double *work, lapack_int lwork,
           lapack_int *iwork, lapack_int *ifail)

💖 the syrfs quartet

bestie, meet the syrfs squad — s, d, c, z prefixes, every one of them _work flavoured. clock the pattern: matrix_layout first, then uplo, n, nrhs, the a/lda + af/ldaf + ipiv combo, b/ldb, x/ldx, then the ferr/berr duo and your workspace. the c/z ones swap in complex types and add an rwork at the end, iconic as always ✨

       lapack_int LAPACKE_ssyrfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const float *a, lapack_int lda, const float *af,
           lapack_int ldaf, const lapack_int *ipiv, const float *b, lapack_int
           ldb, float *x, lapack_int ldx, float *ferr, float *berr, float
           *work, lapack_int *iwork)
       lapack_int LAPACKE_dsyrfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const double *a, lapack_int lda, const double
           *af, lapack_int ldaf, const lapack_int *ipiv, const double *b,
           lapack_int ldb, double *x, lapack_int ldx, double *ferr, double
           *berr, double *work, lapack_int *iwork)
       lapack_int LAPACKE_csyrfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
           const lapack_complex_float *af, lapack_int ldaf, const lapack_int
           *ipiv, const lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *x, lapack_int ldx, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zsyrfs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
           const lapack_complex_double *af, lapack_int ldaf, const lapack_int
           *ipiv, const lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork)

✨ the syrfsx glow-up

and then syrfsx said "let me make it bigger" 🎀 same four precisions, but now equed, s, rcond, plus the whole n_err_bnds / err_bnds_norm / err_bnds_comp / nparams / params situation is in the house. still got iwork (or rwork for the complex girlies) at the end. no cap, it's a lot of arguments and every single one is real.

       lapack_int LAPACKE_ssyrfsx_work (int matrix_layout, char uplo, char
           equed, lapack_int n, lapack_int nrhs, const float *a, lapack_int
           lda, const float *af, lapack_int ldaf, const lapack_int *ipiv, const
           float *s, const float *b, lapack_int ldb, float *x, lapack_int ldx,
           float *rcond, float *berr, lapack_int n_err_bnds, float
           *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float
           *params, float *work, lapack_int *iwork)
       lapack_int LAPACKE_dsyrfsx_work (int matrix_layout, char uplo, char
           equed, lapack_int n, lapack_int nrhs, const double *a, lapack_int
           lda, const double *af, lapack_int ldaf, const lapack_int *ipiv,
           const double *s, const double *b, lapack_int ldb, double *x,
           lapack_int ldx, double *rcond, double *berr, lapack_int n_err_bnds,
           double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams,
           double *params, double *work, lapack_int *iwork)
       lapack_int LAPACKE_csyrfsx_work (int matrix_layout, char uplo, char
           equed, lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, const lapack_complex_float *af, lapack_int ldaf,
           const lapack_int *ipiv, const float *s, const lapack_complex_float
           *b, lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float
           *rcond, float *berr, lapack_int n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int nparams, float *params,
           lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zsyrfsx_work (int matrix_layout, char uplo, char
           equed, lapack_int n, lapack_int nrhs, const lapack_complex_double
           *a, lapack_int lda, const lapack_complex_double *af, lapack_int
           ldaf, const lapack_int *ipiv, const double *s, const
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *x,
           lapack_int ldx, double *rcond, double *berr, lapack_int n_err_bnds,
           double *err_bnds_norm, double *err_bnds_comp, lapack_int nparams,
           double *params, lapack_complex_double *work, double *rwork)

🦋 sysv says hi

sysv time, and yes these are the _work versions — work and lwork are literally in the signature, so you're the one bringing the buffer, bestie 🫶 four precisions, same shape every time:

       lapack_int LAPACKE_ssysv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, float *a, lapack_int lda, lapack_int *ipiv,
           float *b, lapack_int ldb, float *work, lapack_int lwork)
       lapack_int LAPACKE_dsysv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, double *a, lapack_int lda, lapack_int *ipiv,
           double *b, lapack_int ldb, double *work, lapack_int lwork)
       lapack_int LAPACKE_csysv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda,
           lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zsysv_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
           lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *work, lapack_int lwork)

🌸 sysvx entered the chat

now with fact up front, af/ldaf, ipiv, and the rcond/ferr/berr trio — plus lwork and iwork (or rwork for c/z). it's giving "extended version, director's cut" 😭

       lapack_int LAPACKE_ssysvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, float
           *af, lapack_int ldaf, lapack_int *ipiv, const float *b, lapack_int
           ldb, float *x, lapack_int ldx, float *rcond, float *ferr, float
           *berr, float *work, lapack_int lwork, lapack_int *iwork)
       lapack_int LAPACKE_dsysvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, const double *a, lapack_int lda,
           double *af, lapack_int ldaf, lapack_int *ipiv, const double *b,
           lapack_int ldb, double *x, lapack_int ldx, double *rcond, double
           *ferr, double *berr, double *work, lapack_int lwork, lapack_int
           *iwork)
       lapack_int LAPACKE_csysvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, lapack_complex_float *af, lapack_int ldaf,
           lapack_int *ipiv, const lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *x, lapack_int ldx, float *rcond, float *ferr,
           float *berr, lapack_complex_float *work, lapack_int lwork, float
           *rwork)
       lapack_int LAPACKE_zsysvx_work (int matrix_layout, char fact, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_int lda, lapack_complex_double *af, lapack_int ldaf,
           lapack_int *ipiv, const lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *x, lapack_int ldx, double *rcond, double
           *ferr, double *berr, lapack_complex_double *work, lapack_int lwork,
           double *rwork)

👑 sysvxx — maximalist queen

and then there's sysvxx, which looked at sysvx and said "add everything" 💀 fact, uplo, equed, s, b, x, rcond, and rpvgrw, and berr, and n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork/rwork. forty-seven-ish arguments and not a single one is filler. periodt.

       lapack_int LAPACKE_ssysvxx_work (int matrix_layout, char fact, char
           uplo, lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float
           *af, lapack_int ldaf, lapack_int *ipiv, char *equed, float *s, float
           *b, lapack_int ldb, float *x, lapack_int ldx, float *rcond, float
           *rpvgrw, float *berr, lapack_int n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int nparams, float *params, float
           *work, lapack_int *iwork)
       lapack_int LAPACKE_dsysvxx_work (int matrix_layout, char fact, char
           uplo, lapack_int n, lapack_int nrhs, double *a, lapack_int lda,
           double *af, lapack_int ldaf, lapack_int *ipiv, char *equed, double
           *s, double *b, lapack_int ldb, double *x, lapack_int ldx, double
           *rcond, double *rpvgrw, double *berr, lapack_int n_err_bnds, double
           *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double
           *params, double *work, lapack_int *iwork)
       lapack_int LAPACKE_csysvxx_work (int matrix_layout, char fact, char
           uplo, lapack_int n, lapack_int nrhs, lapack_complex_float *a,
           lapack_int lda, lapack_complex_float *af, lapack_int ldaf,
           lapack_int *ipiv, char *equed, float *s, lapack_complex_float *b,
           lapack_int ldb, lapack_complex_float *x, lapack_int ldx, float
           *rcond, float *rpvgrw, float *berr, lapack_int n_err_bnds, float
           *err_bnds_norm, float *err_bnds_comp, lapack_int nparams, float
           *params, lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_zsysvxx_work (int matrix_layout, char fact, char
           uplo, lapack_int n, lapack_int nrhs, lapack_complex_double *a,
           lapack_int lda, lapack_complex_double *af, lapack_int ldaf,
           lapack_int *ipiv, char *equed, double *s, lapack_complex_double *b,
           lapack_int ldb, lapack_complex_double *x, lapack_int ldx, double
           *rcond, double *rpvgrw, double *berr, lapack_int n_err_bnds, double
           *err_bnds_norm, double *err_bnds_comp, lapack_int nparams, double
           *params, lapack_complex_double *work, double *rwork)

🎀 sytrd (the little pair)

just two of these — ssytrd_work and dsytrd_work — and look, d, e, and tau said hi 👋 real precision only, no complex here, don't come for me, that's literally what's written.

       lapack_int LAPACKE_ssytrd_work (int matrix_layout, char uplo, lapack_int
           n, float *a, lapack_int lda, float *d, float *e, float *tau, float
           *work, lapack_int lwork)
       lapack_int LAPACKE_dsytrd_work (int matrix_layout, char uplo, lapack_int
           n, double *a, lapack_int lda, double *d, double *e, double *tau,
           double *work, lapack_int lwork)

🧚 sytrf quartet

back to all four precisions — ipiv and work/lwork are the moment. copy-paste energy but make it ✨ intentional ✨

       lapack_int LAPACKE_ssytrf_work (int matrix_layout, char uplo, lapack_int
           n, float *a, lapack_int lda, lapack_int *ipiv, float *work,
           lapack_int lwork)
       lapack_int LAPACKE_dsytrf_work (int matrix_layout, char uplo, lapack_int
           n, double *a, lapack_int lda, lapack_int *ipiv, double *work,
           lapack_int lwork)
       lapack_int LAPACKE_csytrf_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zsytrf_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv,
           lapack_complex_double *work, lapack_int lwork)

💜 sytri quartet

note the const lapack_int *ipiv and the work pointer — and no lwork, bestie, that's not a typo, that is the signature. slay 🌈

       lapack_int LAPACKE_ssytri_work (int matrix_layout, char uplo, lapack_int
           n, float *a, lapack_int lda, const lapack_int *ipiv, float *work)
       lapack_int LAPACKE_dsytri_work (int matrix_layout, char uplo, lapack_int
           n, double *a, lapack_int lda, const lapack_int *ipiv, double *work)
       lapack_int LAPACKE_csytri_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv,
           lapack_complex_float *work)
       lapack_int LAPACKE_zsytri_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv,
           lapack_complex_double *work)

🍓 sytrs quartet

and sytrs is the lowkey minimal one — const on a and ipiv, and genuinely no work/lwork anywhere in sight. cute, clean, done. ⭐

       lapack_int LAPACKE_ssytrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const float *a, lapack_int lda, const lapack_int
           *ipiv, float *b, lapack_int ldb)
       lapack_int LAPACKE_dsytrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const double *a, lapack_int lda, const
           lapack_int *ipiv, double *b, lapack_int ldb)
       lapack_int LAPACKE_csytrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zsytrs_work (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)

💀 tbcon — and we cut mid-signature

last bit of this part: stbcon_work in full, then dtbcon_work starts and the page just... runs out. 🫠 new characters in the chat — norm, diag, kd, ab, ldab, rcond, work, iwork — so clock them now, and don't panic, dtbcon_work picks right back up in the next chunk.

       lapack_int LAPACKE_stbcon_work (int matrix_layout, char norm, char uplo,
           char diag, lapack_int n, lapack_int kd, const float *ab, lapack_int
           ldab, float *rcond, float *work, lapack_int *iwork)
       lapack_int LAPACKE_dtbcon_work (int matrix_layout, char norm, char uplo,

...aaand this one's the tail end of the double-precision tbcon buddy, mid-sentence and all — picking it up right where the page left off:

           char diag, lapack_int n, lapack_int kd, const double *ab, lapack_int
           ldab, double *rcond, double *work, lapack_int *iwork)
       lapack_int LAPACKE_ctbcon_work (int matrix_layout, char norm, char uplo,
           char diag, lapack_int n, lapack_int kd, const lapack_complex_float
           *ab, lapack_int ldab, float *rcond, lapack_complex_float *work,
           float *rwork)
       lapack_int LAPACKE_ztbcon_work (int matrix_layout, char norm, char uplo,
           char diag, lapack_int n, lapack_int kd, const lapack_complex_double
           *ab, lapack_int ldab, double *rcond, lapack_complex_double *work,
           double *rwork)

okay so the tbcon crew is COMPLETE 🎉 that's your triangular band condition-number estimators, all four flavours, and yes the complex ones get an extra rwork because complex math gotta have its little real-valued sidekick 🫶


🌸 the tbrfs girlies — triangular band, refine & error-bound

<img>no — okay, no HTML, my bad, just vibes</img>

Bestie. This is the "hey, we already solved this, but like... how wrong are we?" family. Four precisions, and the complex ones again bring rwork along like a plus-one 💅

       lapack_int LAPACKE_stbrfs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs,
           const float *ab, lapack_int ldab, const float *b, lapack_int ldb,
           const float *x, lapack_int ldx, float *ferr, float *berr, float
           *work, lapack_int *iwork)
       lapack_int LAPACKE_dtbrfs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs,
           const double *ab, lapack_int ldab, const double *b, lapack_int ldb,
           const double *x, lapack_int ldx, double *ferr, double *berr, double
           *work, lapack_int *iwork)
       lapack_int LAPACKE_ctbrfs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs,
           const lapack_complex_float *ab, lapack_int ldab, const
           lapack_complex_float *b, lapack_int ldb, const lapack_complex_float
           *x, lapack_int ldx, float *ferr, float *berr, lapack_complex_float
           *work, float *rwork)
       lapack_int LAPACKE_ztbrfs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs,
           const lapack_complex_double *ab, lapack_int ldab, const
           lapack_complex_double *b, lapack_int ldb, const
           lapack_complex_double *x, lapack_int ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork)

Note how they all take ferr and berr — two whole error outputs, like, they really said "you're getting both, don't argue" 😭


✨ tbtrs — triangular band, actually solving it

       lapack_int LAPACKE_stbtrs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs,
           const float *ab, lapack_int ldab, float *b, lapack_int ldb)
       lapack_int LAPACKE_dtbtrs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs,
           const double *ab, lapack_int ldab, double *b, lapack_int ldb)
       lapack_int LAPACKE_ctbtrs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs,
           const lapack_complex_float *ab, lapack_int ldab,
           lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_ztbtrs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs,
           const lapack_complex_double *ab, lapack_int ldab,
           lapack_complex_double *b, lapack_int ldb)

look at these minimal queens — no work, no rwork, no iwork, just the absolute bare necessities 😌 the _work suffix is still there but honestly they're barely working, periodt.


🎀 tfsm — triangular, "R" storage, matrix-matrix solve

This is the one where the letter salad really pops off: transr, side, uplo, trans, diag — five whole chars before you even get to a number. Iconic honestly.

       lapack_int LAPACKE_stfsm_work (int matrix_layout, char transr, char
           side, char uplo, char trans, char diag, lapack_int m, lapack_int n,
           float alpha, const float *a, float *b, lapack_int ldb)
       lapack_int LAPACKE_dtfsm_work (int matrix_layout, char transr, char
           side, char uplo, char trans, char diag, lapack_int m, lapack_int n,
           double alpha, const double *a, double *b, lapack_int ldb)
       lapack_int LAPACKE_ctfsm_work (int matrix_layout, char transr, char
           side, char uplo, char trans, char diag, lapack_int m, lapack_int n,
           lapack_complex_float alpha, const lapack_complex_float *a,
           lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_ztfsm_work (int matrix_layout, char transr, char
           side, char uplo, char trans, char diag, lapack_int m, lapack_int n,
           lapack_complex_double alpha, const lapack_complex_double *a,
           lapack_complex_double *b, lapack_int ldb)

alpha is by value in every single one of these, so yes, the scalar just walks on in 🚶‍♀️ no pointer, no drama.


🦋 tftri — triangular inverse, the short one

       lapack_int LAPACKE_stftri_work (int matrix_layout, char transr, char
           uplo, char diag, lapack_int n, float *a)
       lapack_int LAPACKE_dtftri_work (int matrix_layout, char transr, char
           uplo, char diag, lapack_int n, double *a)
       lapack_int LAPACKE_ctftri_work (int matrix_layout, char transr, char
           uplo, char diag, lapack_int n, lapack_complex_float *a)
       lapack_int LAPACKE_ztftri_work (int matrix_layout, char transr, char
           uplo, char diag, lapack_int n, lapack_complex_double *a)

Five arguments total. FIVE. That's it. That's the whole function. She's low-maintenance and she knows it 💅


💜 tfttp — packed triangular → packed triangular

The "I'm literally just reorganising myself" saga, part one. arf goes in (const, of course, she's not getting touched), ap comes out.

       lapack_int LAPACKE_stfttp_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const float *arf, float *ap)
       lapack_int LAPACKE_dtfttp_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const double *arf, double *ap)
       lapack_int LAPACKE_ctfttp_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const lapack_complex_float *arf,
           lapack_complex_float *ap)
       lapack_int LAPACKE_ztfttp_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const lapack_complex_double *arf,
           lapack_complex_double *ap)

🌈 tfttr — packed triangular → full triangular

Same energy, but this time the destination gets a real leading dimension (lda) because she's a whole full-storage array now. Glow-up behaviour ✨

       lapack_int LAPACKE_stfttr_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const float *arf, float *a, lapack_int lda)
       lapack_int LAPACKE_dtfttr_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const double *arf, double *a, lapack_int lda)
       lapack_int LAPACKE_ctfttr_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const lapack_complex_float *arf,
           lapack_complex_float *a, lapack_int lda)
       lapack_int LAPACKE_ztfttr_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const lapack_complex_double *arf,
           lapack_complex_double *a, lapack_int lda)

👑 tgevc — generalized eigenvectors, the fancy one

Okay this is a big signature and it deserves respect. Note select is a const lapack_logical * (a whole boolean array, not a char, not an int — lapack_logical, periodt), and the output count m is a lapack_int * because obviously she's gonna tell you how many she actually gave you.

       lapack_int LAPACKE_stgevc_work (int matrix_layout, char side, char
           howmny, const lapack_logical *select, lapack_int n, const float *s,
           lapack_int lds, const float *p, lapack_int ldp, float *vl,
           lapack_int ldvl, float *vr, lapack_int ldvr, lapack_int mm,
           lapack_int *m, float *work)
       lapack_int LAPACKE_dtgevc_work (int matrix_layout, char side, char
           howmny, const lapack_logical *select, lapack_int n, const double *s,
           lapack_int lds, const double *p, lapack_int ldp, double *vl,
           lapack_int ldvl, double *vr, lapack_int ldvr, lapack_int mm,
           lapack_int *m, double *work)
       lapack_int LAPACKE_ctgevc_work (int matrix_layout, char side, char
           howmny, const lapack_logical *select, lapack_int n, const
           lapack_complex_float *s, lapack_int lds, const lapack_complex_float
           *p, lapack_int ldp, lapack_complex_float *vl, lapack_int ldvl,
           lapack_complex_float *vr, lapack_int ldvr, lapack_int mm, lapack_int
           *m, lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_ztgevc_work (int matrix_layout, char side, char
           howmny, const lapack_logical *select, lapack_int n, const
           lapack_complex_double *s, lapack_int lds, const
           lapack_complex_double *p, lapack_int ldp, lapack_complex_double *vl,
           lapack_int ldvl, lapack_complex_double *vr, lapack_int ldvr,
           lapack_int mm, lapack_int *m, lapack_complex_double *work, double
           *rwork)

Left vectors and right vectors, vl and vr, both with their own lds. Overachiever behaviour 🫶

heads up bestie: these take n, lds, ldp, ldvl, ldvr, mm — that is a LOT of integers that all have to agree with each other. Copy them character for character and don't get cute with reordering. 🙈

🔥 tgexc — swap two generalized eigenvalues, reorder arc

And here comes the plot twist: the complex versions of this one drop work/lwork entirely and take ifst / ilst as plain lapack_int values instead of pointers. Not a typo. That's just how she's built. 💀

       lapack_int LAPACKE_stgexc_work (int matrix_layout, lapack_logical wantq,
           lapack_logical wantz, lapack_int n, float *a, lapack_int lda, float
           *b, lapack_int ldb, float *q, lapack_int ldq, float *z, lapack_int
           ldz, lapack_int *ifst, lapack_int *ilst, float *work, lapack_int
           lwork)
       lapack_int LAPACKE_dtgexc_work (int matrix_layout, lapack_logical wantq,
           lapack_logical wantz, lapack_int n, double *a, lapack_int lda,
           double *b, lapack_int ldb, double *q, lapack_int ldq, double *z,
           lapack_int ldz, lapack_int *ifst, lapack_int *ilst, double *work,
           lapack_int lwork)
       lapack_int LAPACKE_ctgexc_work (int matrix_layout, lapack_logical wantq,
           lapack_logical wantz, lapack_int n, lapack_complex_float *a,
           lapack_int lda, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *q, lapack_int ldq, lapack_complex_float *z,
           lapack_int ldz, lapack_int ifst, lapack_int ilst)
       lapack_int LAPACKE_ztgexc_work (int matrix_layout, lapack_logical wantq,
           lapack_logical wantz, lapack_int n, lapack_complex_double *a,
           lapack_int lda, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *q, lapack_int ldq, lapack_complex_double *z,
           lapack_int ldz, lapack_int ifst, lapack_int ilst)

fr fr — check the s/d ones against the c/z ones before you compile. The signatures genuinely differ. Not me being dramatic, that's just on the page. 😭


🧚 tgsen — the "sel" of select, plus pl/pr/dif, plus work AND iwork

Biggest diva in the whole chunk. ijob, wantq, wantz, a select array, m, then pl, pr, dif, then work + lwork and iwork + liwork. She requires two different kinds of workspace. Two.

       lapack_int LAPACKE_stgsen_work (int matrix_layout, lapack_int ijob,
           lapack_logical wantq, lapack_logical wantz, const lapack_logical
           *select, lapack_int n, float *a, lapack_int lda, float *b,
           lapack_int ldb, float *alphar, float *alphai, float *beta, float *q,
           lapack_int ldq, float *z, lapack_int ldz, lapack_int *m, float *pl,
           float *pr, float *dif, float *work, lapack_int lwork, lapack_int
           *iwork, lapack_int liwork)
       lapack_int LAPACKE_dtgsen_work (int matrix_layout, lapack_int ijob,
           lapack_logical wantq, lapack_logical wantz, const lapack_logical
           *select, lapack_int n, double *a, lapack_int lda, double *b,
           lapack_int ldb, double *alphar, double *alphai, double *beta, double
           *q, lapack_int ldq, double *z, lapack_int ldz, lapack_int *m, double
           *pl, double *pr, double *dif, double *work, lapack_int lwork,
           lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_ctgsen_work (int matrix_layout, lapack_int ijob,
           lapack_logical wantq, lapack_logical wantz, const lapack_logical
           *select, lapack_int n, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *b, lapack_int ldb, lapack_complex_float
           *alpha, lapack_complex_float *beta, lapack_complex_float *q,
           lapack_int ldq, lapack_complex_float *z, lapack_int ldz, lapack_int
           *m, float *pl, float *pr, float *dif, lapack_complex_float *work,
           lapack_int lwork, lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_ztgsen_work (int matrix_layout, lapack_int ijob,
           lapack_logical wantq, lapack_logical wantz, const lapack_logical
           *select, lapack_int n, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double
           *alpha, lapack_complex_double *beta, lapack_complex_double *q,
           lapack_int ldq, lapack_complex_double *z, lapack_int ldz, lapack_int
           *m, double *pl, double *pr, double *dif, lapack_complex_double
           *work, lapack_int lwork, lapack_int *iwork, lapack_int liwork)

tiny detail that matters: real flavours get alphar + alphai; complex flavours get one single alpha. Also pl, pr, dif stay real (float/double) even in the complex versions. Keep that in mind and don't "helpfully" complex-ify them 🙈


🍓 tgsja — the letters, the tolerances, and ncycle

Last up in this batch: jobu, jobv, jobq (three whole job chars, she's thorough), m, p, n, k, l, tolerances tola and tolb by value, then alpha, beta, u, v, q all with their own lds, plus work and finally ncycle as a lapack_int *.

       lapack_int LAPACKE_stgsja_work (int matrix_layout, char jobu, char jobv,
           char jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
           lapack_int l, float *a, lapack_int lda, float *b, lapack_int ldb,
           float tola, float tolb, float *alpha, float *beta, float *u,
           lapack_int ldu, float *v, lapack_int ldv, float *q, lapack_int ldq,
           float *work, lapack_int *ncycle)
       lapack_int LAPACKE_dtgsja_work (int matrix_layout, char jobu, char jobv,
           char jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
           lapack_int l, double *a, lapack_int lda, double *b, lapack_int ldb,
           double tola, double tolb, double *alpha, double *beta, double *u,
           lapack_int ldu, double *v, lapack_int ldv, double *q, lapack_int
           ldq, double *work, lapack_int *ncycle)

And that's where this chunk of the list runs out — more signatures incoming, don't you dare close the tab 💖

🫶 the tgsja girls (generalized, and yes they brought friends)

okay so first up, two tgsja prototypes — c for the float-complex vibe and z for the double-complex vibe. look at all those chars bestie, jobu, jobv, jobq, they really said "you're gonna tell me what to compute, I'm not guessing":

lapack_int LAPACKE_ctgsja_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
    lapack_int l, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *b, lapack_int ldb, float tola, float tolb,
    float *alpha, float *beta, lapack_complex_float *u, lapack_int ldu,
    lapack_complex_float *v, lapack_int ldv, lapack_complex_float *q,
    lapack_int ldq, lapack_complex_float *work, lapack_int *ncycle)
lapack_int LAPACKE_ztgsja_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
    lapack_int l, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *b, lapack_int ldb, double tola, double tolb,
    double *alpha, double *beta, lapack_complex_double *u, lapack_int
    ldu, lapack_complex_double *v, lapack_int ldv, lapack_complex_double
    *q, lapack_int ldq, lapack_complex_double *work, lapack_int *ncycle)

note the tola / tolb float-and-double situation, and ncycle at the very end living its best pointer life 💅


🌸 tgsna — four of them, one per precision

job, howmny, select, and then the whole s / dif moment with mm and m — yeah she's thorough. single precision <red>*s*</red> and <red>*dif*</red>, double precision versions too:

lapack_int LAPACKE_stgsna_work (int matrix_layout, char job, char
    howmny, const lapack_logical *select, lapack_int n, const float *a,
    lapack_int lda, const float *b, lapack_int ldb, const float *vl,
    lapack_int ldvl, const float *vr, lapack_int ldvr, float *s, float
    *dif, lapack_int mm, lapack_int *m, float *work, lapack_int lwork,
    lapack_int *iwork)
lapack_int LAPACKE_dtgsna_work (int matrix_layout, char job, char
    howmny, const lapack_logical *select, lapack_int n, const double *a,
    lapack_int lda, const double *b, lapack_int ldb, const double *vl,
    lapack_int ldvl, const double *vr, lapack_int ldvr, double *s,
    double *dif, lapack_int mm, lapack_int *m, double *work, lapack_int
    lwork, lapack_int *iwork)
lapack_int LAPACKE_ctgsna_work (int matrix_layout, char job, char
    howmny, const lapack_logical *select, lapack_int n, const
    lapack_complex_float *a, lapack_int lda, const lapack_complex_float
    *b, lapack_int ldb, const lapack_complex_float *vl, lapack_int ldvl,
    const lapack_complex_float *vr, lapack_int ldvr, float *s, float
    *dif, lapack_int mm, lapack_int *m, lapack_complex_float *work,
    lapack_int lwork, lapack_int *iwork)
lapack_int LAPACKE_ztgsna_work (int matrix_layout, char job, char
    howmny, const lapack_logical *select, lapack_int n, const
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *b, lapack_int ldb, const
    lapack_complex_double *vl, lapack_int ldvl, const
    lapack_complex_double *vr, lapack_int ldvr, double *s, double *dif,
    lapack_int mm, lapack_int *m, lapack_complex_double *work,
    lapack_int lwork, lapack_int *iwork)

👀 the complex ones keep <pink>*s*</pink> and <pink>*dif*</pink> as real types (float / double) while the matrices go complex — iconic behaviour, no notes.


🦋 tgsyl — same lineup, now with <purple>ijob</purple> and trans

ijob is a lapack_int here, not a char, so bestie really said "numbers only". a b c d e f and then scale, dif, work, iwork because obviously:

lapack_int LAPACKE_stgsyl_work (int matrix_layout, char trans,
    lapack_int ijob, lapack_int m, lapack_int n, const float *a,
    lapack_int lda, const float *b, lapack_int ldb, float *c, lapack_int
    ldc, const float *d, lapack_int ldd, const float *e, lapack_int lde,
    float *f, lapack_int ldf, float *scale, float *dif, float *work,
    lapack_int lwork, lapack_int *iwork)
lapack_int LAPACKE_dtgsyl_work (int matrix_layout, char trans,
    lapack_int ijob, lapack_int m, lapack_int n, const double *a,
    lapack_int lda, const double *b, lapack_int ldb, double *c,
    lapack_int ldc, const double *d, lapack_int ldd, const double *e,
    lapack_int lde, double *f, lapack_int ldf, double *scale, double
    *dif, double *work, lapack_int lwork, lapack_int *iwork)
lapack_int LAPACKE_ctgsyl_work (int matrix_layout, char trans,
    lapack_int ijob, lapack_int m, lapack_int n, const
    lapack_complex_float *a, lapack_int lda, const lapack_complex_float
    *b, lapack_int ldb, lapack_complex_float *c, lapack_int ldc, const
    lapack_complex_float *d, lapack_int ldd, const lapack_complex_float
    *e, lapack_int lde, lapack_complex_float *f, lapack_int ldf, float
    *scale, float *dif, lapack_complex_float *work, lapack_int lwork,
    lapack_int *iwork)
lapack_int LAPACKE_ztgsyl_work (int matrix_layout, char trans,
    lapack_int ijob, lapack_int m, lapack_int n, const
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double *c,
    lapack_int ldc, const lapack_complex_double *d, lapack_int ldd,
    const lapack_complex_double *e, lapack_int lde,
    lapack_complex_double *f, lapack_int ldf, double *scale, double
    *dif, lapack_complex_double *work, lapack_int lwork, lapack_int
    *iwork)

🎀 welcome to the packed-triangular era (tp gang, we stan)

so from here on the names all start with ?tp and honestly the way they rolled out norm, uplo, diag, ap… it's giving "I memorized the whole grid". tpcon squad, all four:

lapack_int LAPACKE_stpcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const float *ap, float *rcond, float *work,
    lapack_int *iwork)
lapack_int LAPACKE_dtpcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const double *ap, double *rcond, double
    *work, lapack_int *iwork)
lapack_int LAPACKE_ctpcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const lapack_complex_float *ap, float
    *rcond, lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_ztpcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const lapack_complex_double *ap, double
    *rcond, lapack_complex_double *work, double *rwork)

the complex ones swap iwork for a real rwork btw — ctpcon gets float *rwork, ztpcon gets double *rwork, and the real ones keep their lapack_int *iwork. slay, different strokes 🫶

tprfs next, and now we have trans, nrhs, b, x, plus the error-estimate duo ferr and berr:

lapack_int LAPACKE_stprfs_work (int matrix_layout, char uplo, char
    trans, char diag, lapack_int n, lapack_int nrhs, const float *ap,
    const float *b, lapack_int ldb, const float *x, lapack_int ldx,
    float *ferr, float *berr, float *work, lapack_int *iwork)
lapack_int LAPACKE_dtprfs_work (int matrix_layout, char uplo, char
    trans, char diag, lapack_int n, lapack_int nrhs, const double *ap,
    const double *b, lapack_int ldb, const double *x, lapack_int ldx,
    double *ferr, double *berr, double *work, lapack_int *iwork)
lapack_int LAPACKE_ctprfs_work (int matrix_layout, char uplo, char
    trans, char diag, lapack_int n, lapack_int nrhs, const
    lapack_complex_float *ap, const lapack_complex_float *b, lapack_int
    ldb, const lapack_complex_float *x, lapack_int ldx, float *ferr,
    float *berr, lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_ztprfs_work (int matrix_layout, char uplo, char
    trans, char diag, lapack_int n, lapack_int nrhs, const
    lapack_complex_double *ap, const lapack_complex_double *b,
    lapack_int ldb, const lapack_complex_double *x, lapack_int ldx,
    double *ferr, double *berr, lapack_complex_double *work, double
    *rwork)

tptri is the short one and honestly, shortest king energy — no nrhs, no work, just vibes:

lapack_int LAPACKE_stptri_work (int matrix_layout, char uplo, char diag,
    lapack_int n, float *ap)
lapack_int LAPACKE_dtptri_work (int matrix_layout, char uplo, char diag,
    lapack_int n, double *ap)
lapack_int LAPACKE_ctptri_work (int matrix_layout, char uplo, char diag,
    lapack_int n, lapack_complex_float *ap)
lapack_int LAPACKE_ztptri_work (int matrix_layout, char uplo, char diag,
    lapack_int n, lapack_complex_double *ap)

tptrs — she's a solver-coded girlie, trans, diag, nrhs, ap, b, ldb, done:

lapack_int LAPACKE_stptrs_work (int matrix_layout, char uplo, char
    trans, char diag, lapack_int n, lapack_int nrhs, const float *ap,
    float *b, lapack_int ldb)
lapack_int LAPACKE_dtptrs_work (int matrix_layout, char uplo, char
    trans, char diag, lapack_int n, lapack_int nrhs, const double *ap,
    double *b, lapack_int ldb)
lapack_int LAPACKE_ctptrs_work (int matrix_layout, char uplo, char
    trans, char diag, lapack_int n, lapack_int nrhs, const
    lapack_complex_float *ap, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_ztptrs_work (int matrix_layout, char uplo, char
    trans, char diag, lapack_int n, lapack_int nrhs, const
    lapack_complex_double *ap, lapack_complex_double *b, lapack_int ldb)

then the format-shifters: tpttf takes transr + uplo and hands you an arf, tpttr takes uplo and hands you a full a with an lda:

lapack_int LAPACKE_stpttf_work (int matrix_layout, char transr, char
    uplo, lapack_int n, const float *ap, float *arf)
lapack_int LAPACKE_dtpttf_work (int matrix_layout, char transr, char
    uplo, lapack_int n, const double *ap, double *arf)
lapack_int LAPACKE_ctpttf_work (int matrix_layout, char transr, char
    uplo, lapack_int n, const lapack_complex_float *ap,
    lapack_complex_float *arf)
lapack_int LAPACKE_ztpttf_work (int matrix_layout, char transr, char
    uplo, lapack_int n, const lapack_complex_double *ap,
    lapack_complex_double *arf)
lapack_int LAPACKE_stpttr_work (int matrix_layout, char uplo, lapack_int
    n, const float *ap, float *a, lapack_int lda)
lapack_int LAPACKE_dtpttr_work (int matrix_layout, char uplo, lapack_int
    n, const double *ap, double *a, lapack_int lda)
lapack_int LAPACKE_ctpttr_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_float *ap, lapack_complex_float *a,
    lapack_int lda)
lapack_int LAPACKE_ztpttr_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_double *ap, lapack_complex_double *a,
    lapack_int lda)

look at transr for tpttf vs plain uplo for tpttr — one extra letter, huge difference, iykyk 💖


🌈 plain tr triangular era: trcon

yes she has an lda now because we left packed-land, and yes rcond is still the main character:

lapack_int LAPACKE_strcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const float *a, lapack_int lda, float
    *rcond, float *work, lapack_int *iwork)
lapack_int LAPACKE_dtrcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const double *a, lapack_int lda, double
    *rcond, double *work, lapack_int *iwork)
lapack_int LAPACKE_ctrcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const lapack_complex_float *a, lapack_int
    lda, float *rcond, lapack_complex_float *work, float *rwork)
lapack_int LAPACKE_ztrcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const lapack_complex_double *a, lapack_int
    lda, double *rcond, lapack_complex_double *work, double *rwork)

⭐ trevc — eigenvectors entered the chat

side, howmny, select, vl/vr with their own ldvl/ldvr, then mm in and *m out. note that in the real versions select is a non-const lapack_logical *, but in the complex ones it's const lapack_logical * — do not mix those up bestie, that's the kind of thing that ruins your whole Tuesday 😭

lapack_int LAPACKE_strevc_work (int matrix_layout, char side, char
    howmny, lapack_logical *select, lapack_int n, const float *t,
    lapack_int ldt, float *vl, lapack_int ldvl, float *vr, lapack_int
    ldvr, lapack_int mm, lapack_int *m, float *work)
lapack_int LAPACKE_dtrevc_work (int matrix_layout, char side, char
    howmny, lapack_logical *select, lapack_int n, const double *t,
    lapack_int ldt, double *vl, lapack_int ldvl, double *vr, lapack_int
    ldvr, lapack_int mm, lapack_int *m, double *work)
lapack_int LAPACKE_ctrevc_work (int matrix_layout, char side, char
    howmny, const lapack_logical *select, lapack_int n,
    lapack_complex_float *t, lapack_int ldt, lapack_complex_float *vl,
    lapack_int ldvl, lapack_complex_float *vr, lapack_int ldvr,
    lapack_int mm, lapack_int *m, lapack_complex_float *work, float
    *rwork)
lapack_int LAPACKE_ztrevc_work (int matrix_layout, char side, char
    howmny, const lapack_logical *select, lapack_int n,
    lapack_complex_double *t, lapack_int ldt, lapack_complex_double *vl,
    lapack_int ldvl, lapack_complex_double *vr, lapack_int ldvr,
    lapack_int mm, lapack_int *m, lapack_complex_double *work, double
    *rwork)

and then trexc starts, with a compq that we're absolutely gonna finish talking about in the next bit 👑

lapack_int LAPACKE_strexc_work (int matrix_layout, char compq,

...and we're still out here in prototype city, bestie, no thoughts just _work routines 💅 Picking up exactly where we left off:

           lapack_int n, float *t, lapack_int ldt, float *q, lapack_int ldq,
           lapack_int *ifst, lapack_int *ilst, float *work)
       lapack_int LAPACKE_dtrexc_work (int matrix_layout, char compq,
           lapack_int n, double *t, lapack_int ldt, double *q, lapack_int ldq,
           lapack_int *ifst, lapack_int *ilst, double *work)
       lapack_int LAPACKE_ctrexc_work (int matrix_layout, char compq,
           lapack_int n, lapack_complex_float *t, lapack_int ldt,
           lapack_complex_float *q, lapack_int ldq, lapack_int ifst, lapack_int
           ilst)
       lapack_int LAPACKE_ztrexc_work (int matrix_layout, char compq,
           lapack_int n, lapack_complex_double *t, lapack_int ldt,
           lapack_complex_double *q, lapack_int ldq, lapack_int ifst,
           lapack_int ilst)

trexc squad, reordered and ready ✨ and yeah, clock the glow-up: the real ones take lapack_int *ifst / lapack_int *ilst (pointers, bestie) while the complex ones take plain lapack_int ifst / lapack_int ilst. That's just what the signatures say, don't come for me 😭


Next up, trrfs — the error-bound girlies, all four of them, with their ferr/berr moment 🎀

       lapack_int LAPACKE_strrfs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int nrhs, const float *a,
           lapack_int lda, const float *b, lapack_int ldb, const float *x,
           lapack_int ldx, float *ferr, float *berr, float *work, lapack_int
           *iwork)
       lapack_int LAPACKE_dtrrfs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int nrhs, const double *a,
           lapack_int lda, const double *b, lapack_int ldb, const double *x,
           lapack_int ldx, double *ferr, double *berr, double *work, lapack_int
           *iwork)
       lapack_int LAPACKE_ctrrfs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int nrhs, const
           lapack_complex_float *a, lapack_int lda, const lapack_complex_float
           *b, lapack_int ldb, const lapack_complex_float *x, lapack_int ldx,
           float *ferr, float *berr, lapack_complex_float *work, float *rwork)
       lapack_int LAPACKE_ztrrfs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int nrhs, const
           lapack_complex_double *a, lapack_int lda, const
           lapack_complex_double *b, lapack_int ldb, const
           lapack_complex_double *x, lapack_int ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork)

lowkey obsessed with how c/z swap the lapack_int *iwork for a float *rwork / double *rwork. It's giving "same energy, different accessories" 🦋


Now the trsen girlies — select, wr, wi, m, s, sep, plus lwork and liwork, because she does the absolute most and we respect it 👑

       lapack_int LAPACKE_strsen_work (int matrix_layout, char job, char compq,
           const lapack_logical *select, lapack_int n, float *t, lapack_int
           ldt, float *q, lapack_int ldq, float *wr, float *wi, lapack_int *m,
           float *s, float *sep, float *work, lapack_int lwork, lapack_int
           *iwork, lapack_int liwork)
       lapack_int LAPACKE_dtrsen_work (int matrix_layout, char job, char compq,
           const lapack_logical *select, lapack_int n, double *t, lapack_int
           ldt, double *q, lapack_int ldq, double *wr, double *wi, lapack_int
           *m, double *s, double *sep, double *work, lapack_int lwork,
           lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_ctrsen_work (int matrix_layout, char job, char compq,
           const lapack_logical *select, lapack_int n, lapack_complex_float *t,
           lapack_int ldt, lapack_complex_float *q, lapack_int ldq,
           lapack_complex_float *w, lapack_int *m, float *s, float *sep,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_ztrsen_work (int matrix_layout, char job, char compq,
           const lapack_logical *select, lapack_int n, lapack_complex_double
           *t, lapack_int ldt, lapack_complex_double *q, lapack_int ldq,
           lapack_complex_double *w, lapack_int *m, double *s, double *sep,
           lapack_complex_double *work, lapack_int lwork)

Note the complex ones bring one w instead of wr + wi, and they drop iwork/liwork entirely. Main character efficiency, honestly 💅


trsna says hi with vl, vr, howmny, mm and a whole ldwork situation 🌸

       lapack_int LAPACKE_strsna_work (int matrix_layout, char job, char
           howmny, const lapack_logical *select, lapack_int n, const float *t,
           lapack_int ldt, const float *vl, lapack_int ldvl, const float *vr,
           lapack_int ldvr, float *s, float *sep, lapack_int mm, lapack_int *m,
           float *work, lapack_int ldwork, lapack_int *iwork)
       lapack_int LAPACKE_dtrsna_work (int matrix_layout, char job, char
           howmny, const lapack_logical *select, lapack_int n, const double *t,
           lapack_int ldt, const double *vl, lapack_int ldvl, const double *vr,
           lapack_int ldvr, double *s, double *sep, lapack_int mm, lapack_int
           *m, double *work, lapack_int ldwork, lapack_int *iwork)
       lapack_int LAPACKE_ctrsna_work (int matrix_layout, char job, char
           howmny, const lapack_logical *select, lapack_int n, const
           lapack_complex_float *t, lapack_int ldt, const lapack_complex_float
           *vl, lapack_int ldvl, const lapack_complex_float *vr, lapack_int
           ldvr, float *s, float *sep, lapack_int mm, lapack_int *m,
           lapack_complex_float *work, lapack_int ldwork, float *rwork)
       lapack_int LAPACKE_ztrsna_work (int matrix_layout, char job, char
           howmny, const lapack_logical *select, lapack_int n, const
           lapack_complex_double *t, lapack_int ldt, const
           lapack_complex_double *vl, lapack_int ldvl, const
           lapack_complex_double *vr, lapack_int ldvr, double *s, double *sep,
           lapack_int mm, lapack_int *m, lapack_complex_double *work,
           lapack_int ldwork, double *rwork)

ldwork is a thing here, not lwork — read it twice, bestie, I'm not kidding 🙈 And again rwork for the complex girlies.


trsyl</> — wait, markdown: trsyl time, with trana, tranb, isgn, and the icon that is scale ⭐

       lapack_int LAPACKE_strsyl_work (int matrix_layout, char trana, char
           tranb, lapack_int isgn, lapack_int m, lapack_int n, const float *a,
           lapack_int lda, const float *b, lapack_int ldb, float *c, lapack_int
           ldc, float *scale)
       lapack_int LAPACKE_dtrsyl_work (int matrix_layout, char trana, char
           tranb, lapack_int isgn, lapack_int m, lapack_int n, const double *a,
           lapack_int lda, const double *b, lapack_int ldb, double *c,
           lapack_int ldc, double *scale)
       lapack_int LAPACKE_ctrsyl_work (int matrix_layout, char trana, char
           tranb, lapack_int isgn, lapack_int m, lapack_int n, const
           lapack_complex_float *a, lapack_int lda, const lapack_complex_float
           *b, lapack_int ldb, lapack_complex_float *c, lapack_int ldc, float
           *scale)
       lapack_int LAPACKE_ztrsyl_work (int matrix_layout, char trana, char
           tranb, lapack_int isgn, lapack_int m, lapack_int n, const
           lapack_complex_double *a, lapack_int lda, const
           lapack_complex_double *b, lapack_int ldb, lapack_complex_double *c,
           lapack_int ldc, double *scale)

No work array, no lwork — she's low-maintenance and that's iconic 🎀


trtri and trtrs, the tiny faves 💚

       lapack_int LAPACKE_strtri_work (int matrix_layout, char uplo, char diag,
           lapack_int n, float *a, lapack_int lda)
       lapack_int LAPACKE_dtrtri_work (int matrix_layout, char uplo, char diag,
           lapack_int n, double *a, lapack_int lda)
       lapack_int LAPACKE_ctrtri_work (int matrix_layout, char uplo, char diag,
           lapack_int n, lapack_complex_float *a, lapack_int lda)
       lapack_int LAPACKE_ztrtri_work (int matrix_layout, char uplo, char diag,
           lapack_int n, lapack_complex_double *a, lapack_int lda)
       lapack_int LAPACKE_strtrs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int nrhs, const float *a,
           lapack_int lda, float *b, lapack_int ldb)
       lapack_int LAPACKE_dtrtrs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int nrhs, const double *a,
           lapack_int lda, double *b, lapack_int ldb)
       lapack_int LAPACKE_ctrtrs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int nrhs, const
           lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
           lapack_int ldb)
       lapack_int LAPACKE_ztrtrs_work (int matrix_layout, char uplo, char
           trans, char diag, lapack_int n, lapack_int nrhs, const
           lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
           lapack_int ldb)

Look at that — no lwork anywhere in this whole block. A whole family with zero work arrays, we love a self-sufficient queen ✨


The trttf / trttp pack, aka the "pack it up, we're going triangular" duo 🦋

       lapack_int LAPACKE_strttf_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const float *a, lapack_int lda, float *arf)
       lapack_int LAPACKE_dtrttf_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const double *a, lapack_int lda, double *arf)
       lapack_int LAPACKE_ctrttf_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *arf)
       lapack_int LAPACKE_ztrttf_work (int matrix_layout, char transr, char
           uplo, lapack_int n, const lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *arf)
       lapack_int LAPACKE_strttp_work (int matrix_layout, char uplo, lapack_int
           n, const float *a, lapack_int lda, float *ap)
       lapack_int LAPACKE_dtrttp_work (int matrix_layout, char uplo, lapack_int
           n, const double *a, lapack_int lda, double *ap)
       lapack_int LAPACKE_ctrttp_work (int matrix_layout, char uplo, lapack_int
           n, const lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *ap)
       lapack_int LAPACKE_ztrttp_work (int matrix_layout, char uplo, lapack_int
           n, const lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *ap)

trttf gets a transr and outputs arf; trttp outputs ap and has no transr. Similar vibes, different destinies 💫


tzrzf — RZ factorization crew, tau and lwork included 🔥

       lapack_int LAPACKE_stzrzf_work (int matrix_layout, lapack_int m,
           lapack_int n, float *a, lapack_int lda, float *tau, float *work,
           lapack_int lwork)
       lapack_int LAPACKE_dtzrzf_work (int matrix_layout, lapack_int m,
           lapack_int n, double *a, lapack_int lda, double *tau, double *work,
           lapack_int lwork)
       lapack_int LAPACKE_ctzrzf_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *tau, lapack_complex_float *work, lapack_int
           lwork)
       lapack_int LAPACKE_ztzrzf_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_complex_double *a, lapack_int lda,
           lapack_complex_double *tau, lapack_complex_double *work, lapack_int
           lwork)

And now the unghr/ungbr/unglq/ungql complex-only era — note the c/z prefixes, there's no s/d here at all, this is a complex-only party 👑🧚

       lapack_int LAPACKE_cungbr_work (int matrix_layout, char vect, lapack_int
           m, lapack_int n, lapack_int k, lapack_complex_float *a, lapack_int
           lda, const lapack_complex_float *tau, lapack_complex_float *work,
           lapack_int lwork)
       lapack_int LAPACKE_zungbr_work (int matrix_layout, char vect, lapack_int
           m, lapack_int n, lapack_int k, lapack_complex_double *a, lapack_int
           lda, const lapack_complex_double *tau, lapack_complex_double *work,
           lapack_int lwork)
       lapack_int LAPACKE_cunghr_work (int matrix_layout, lapack_int n,
           lapack_int ilo, lapack_int ihi, lapack_complex_float *a, lapack_int
           lda, const lapack_complex_float *tau, lapack_complex_float *work,
           lapack_int lwork)
       lapack_int LAPACKE_zunghr_work (int matrix_layout, lapack_int n,
           lapack_int ilo, lapack_int ihi, lapack_complex_double *a, lapack_int
           lda, const lapack_complex_double *tau, lapack_complex_double *work,
           lapack_int lwork)
       lapack_int LAPACKE_cunglq_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int k, lapack_complex_float *a, lapack_int lda,
           const lapack_complex_float *tau, lapack_complex_float *work,
           lapack_int lwork)
       lapack_int LAPACKE_zunglq_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int k, lapack_complex_double *a, lapack_int
           lda, const lapack_complex_double *tau, lapack_complex_double *work,
           lapack_int lwork)
       lapack_int LAPACKE_cungql_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int k, lapack_complex_float *a, lapack_int lda,
           const lapack_complex_float *tau, lapack_complex_float *work,
           lapack_int lwork)
       lapack_int LAPACKE_zungql_work (int matrix_layout, lapack_int m,

...and yes, we're cutting off mid-signature again, because of course we are 😭 Hold that thought, bestie — next part picks it right back up 💖

…and we're picking up mid-signature, bestie, no big deal — this is the tail end of one of those _work prototypes:

       lapack_int n, lapack_int k, lapack_complex_double *a, lapack_int
           lda, const lapack_complex_double *tau, lapack_complex_double *work,
           lapack_int lwork)

Then the full crew shows up 💅 — ungqr first, single-precision complex (c) and double-precision complex (z). You can literally clock which is which by the types: lapack_complex_float vs lapack_complex_double, no guessing needed:

       lapack_int LAPACKE_cungqr_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int k, lapack_complex_float *a, lapack_int lda,
           const lapack_complex_float *tau, lapack_complex_float *work,
           lapack_int lwork)
       lapack_int LAPACKE_zungqr_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int k, lapack_complex_double *a, lapack_int
           lda, const lapack_complex_double *tau, lapack_complex_double *work,
           lapack_int lwork)

Same energy, different last three letters — ungrq, and yes they both still take matrix_layout, m, n, k, a, lda, tau, work, lwork in that exact order 🎀

       lapack_int LAPACKE_cungrq_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int k, lapack_complex_float *a, lapack_int lda,
           const lapack_complex_float *tau, lapack_complex_float *work,
           lapack_int lwork)
       lapack_int LAPACKE_zungrq_work (int matrix_layout, lapack_int m,
           lapack_int n, lapack_int k, lapack_complex_double *a, lapack_int
           lda, const lapack_complex_double *tau, lapack_complex_double *work,
           lapack_int lwork)

And then ungtr said "hold my uplo" — these swap the m/n/k trio for a char uplo and just n, iconic behaviour honestly:

       lapack_int LAPACKE_cungtr_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float *a, lapack_int lda, const
           lapack_complex_float *tau, lapack_complex_float *work, lapack_int
           lwork)
       lapack_int LAPACKE_zungtr_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double *a, lapack_int lda, const
           lapack_complex_double *tau, lapack_complex_double *work, lapack_int
           lwork)

Now entering the unm* cinematic universe 🌈 — all of them rock char side, char trans, m, n, k, plus a, lda, tau, c, ldc, work, lwork. First up unmbr, which adds a char vect before the side/trans duo:

       lapack_int LAPACKE_cunmbr_work (int matrix_layout, char vect, char side,
           char trans, lapack_int m, lapack_int n, lapack_int k, const
           lapack_complex_float *a, lapack_int lda, const lapack_complex_float
           *tau, lapack_complex_float *c, lapack_int ldc, lapack_complex_float
           *work, lapack_int lwork)
       lapack_int LAPACKE_zunmbr_work (int matrix_layout, char vect, char side,
           char trans, lapack_int m, lapack_int n, lapack_int k, const
           lapack_complex_double *a, lapack_int lda, const
           lapack_complex_double *tau, lapack_complex_double *c, lapack_int
           ldc, lapack_complex_double *work, lapack_int lwork)

unmhr doesn't do vect but it does bring ilo and ihi to the party, right after n. So it's matrix_layout, side, trans, m, n, ilo, ihi, then the whole a/lda/tau/c/ldc/work/lwork situation 🦋

       lapack_int LAPACKE_cunmhr_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi,
           const lapack_complex_float *a, lapack_int lda, const
           lapack_complex_float *tau, lapack_complex_float *c, lapack_int ldc,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zunmhr_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi,
           const lapack_complex_double *a, lapack_int lda, const
           lapack_complex_double *tau, lapack_complex_double *c, lapack_int
           ldc, lapack_complex_double *work, lapack_int lwork)

Then the lq / ql / qr / rq / rz alphabet soup — back to the classic shape, side, trans, m, n, k, no ilo/ihi, no vect. Notes app open, bestie ✨

       lapack_int LAPACKE_cunmlq_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, const
           lapack_complex_float *a, lapack_int lda, const lapack_complex_float
           *tau, lapack_complex_float *c, lapack_int ldc, lapack_complex_float
           *work, lapack_int lwork)
       lapack_int LAPACKE_zunmlq_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, const
           lapack_complex_double *a, lapack_int lda, const
           lapack_complex_double *tau, lapack_complex_double *c, lapack_int
           ldc, lapack_complex_double *work, lapack_int lwork)
       lapack_int LAPACKE_cunmql_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, const
           lapack_complex_float *a, lapack_int lda, const lapack_complex_float
           *tau, lapack_complex_float *c, lapack_int ldc, lapack_complex_float
           *work, lapack_int lwork)
       lapack_int LAPACKE_zunmql_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, const
           lapack_complex_double *a, lapack_int lda, const
           lapack_complex_double *tau, lapack_complex_double *c, lapack_int
           ldc, lapack_complex_double *work, lapack_int lwork)
       lapack_int LAPACKE_cunmqr_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, const
           lapack_complex_float *a, lapack_int lda, const lapack_complex_float
           *tau, lapack_complex_float *c, lapack_int ldc, lapack_complex_float
           *work, lapack_int lwork)
       lapack_int LAPACKE_zunmqr_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, const
           lapack_complex_double *a, lapack_int lda, const
           lapack_complex_double *tau, lapack_complex_double *c, lapack_int
           ldc, lapack_complex_double *work, lapack_int lwork)
       lapack_int LAPACKE_cunmrq_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, const
           lapack_complex_float *a, lapack_int lda, const lapack_complex_float
           *tau, lapack_complex_float *c, lapack_int ldc, lapack_complex_float
           *work, lapack_int lwork)
       lapack_int LAPACKE_zunmrq_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, const
           lapack_complex_double *a, lapack_int lda, const
           lapack_complex_double *tau, lapack_complex_double *c, lapack_int
           ldc, lapack_complex_double *work, lapack_int lwork)

unmrz is the little overachiever of the group 🫶 — it sneaks in one extra lapack_int l between k and the big const parameter:

       lapack_int LAPACKE_cunmrz_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l, const
           lapack_complex_float *a, lapack_int lda, const lapack_complex_float
           *tau, lapack_complex_float *c, lapack_int ldc, lapack_complex_float
           *work, lapack_int lwork)
       lapack_int LAPACKE_zunmrz_work (int matrix_layout, char side, char
           trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l, const
           lapack_complex_double *a, lapack_int lda, const
           lapack_complex_double *tau, lapack_complex_double *c, lapack_int
           ldc, lapack_complex_double *work, lapack_int lwork)

unmtr goes the other way and collects two chars — side, uplo, trans — then just m and n. No k in sight, periodt:

       lapack_int LAPACKE_cunmtr_work (int matrix_layout, char side, char uplo,
           char trans, lapack_int m, lapack_int n, const lapack_complex_float
           *a, lapack_int lda, const lapack_complex_float *tau,
           lapack_complex_float *c, lapack_int ldc, lapack_complex_float *work,
           lapack_int lwork)
       lapack_int LAPACKE_zunmtr_work (int matrix_layout, char side, char uplo,
           char trans, lapack_int m, lapack_int n, const lapack_complex_double
           *a, lapack_int lda, const lapack_complex_double *tau,
           lapack_complex_double *c, lapack_int ldc, lapack_complex_double
           *work, lapack_int lwork)

Then upgtr and upmtr — the packed-ap girlies 🌸. upgtr takes uplo, n, ap, tau, q, ldq, work (and work here has no lwork beside it, look closely):

       lapack_int LAPACKE_cupgtr_work (int matrix_layout, char uplo, lapack_int
           n, const lapack_complex_float *ap, const lapack_complex_float *tau,
           lapack_complex_float *q, lapack_int ldq, lapack_complex_float *work)
       lapack_int LAPACKE_zupgtr_work (int matrix_layout, char uplo, lapack_int
           n, const lapack_complex_double *ap, const lapack_complex_double
           *tau, lapack_complex_double *q, lapack_int ldq,
           lapack_complex_double *work)

upmtr is the same packed-energy but with side, uplo, trans, m, n, and it's working on c with ldc instead of a q:

       lapack_int LAPACKE_cupmtr_work (int matrix_layout, char side, char uplo,
           char trans, lapack_int m, lapack_int n, const lapack_complex_float
           *ap, const lapack_complex_float *tau, lapack_complex_float *c,
           lapack_int ldc, lapack_complex_float *work)
       lapack_int LAPACKE_zupmtr_work (int matrix_layout, char side, char uplo,
           char trans, lapack_int m, lapack_int n, const lapack_complex_double
           *ap, const lapack_complex_double *tau, lapack_complex_double *c,
           lapack_int ldc, lapack_complex_double *work)

Okay and now for something completely different: the generator section 🔥 laghe and lagsy both take matrix_layout, n, k, a const d, then a, lda, and an lapack_int *iseed — note that d's type differs per precision (const float *d vs const double *d) while a follows the c/z complex split:

       lapack_int LAPACKE_claghe (int matrix_layout, lapack_int n, lapack_int
           k, const float *d, lapack_complex_float *a, lapack_int lda,
           lapack_int *iseed)
       lapack_int LAPACKE_zlaghe (int matrix_layout, lapack_int n, lapack_int
           k, const double *d, lapack_complex_double *a, lapack_int lda,
           lapack_int *iseed)
       lapack_int LAPACKE_slagsy (int matrix_layout, lapack_int n, lapack_int
           k, const float *d, float *a, lapack_int lda, lapack_int *iseed)
       lapack_int LAPACKE_dlagsy (int matrix_layout, lapack_int n, lapack_int
           k, const double *d, double *a, lapack_int lda, lapack_int *iseed)
       lapack_int LAPACKE_clagsy (int matrix_layout, lapack_int n, lapack_int
           k, const float *d, lapack_complex_float *a, lapack_int lda,
           lapack_int *iseed)
       lapack_int LAPACKE_zlagsy (int matrix_layout, lapack_int n, lapack_int
           k, const double *d, lapack_complex_double *a, lapack_int lda,
           lapack_int *iseed)

Next: lapmr and lapmt 🦋 — identical argument lists, both taking lapack_logical forwrd, m, n, x, ldx, lapack_int *k:

       lapack_int LAPACKE_slapmr (int matrix_layout, lapack_logical forwrd,
           lapack_int m, lapack_int n, float *x, lapack_int ldx, lapack_int *k)
       lapack_int LAPACKE_dlapmr (int matrix_layout, lapack_logical forwrd,
           lapack_int m, lapack_int n, double *x, lapack_int ldx, lapack_int
           *k)
       lapack_int LAPACKE_clapmr (int matrix_layout, lapack_logical forwrd,
           lapack_int m, lapack_int n, lapack_complex_float *x, lapack_int ldx,
           lapack_int *k)
       lapack_int LAPACKE_zlapmr (int matrix_layout, lapack_logical forwrd,
           lapack_int m, lapack_int n, lapack_complex_double *x, lapack_int
           ldx, lapack_int *k)
       lapack_int LAPACKE_slapmt (int matrix_layout, lapack_logical forwrd,
           lapack_int m, lapack_int n, float *x, lapack_int ldx, lapack_int *k)
       lapack_int LAPACKE_dlapmt (int matrix_layout, lapack_logical forwrd,
           lapack_int m, lapack_int n, double *x, lapack_int ldx, lapack_int
           *k)
       lapack_int LAPACKE_clapmt (int matrix_layout, lapack_logical forwrd,
           lapack_int m, lapack_int n, lapack_complex_float *x, lapack_int ldx,
           lapack_int *k)
       lapack_int LAPACKE_zlapmt (int matrix_layout, lapack_logical forwrd,
           lapack_int m, lapack_int n, lapack_complex_double *x, lapack_int
           ldx, lapack_int *k)

These next ones don't even take a matrix_layout 👑 — lapy2 returns a float (or double) straight up from two args, x and y:

       float LAPACKE_slapy2 (float x, float y)
       double LAPACKE_dlapy2 (double x, double y)

lapy3 is the same deal but with three args — x, y, z 💜

       float LAPACKE_slapy3 (float x, float y, float z)
       double LAPACKE_dlapy3 (double x, double y, double z)

lartgp is back to lapack_int return, taking f, g and writing into cs, sn, r. lartgs takes x, y, sigma and writes into cs, sn — note no r there 🙂‍↕️

       lapack_int LAPACKE_slartgp (float f, float g, float *cs, float *sn,
           float *r)
       lapack_int LAPACKE_dlartgp (double f, double g, double *cs, double *sn,
           double *r)
       lapack_int LAPACKE_slartgs (float x, float y, float sigma, float *cs,
           float *sn)
       lapack_int LAPACKE_dlartgs (double x, double y, double sigma, double
           *cs, double *sn)

And finally the bbcsd moment 🌟 — cbbcsd has the longest glow-up: jobu1, jobu2, jobv1t, jobv2t, trans, then m, p, q, then theta, phi, then u1/ldu1, u2/ldu2, v1t/ldv1t, v2t/ldv2t, and then the whole b11d, b11e, b12d, b12e, b21d, b21e, b22d, b22e set. Breathe. It's giving main character 😭

       lapack_int LAPACKE_cbbcsd (int matrix_layout, char jobu1, char jobu2,
           char jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p,
           lapack_int q, float *theta, float *phi, lapack_complex_float *u1,
           lapack_int ldu1, lapack_complex_float *u2, lapack_int ldu2,
           lapack_complex_float *v1t, lapack_int ldv1t, lapack_complex_float
           *v2t, lapack_int ldv2t, float *b11d, float *b11e, float *b12d, float
           *b12e, float *b21d, float *b21e, float *b22d, float *b22e)

And here's where this part runs out of screen — cbbcsd_work gets cut off mid-signature, so I'm handing you exactly what's on the page, no edits, no additions 🙈

       lapack_int LAPACKE_cbbcsd_work (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, char jobv2t, char trans, lapack_int m,
           lapack_int p, lapack_int q, float *theta, float *phi,

Stick around, because this signature is definitely not done yet 💀

...and the tail end of that last signature, the whole b11d…b22e + rwork situation. No worries, we're picking right back up 💖

           lapack_complex_float *u1, lapack_int ldu1, lapack_complex_float *u2,
           lapack_int ldu2, lapack_complex_float *v1t, lapack_int ldv1t,
           lapack_complex_float *v2t, lapack_int ldv2t, float *b11d, float
           *b11e, float *b12d, float *b12e, float *b21d, float *b21e, float
           *b22d, float *b22e, float *rwork, lapack_int lrwork)

🦋 the che* girlies (complex single precision, Hermitian energy)

Okay so first up, the swap queen. cheswapr is giving "trade you these two indices" realness — she takes uplo, n, a, lda, and then the iconic duo i1 and i2 ✨

       lapack_int LAPACKE_cheswapr (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *a, lapack_int lda, lapack_int i1, lapack_int
           i2)
       lapack_int LAPACKE_cheswapr_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int
           i1, lapack_int i2)
ngl the _work version here has literally the same argument list — no work, no lwork, nothing extra. Same fit, different name 💅

Next, the inverse crew. chetri2 takes your ipiv (as a const lapack_int *, cute — she's not touching it, just reading 🔍), and the _work version brings her own work + lwork to the function:

       lapack_int LAPACKE_chetri2 (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv)
       lapack_int LAPACKE_chetri2_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_float *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_float *work, lapack_int lwork)

And then chetri2x — the x is not a typo bestie, she's her own whole thing, and she's got a nb block-size moment going on 🎀 (look: the _work sibling here passes nb instead of lwork, that's the vibe, that's the tea ☕):

       lapack_int LAPACKE_chetri2x (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv,
           lapack_int nb)
       lapack_int LAPACKE_chetri2x_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_float *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_float *work, lapack_int nb)

Then chetrs2 slides in with nrhs and a b + ldb — she's the solve-y one of the group, and notice a and ipiv are const while b is very much free to be rewritten 💖 The _work version adds work (no lwork this time!! she's built different, literally):

       lapack_int LAPACKE_chetrs2 (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_chetrs2_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_float *b,
           lapack_int ldb, lapack_complex_float *work)

💜 the csy* besties (complex single precision, symmetric era)

csyconv has the cutest extra arg: way (yes that's really the parameter name, I'm obsessed, it's char way 🥹). She's also carrying e around, and honestly?

       lapack_int LAPACKE_csyconv (int matrix_layout, char uplo, char way,
           lapack_int n, lapack_complex_float *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_float *e)
       lapack_int LAPACKE_csyconv_work (int matrix_layout, char uplo, char way,
           lapack_int n, lapack_complex_float *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_float *e)
fr fr the _work version is identical down to the last character. Same arguments. Same way. Same everything. She said "I contain multitudes but also the exact same parameter list" 💀

csyswapr = the symmetric sibling of the swap girl above. uplo, n, a, lda, i1, i2, that's the whole recipe 🍓

       lapack_int LAPACKE_csyswapr (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *a, lapack_int lda, lapack_int i1, lapack_int
           i2)
       lapack_int LAPACKE_csyswapr_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int
           i1, lapack_int i2)

csytri2 + her _work, then csytri2x with the nb cameo, then csytrs2 with the nrhs and the b/ldb serve — the whole che lineup but symmetric, and she ate, no cap:

       lapack_int LAPACKE_csytri2 (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv)
       lapack_int LAPACKE_csytri2_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_float *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_csytri2x (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_float *a, lapack_int lda, const lapack_int *ipiv,
           lapack_int nb)
       lapack_int LAPACKE_csytri2x_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_float *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_float *work, lapack_int nb)
       lapack_int LAPACKE_csytrs2 (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_csytrs2_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_float *b,
           lapack_int ldb, lapack_complex_float *work)

🌈 the CS-decomposition main characters: cunbdb & cuncsd

Okay this is where it gets highkey extra, because cunbdb has the whole alphabet of block args: x11, x12, x21, x22 with matching ldx11, ldx12, ldx21, ldx22, plus theta, phi, and the four taus: taup1, taup2, tauq1, tauq2. Plus trans and signs for flavor ✨ she's not doing a little thing, she's doing a whole thing:

       lapack_int LAPACKE_cunbdb (int matrix_layout, char trans, char signs,
           lapack_int m, lapack_int p, lapack_int q, lapack_complex_float *x11,
           lapack_int ldx11, lapack_complex_float *x12, lapack_int ldx12,
           lapack_complex_float *x21, lapack_int ldx21, lapack_complex_float
           *x22, lapack_int ldx22, float *theta, float *phi,
           lapack_complex_float *taup1, lapack_complex_float *taup2,
           lapack_complex_float *tauq1, lapack_complex_float *tauq2)
       lapack_int LAPACKE_cunbdb_work (int matrix_layout, char trans, char
           signs, lapack_int m, lapack_int p, lapack_int q,
           lapack_complex_float *x11, lapack_int ldx11, lapack_complex_float
           *x12, lapack_int ldx12, lapack_complex_float *x21, lapack_int ldx21,
           lapack_complex_float *x22, lapack_int ldx22, float *theta, float
           *phi, lapack_complex_float *taup1, lapack_complex_float *taup2,
           lapack_complex_float *tauq1, lapack_complex_float *tauq2,
           lapack_complex_float *work, lapack_int lwork)

Then cuncsd — same block energy, but now with jobu1, jobu2, jobv1t, jobv2t stacked up front (four chars of pure decision-making) and u1/u2/v1t/v2t output players with their own ldu1, ldu2, ldv1t, ldv2t. She's a lot. I love her 🫶

       lapack_int LAPACKE_cuncsd (int matrix_layout, char jobu1, char jobu2,
           char jobv1t, char jobv2t, char trans, char signs, lapack_int m,
           lapack_int p, lapack_int q, lapack_complex_float *x11, lapack_int
           ldx11, lapack_complex_float *x12, lapack_int ldx12,
           lapack_complex_float *x21, lapack_int ldx21, lapack_complex_float
           *x22, lapack_int ldx22, float *theta, lapack_complex_float *u1,
           lapack_int ldu1, lapack_complex_float *u2, lapack_int ldu2,
           lapack_complex_float *v1t, lapack_int ldv1t, lapack_complex_float
           *v2t, lapack_int ldv2t)
       lapack_int LAPACKE_cuncsd_work (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, char jobv2t, char trans, char signs, lapack_int
           m, lapack_int p, lapack_int q, lapack_complex_float *x11, lapack_int
           ldx11, lapack_complex_float *x12, lapack_int ldx12,
           lapack_complex_float *x21, lapack_int ldx21, lapack_complex_float
           *x22, lapack_int ldx22, float *theta, lapack_complex_float *u1,
           lapack_int ldu1, lapack_complex_float *u2, lapack_int ldu2,
           lapack_complex_float *v1t, lapack_int ldv1t, lapack_complex_float
           *v2t, lapack_int ldv2t, lapack_complex_float *work, lapack_int
           lwork, float *rwork, lapack_int lrwork, lapack_int *iwork)
bestie note the _work glow-up: she picks up work + lwork, and rwork + lrwork, and iwork. Three work arrays. She's high-maintenance and honestly? deserved 👑

And the 2by1 version, cuncsd2by1, is the leaner one — no x12/x22 blocks, just x11/x21, and no trans/signs. Less baggage, same ambition:

       lapack_int LAPACKE_cuncsd2by1 (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q,
           lapack_complex_float *x11, lapack_int ldx11, lapack_complex_float
           *x21, lapack_int ldx21, float *theta, lapack_complex_float *u1,
           lapack_int ldu1, lapack_complex_float *u2, lapack_int ldu2,
           lapack_complex_float *v1t, lapack_int ldv1t)
       lapack_int LAPACKE_cuncsd2by1_work (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q,
           lapack_complex_float *x11, lapack_int ldx11, lapack_complex_float
           *x21, lapack_int ldx21, float *theta, lapack_complex_float *u1,
           lapack_int ldu1, lapack_complex_float *u2, lapack_int ldu2,
           lapack_complex_float *v1t, lapack_int ldv1t, lapack_complex_float
           *work, lapack_int lwork, float *rwork, lapack_int lrwork, lapack_int
           *iwork)

🔥 now the double-precision serves (dbbcsd, dorbdb, dorcsd)

Same energy, double * instead of lapack_complex_float *, and ngl the real ones are so clean to read 🌸 dbbcsd is the bidiagonal one — b11d, b11e, b12d, b12e, b21d, b21e, b22d, b22e (eight of them, count 'em), plus theta, phi, and the u1/u2/v1t/v2t quartet 💅 The _work version just adds work + lwork at the end like a little bow 🎀

       lapack_int LAPACKE_dbbcsd (int matrix_layout, char jobu1, char jobu2,
           char jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p,
           lapack_int q, double *theta, double *phi, double *u1, lapack_int
           ldu1, double *u2, lapack_int ldu2, double *v1t, lapack_int ldv1t,
           double *v2t, lapack_int ldv2t, double *b11d, double *b11e, double
           *b12d, double *b12e, double *b21d, double *b21e, double *b22d,
           double *b22e)
       lapack_int LAPACKE_dbbcsd_work (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, char jobv2t, char trans, lapack_int m,
           lapack_int p, lapack_int q, double *theta, double *phi, double *u1,
           lapack_int ldu1, double *u2, lapack_int ldu2, double *v1t,
           lapack_int ldv1t, double *v2t, lapack_int ldv2t, double *b11d,
           double *b11e, double *b12d, double *b12e, double *b21d, double
           *b21e, double *b22d, double *b22e, double *work, lapack_int lwork)

dorbdb = the real-valued twin of cunbdb, same x11/x12/x21/x22 block party, same four taus, same theta/phi. Literally the same fit, just double 🦋:

       lapack_int LAPACKE_dorbdb (int matrix_layout, char trans, char signs,
           lapack_int m, lapack_int p, lapack_int q, double *x11, lapack_int
           ldx11, double *x12, lapack_int ldx12, double *x21, lapack_int ldx21,
           double *x22, lapack_int ldx22, double *theta, double *phi, double
           *taup1, double *taup2, double *tauq1, double *tauq2)
       lapack_int LAPACKE_dorbdb_work (int matrix_layout, char trans, char
           signs, lapack_int m, lapack_int p, lapack_int q, double *x11,
           lapack_int ldx11, double *x12, lapack_int ldx12, double *x21,
           lapack_int ldx21, double *x22, lapack_int ldx22, double *theta,
           double *phi, double *taup1, double *taup2, double *tauq1, double
           *tauq2, double *work, lapack_int lwork)

dorcsd — the real cuncsd counterpart, all four job* chars, trans, signs, and the block crew. And here's the fun bit: dorcsd_work ends with double *work, lapack_int lwork, and lapack_int *iwork — no rwork/lrwork for her, she's built different 😌

       lapack_int LAPACKE_dorcsd (int matrix_layout, char jobu1, char jobu2,
           char jobv1t, char jobv2t, char trans, char signs, lapack_int m,
           lapack_int p, lapack_int q, double *x11, lapack_int ldx11, double
           *x12, lapack_int ldx12, double *x21, lapack_int ldx21, double *x22,
           lapack_int ldx22, double *theta, double *u1, lapack_int ldu1, double
           *u2, lapack_int ldu2, double *v1t, lapack_int ldv1t, double *v2t,
           lapack_int ldv2t)
       lapack_int LAPACKE_dorcsd_work (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, char jobv2t, char trans, char signs, lapack_int
           m, lapack_int p, lapack_int q, double *x11, lapack_int ldx11, double
           *x12, lapack_int ldx12, double *x21, lapack_int ldx21, double *x22,
           lapack_int ldx22, double *theta, double *u1, lapack_int ldu1, double
           *u2, lapack_int ldu2, double *v1t, lapack_int ldv1t, double *v2t,
           lapack_int ldv2t, double *work, lapack_int lwork, lapack_int *iwork)

And dorcsd2by1, the real 2-by-1 girlie — x11/x21 only, no trans/signs, but she does keep theta, u1, u2, v1t with all their lds. The _work version brings work + lwork + iwork to the function 🍓:

       lapack_int LAPACKE_dorcsd2by1 (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q, double
           *x11, lapack_int ldx11, double *x21, lapack_int ldx21, double
           *theta, double *u1, lapack_int ldu1, double *u2, lapack_int ldu2,
           double *v1t, lapack_int ldv1t)
       lapack_int LAPACKE_dorcsd2by1_work (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q, double
           *x11, lapack_int ldx11, double *x21, lapack_int ldx21, double
           *theta, double *u1, lapack_int ldu1, double *u2, lapack_int ldu2,
           double *v1t, lapack_int ldv1t, double *work, lapack_int lwork,
           lapack_int *iwork)

🧚 the dsy* girlies (real symmetric, final stretch of this part)

dsyconv — same way arg as her complex sister (iconic), same ipiv (const, respectful 🙏), same e:

       lapack_int LAPACKE_dsyconv (int matrix_layout, char uplo, char way,
           lapack_int n, double *a, lapack_int lda, const lapack_int *ipiv,
           double *e)
       lapack_int LAPACKE_dsyconv_work (int matrix_layout, char uplo, char way,
           lapack_int n, double *a, lapack_int lda, const lapack_int *ipiv,
           double *e)

dsyswapr — swap those two indices i1 and i2, that's the whole plot:

       lapack_int LAPACKE_dsyswapr (int matrix_layout, char uplo, lapack_int n,
           double *a, lapack_int lda, lapack_int i1, lapack_int i2)
       lapack_int LAPACKE_dsyswapr_work (int matrix_layout, char uplo,
           lapack_int n, double *a, lapack_int lda, lapack_int i1, lapack_int
           i2)

And dsytri2 + her _work sibling — who, uh, is still mid-sentence as we cut away 💀 she's literally still typing:

       lapack_int LAPACKE_dsytri2 (int matrix_layout, char uplo, lapack_int n,
           double *a, lapack_int lda, const lapack_int *ipiv)
       lapack_int LAPACKE_dsytri2_work (int matrix_layout, char uplo,
           lapack_int n, double *a, lapack_int lda, const lapack_int *ipiv,
ok and that's exactly where our girl got cut off — her argument list is still going, bestie, we just have to wait for the next part 😭✋

...aaand we're back, mid-code-block, bestie. No shame, we're just picking up exactly where the last part ended 💅

           double *work, lapack_int lwork)
       lapack_int LAPACKE_dsytri2x (int matrix_layout, char uplo, lapack_int n,
           double *a, lapack_int lda, const lapack_int *ipiv, lapack_int nb)
       lapack_int LAPACKE_dsytri2x_work (int matrix_layout, char uplo,
           lapack_int n, double *a, lapack_int lda, const lapack_int *ipiv,
           double *work, lapack_int nb)
       lapack_int LAPACKE_dsytrs2 (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const double *a, lapack_int lda, const lapack_int
           *ipiv, double *b, lapack_int ldb)
       lapack_int LAPACKE_dsytrs2_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const double *a, lapack_int lda,
           const lapack_int *ipiv, double *b, lapack_int ldb, double *work)

So that's the double-precision era wrapping up — LAPACKE_dsytri2x doing its thing with that extra nb block-size arg (iconic, honestly), and LAPACKE_dsytrs2 / LAPACKE_dsytrs2_work right after, sitting in their double lane with const double *a and a plain double *work. No lwork for dsytrs2_work, bestie — the trailing double *work is just... there. Don't ask, it's the signature. 🫶


Then we pivot hard into the single-precision chaos corner. Buckle up 🎀

       lapack_int LAPACKE_sbbcsd (int matrix_layout, char jobu1, char jobu2,
           char jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p,
           lapack_int q, float *theta, float *phi, float *u1, lapack_int ldu1,
           float *u2, lapack_int ldu2, float *v1t, lapack_int ldv1t, float
           *v2t, lapack_int ldv2t, float *b11d, float *b11e, float *b12d, float
           *b12e, float *b21d, float *b21e, float *b22d, float *b22e)
       lapack_int LAPACKE_sbbcsd_work (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, char jobv2t, char trans, lapack_int m,
           lapack_int p, lapack_int q, float *theta, float *phi, float *u1,
           lapack_int ldu1, float *u2, lapack_int ldu2, float *v1t, lapack_int
           ldv1t, float *v2t, lapack_int ldv2t, float *b11d, float *b11e, float
           *b12d, float *b12e, float *b21d, float *b21e, float *b22d, float
           *b22e, float *work, lapack_int lwork)
       lapack_int LAPACKE_sorbdb (int matrix_layout, char trans, char signs,
           lapack_int m, lapack_int p, lapack_int q, float *x11, lapack_int
           ldx11, float *x12, lapack_int ldx12, float *x21, lapack_int ldx21,
           float *x22, lapack_int ldx22, float *theta, float *phi, float
           *taup1, float *taup2, float *tauq1, float *tauq2)
       lapack_int LAPACKE_sorbdb_work (int matrix_layout, char trans, char
           signs, lapack_int m, lapack_int p, lapack_int q, float *x11,
           lapack_int ldx11, float *x12, lapack_int ldx12, float *x21,
           lapack_int ldx21, float *x22, lapack_int ldx22, float *theta, float
           *phi, float *taup1, float *taup2, float *tauq1, float *tauq2, float
           *work, lapack_int lwork)
       lapack_int LAPACKE_sorcsd (int matrix_layout, char jobu1, char jobu2,
           char jobv1t, char jobv2t, char trans, char signs, lapack_int m,
           lapack_int p, lapack_int q, float *x11, lapack_int ldx11, float
           *x12, lapack_int ldx12, float *x21, lapack_int ldx21, float *x22,
           lapack_int ldx22, float *theta, float *u1, lapack_int ldu1, float
           *u2, lapack_int ldu2, float *v1t, lapack_int ldv1t, float *v2t,
           lapack_int ldv2t)
       lapack_int LAPACKE_sorcsd_work (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, char jobv2t, char trans, char signs, lapack_int
           m, lapack_int p, lapack_int q, float *x11, lapack_int ldx11, float
           *x12, lapack_int ldx12, float *x21, lapack_int ldx21, float *x22,
           lapack_int ldx22, float *theta, float *u1, lapack_int ldu1, float
           *u2, lapack_int ldu2, float *v1t, lapack_int ldv1t, float *v2t,
           lapack_int ldv2t, float *work, lapack_int lwork, lapack_int *iwork)
       lapack_int LAPACKE_sorcsd2by1 (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q, float
           *x11, lapack_int ldx11, float *x21, lapack_int ldx21, float *theta,
           float *u1, lapack_int ldu1, float *u2, lapack_int ldu2, float *v1t,
           lapack_int ldv1t)
       lapack_int LAPACKE_sorcsd2by1_work (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q, float
           *x11, lapack_int ldx11, float *x21, lapack_int ldx21, float *theta,
           float *u1, lapack_int ldu1, float *u2, lapack_int ldu2, float *v1t,
           lapack_int ldv1t, float *work, lapack_int lwork, lapack_int *iwork)

OK so <pink>LAPACKE_sbbcsd</pink> is the big one — bidiagonal SVD vibes, with theta, phi, u1/u2/v1t/v2t and a whole zoo of b11d, b11e, b12d, b12e, b21d, b21e, b22d, b22e floats 😭 that's eight — count them, eight — b-diagnostics, and no I will not be memorizing them either, ngl. Its _work twin takes the same party plus float *work, lapack_int lwork. The jobu1, jobu2, jobv1t, jobv2t, trans chars are all just vibes-controlled switches — flag them exactly as written, no renaming, fr fr 💀

Then LAPACKE_sorbdb / LAPACKE_sorbdb_work — no jobs at all, just trans and signs, four x blocks (x11, x12, x21, x22 with their ldx11, ldx12, ldx21, ldx22), theta, phi, and the four taus taup1, taup2, tauq1, tauq2. Obsessed with the symmetry ngl ✨

Then the sorcsd trio: LAPACKE_sorcsd (no iwork, no work), LAPACKE_sorcsd_work (takes float *work, lapack_int lwork, lapack_int *iwork — yes both, bestie, that's the whole point), and LAPACKE_sorcsd2by1 / LAPACKE_sorcsd2by1_work. Notice the 2by1 versions only have jobu1, jobu2, jobv1t — the jobv2t, trans, signs, x12 and x22 are gone, which is lowkey iconic of them to just drop half the alphabet 🦋


Now the ssy* cleanup crew, all float, all business 🌸

       lapack_int LAPACKE_ssyconv (int matrix_layout, char uplo, char way,
           lapack_int n, float *a, lapack_int lda, const lapack_int *ipiv,
           float *e)
       lapack_int LAPACKE_ssyconv_work (int matrix_layout, char uplo, char way,
           lapack_int n, float *a, lapack_int lda, const lapack_int *ipiv,
           float *e)
       lapack_int LAPACKE_ssyswapr (int matrix_layout, char uplo, lapack_int n,
           float *a, lapack_int lda, lapack_int i1, lapack_int i2)
       lapack_int LAPACKE_ssyswapr_work (int matrix_layout, char uplo,
           lapack_int n, float *a, lapack_int lda, lapack_int i1, lapack_int
           i2)
       lapack_int LAPACKE_ssytri2 (int matrix_layout, char uplo, lapack_int n,
           float *a, lapack_int lda, const lapack_int *ipiv)
       lapack_int LAPACKE_ssytri2_work (int matrix_layout, char uplo,
           lapack_int n, float *a, lapack_int lda, const lapack_int *ipiv,
           float *work, lapack_int lwork)
       lapack_int LAPACKE_ssytri2x (int matrix_layout, char uplo, lapack_int n,
           float *a, lapack_int lda, const lapack_int *ipiv, lapack_int nb)
       lapack_int LAPACKE_ssytri2x_work (int matrix_layout, char uplo,
           lapack_int n, float *a, lapack_int lda, const lapack_int *ipiv,
           float *work, lapack_int nb)
       lapack_int LAPACKE_ssytrs2 (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const float *a, lapack_int lda, const lapack_int
           *ipiv, float *b, lapack_int ldb)
       lapack_int LAPACKE_ssytrs2_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const
           lapack_int *ipiv, float *b, lapack_int ldb, float *work)

Quick vibe check on these, because the pattern is giving main character:

  • LAPACKE_ssyconv and LAPACKE_ssyconv_work have identical parameter lists — char way is in both, and neither gains a work/lwork when you go _work. Copy that exactly, don't "fix" it 🫶
  • LAPACKE_ssyswapr / _work — same deal, the _work variant has the exact same arguments, no extra work buffer. It's giving "the work one is a lie but we love her anyway" 💅
  • LAPACKE_ssytri2 has no work/lwork; LAPACKE_ssytri2_work adds float *work, lapack_int lwork
  • LAPACKE_ssytri2x swaps lwork energy for lapack_int nb, and LAPACKE_ssytri2x_work takes float *work, lapack_int nb — nb, not lwork, do not get it twisted 🔥
  • LAPACKE_ssytrs2 → LAPACKE_ssytrs2_work adds just float *work, no lwork at the end. Periodt.

And now the complex-double glow-up, z-prefix edition 👑

       lapack_int LAPACKE_zbbcsd (int matrix_layout, char jobu1, char jobu2,
           char jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p,
           lapack_int q, double *theta, double *phi, lapack_complex_double *u1,
           lapack_int ldu1, lapack_complex_double *u2, lapack_int ldu2,
           lapack_complex_double *v1t, lapack_int ldv1t, lapack_complex_double
           *v2t, lapack_int ldv2t, double *b11d, double *b11e, double *b12d,
           double *b12e, double *b21d, double *b21e, double *b22d, double
           *b22e)
       lapack_int LAPACKE_zbbcsd_work (int matrix_layout, char jobu1, char
           jobu2, char jobv1t, char jobv2t, char trans, lapack_int m,
           lapack_int p, lapack_int q, double *theta, double *phi,
           lapack_complex_double *u1, lapack_int ldu1, lapack_complex_double
           *u2, lapack_int ldu2, lapack_complex_double *v1t, lapack_int ldv1t,
           lapack_complex_double *v2t, lapack_int ldv2t, double *b11d, double
           *b11e, double *b12d, double *b12e, double *b21d, double *b21e,
           double *b22d, double *b22e, double *rwork, lapack_int lrwork)
       lapack_int LAPACKE_zheswapr (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *a, lapack_int lda, lapack_int i1, lapack_int
           i2)
       lapack_int LAPACKE_zheswapr_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int
           i1, lapack_int i2)
       lapack_int LAPACKE_zhetri2 (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv)
       lapack_int LAPACKE_zhetri2_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_double *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_double *work, lapack_int lwork)
       lapack_int LAPACKE_zhetri2x (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv,
           lapack_int nb)
       lapack_int LAPACKE_zhetri2x_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_double *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_double *work, lapack_int nb)
       lapack_int LAPACKE_zhetrs2 (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_zhetrs2_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_double *b,
           lapack_int ldb, lapack_complex_double *work)

A very important detail, bestie, do not skip: in <purple>LAPACKE_zbbcsd_work</purple> the workspace args are double *rwork, lapack_int lrwork — rwork, not work, and lrwork, not lwork. That's not a typo, that's the signature, copy it exactly or the compiler will have opinions 😭 Also note that even in the complex version, theta, phi, and all eight b-arrays stay plain double * — only u1, u2, v1t, v2t go lapack_complex_double *. The math said no cap 🧚

Then zheswapr, zhetri2, zhetri2x, zhetrs2 and their _work twins mirror the s-crew perfectly: the swapr _work adds nothing, zhetri2_work adds lapack_complex_double *work, lapack_int lwork, zhetri2x uses lapack_int nb and its _work takes lapack_complex_double *work, lapack_int nb, and zhetrs2_work tacks on just lapack_complex_double *work with no lwork. Consistent queen behavior 👑


The zsy* squad plus the grand zunbdb finale 🦋

       lapack_int LAPACKE_zsyconv (int matrix_layout, char uplo, char way,
           lapack_int n, lapack_complex_double *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_double *e)
       lapack_int LAPACKE_zsyconv_work (int matrix_layout, char uplo, char way,
           lapack_int n, lapack_complex_double *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_double *e)
       lapack_int LAPACKE_zsyswapr (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *a, lapack_int lda, lapack_int i1, lapack_int
           i2)
       lapack_int LAPACKE_zsyswapr_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int
           i1, lapack_int i2)
       lapack_int LAPACKE_zsytri2 (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv)
       lapack_int LAPACKE_zsytri2_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_double *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_double *work, lapack_int lwork)
       lapack_int LAPACKE_zsytri2x (int matrix_layout, char uplo, lapack_int n,
           lapack_complex_double *a, lapack_int lda, const lapack_int *ipiv,
           lapack_int nb)
       lapack_int LAPACKE_zsytri2x_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_double *a, lapack_int lda, const
           lapack_int *ipiv, lapack_complex_double *work, lapack_int nb)
       lapack_int LAPACKE_zsytrs2 (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_zsytrs2_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_double *b,
           lapack_int ldb, lapack_complex_double *work)
       lapack_int LAPACKE_zunbdb (int matrix_layout, char trans, char signs,
           lapack_int m, lapack_int p, lapack_int q, lapack_complex_double
           *x11, lapack_int ldx11, lapack_complex_double *x12, lapack_int
           ldx12, lapack_complex_double *x21, lapack_int ldx21,
           lapack_complex_double *x22, lapack_int ldx22, double *theta, double
           *phi, lapack_complex_double *taup1, lapack_complex_double *taup2,
           lapack_complex_double *tauq1, lapack_complex_double *tauq2)
       lapack_int LAPACKE_zunbdb_work (int matrix_layout, char trans, char
           signs, lapack_int m, lapack_int p, lapack_int q,
           lapack_complex_double *x11, lapack_int ldx11, lapack_complex_double
           *x12, lapack_int ldx12, lapack_complex_double *x21, lapack_int
           ldx21, lapack_complex_double *x22, lapack_int ldx22, double *theta,
           double *phi, lapack_complex_double *taup1, lapack_complex_double
           *taup2, lapack_complex_double *tauq1, lapack_complex_double *tauq2,
           lapack_complex_double *work, lapack_int lwork)

Same energy as the s-side: zsyconv/zsyconv_work are twins (both keep char way, both keep lapack_complex_double *e, neither grows a work), zsyswapr/_work are twins with no extra buffer, zsytri2 gets work+lwork in the _work form, zsytri2x runs on nb and so does zsytri2x_work, and zsytrs2_work appends only lapack_complex_double *work. Slay, consistency 💖

And <rainbow>LAPACKE_zunbdb</rainbow> closes us out — the complex twin of sorbdb, same trans, signs, x11/x12/x21/x22 + ldx* layout, theta and phi staying double * (yes, still plain double, even here 🫶), and the four taus taup1, taup2, tauq1, tauq2 as lapack_complex_double *. Its _work twin bolts on lapack_complex_double *work, lapack_int lwork at the very end, exactly like the rest of the family. Gorgeous. Iconic. Not done yet though 😌

Okay so now we get to the actual function wall 💅 — this is the part where lapacke.h just lists its entire roster of prototypes at you like a group chat read-receipt. Same energy, all facts. Let's go family by family.

First up, the CSD girlies — complete orthogonal decomposition via SVD, in double-complex flavor 🦋:

lapack_int LAPACKE_zuncsd (int matrix_layout, char jobu1, char jobu2,
    char jobv1t, char jobv2t, char trans, char signs, lapack_int m,
    lapack_int p, lapack_int q, lapack_complex_double *x11, lapack_int
    ldx11, lapack_complex_double *x12, lapack_int ldx12,
    lapack_complex_double *x21, lapack_int ldx21, lapack_complex_double
    *x22, lapack_int ldx22, double *theta, lapack_complex_double *u1,
    lapack_int ldu1, lapack_complex_double *u2, lapack_int ldu2,
    lapack_complex_double *v1t, lapack_int ldv1t, lapack_complex_double
    *v2t, lapack_int ldv2t)

And her workspace-allocating twin, who lets you bring the scratch space (that's work, lwork, rwork, lrwork, iwork — yes, all five, she's high maintenance and iconic for it) ✨:

lapack_int LAPACKE_zuncsd_work (int matrix_layout, char jobu1, char
    jobu2, char jobv1t, char jobv2t, char trans, char signs, lapack_int
    m, lapack_int p, lapack_int q, lapack_complex_double *x11,
    lapack_int ldx11, lapack_complex_double *x12, lapack_int ldx12,
    lapack_complex_double *x21, lapack_int ldx21, lapack_complex_double
    *x22, lapack_int ldx22, double *theta, lapack_complex_double *u1,
    lapack_int ldu1, lapack_complex_double *u2, lapack_int ldu2,
    lapack_complex_double *v1t, lapack_int ldv1t, lapack_complex_double
    *v2t, lapack_int ldv2t, lapack_complex_double *work, lapack_int
    lwork, double *rwork, lapack_int lrwork, lapack_int *iwork)

Then the 2-by-1 special case, same vibe but slimmer — notice she drops x12, x22, trans, signs, and jobv2t entirely, because 2-by-1 means what it means 🎀:

lapack_int LAPACKE_zuncsd2by1 (int matrix_layout, char jobu1, char
    jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q,
    lapack_complex_double *x11, lapack_int ldx11, lapack_complex_double
    *x21, lapack_int ldx21, double *theta, lapack_complex_double *u1,
    lapack_int ldu1, lapack_complex_double *u2, lapack_int ldu2,
    lapack_complex_double *v1t, lapack_int ldv1t)
lapack_int LAPACKE_zuncsd2by1_work (int matrix_layout, char jobu1, char
    jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q,
    lapack_complex_double *x11, lapack_int ldx11, lapack_complex_double
    *x21, lapack_int ldx21, double *theta, lapack_complex_double *u1,
    lapack_int ldu1, lapack_complex_double *u2, lapack_int ldu2,
    lapack_complex_double *v1t, lapack_int ldv1t, lapack_complex_double
    *work, lapack_int lwork, double *rwork, lapack_int lrwork,
    lapack_int *iwork)

The gemqrt squad 💖

Here's where the four precision besties show up in formation: s (float), d (double), c (complex float), z (complex double). Same shape every time, just different types. Slay, consistency:

lapack_int LAPACKE_sgemqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const float
    *v, lapack_int ldv, const float *t, lapack_int ldt, float *c,
    lapack_int ldc)
lapack_int LAPACKE_dgemqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const
    double *v, lapack_int ldv, const double *t, lapack_int ldt, double
    *c, lapack_int ldc)
lapack_int LAPACKE_cgemqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const
    lapack_complex_float *v, lapack_int ldv, const lapack_complex_float
    *t, lapack_int ldt, lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zgemqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const
    lapack_complex_double *v, lapack_int ldv, const
    lapack_complex_double *t, lapack_int ldt, lapack_complex_double *c,
    lapack_int ldc)

See how v and t are const but c is definitely not? She's the output, she's the main character, she gets written to 👑.


geqrt and her sisters 🌸

The plain geqrt — no nb-blocked multiply, just the factorization, all four precisions:

lapack_int LAPACKE_sgeqrt (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nb, float *a, lapack_int lda, float *t, lapack_int
    ldt)
lapack_int LAPACKE_dgeqrt (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nb, double *a, lapack_int lda, double *t, lapack_int
    ldt)
lapack_int LAPACKE_cgeqrt (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nb, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *t, lapack_int ldt)
lapack_int LAPACKE_zgeqrt (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nb, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *t, lapack_int ldt)

Then geqrt2 — lowkey geqrt but with no nb at all, because she picks her own blocking. Not me noticing the missing parameter 🫶:

lapack_int LAPACKE_sgeqrt2 (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, float *t, lapack_int ldt)
lapack_int LAPACKE_dgeqrt2 (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, double *t, lapack_int ldt)
lapack_int LAPACKE_cgeqrt2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *t,
    lapack_int ldt)
lapack_int LAPACKE_zgeqrt2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_complex_double
    *t, lapack_int ldt)

And geqrt3, the third sister, same signature shape as geqrt2 — literally identical parameter list, different algorithm under the hood, and that's the whole tease 🦋:

lapack_int LAPACKE_sgeqrt3 (int matrix_layout, lapack_int m, lapack_int
    n, float *a, lapack_int lda, float *t, lapack_int ldt)
lapack_int LAPACKE_dgeqrt3 (int matrix_layout, lapack_int m, lapack_int
    n, double *a, lapack_int lda, double *t, lapack_int ldt)
lapack_int LAPACKE_cgeqrt3 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *t,
    lapack_int ldt)
lapack_int LAPACKE_zgeqrt3 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_complex_double
    *t, lapack_int ldt)

tpmqrt / tpqrt / tpqrt2 — the triangular gang 🌈

tpmqrt brings the whole crew: side, trans, m, n, k, l, nb, plus v, t, and two matrices a and b with their own leading dimensions lda and ldb. She's doing the most, respectfully:

lapack_int LAPACKE_stpmqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int
    nb, const float *v, lapack_int ldv, const float *t, lapack_int ldt,
    float *a, lapack_int lda, float *b, lapack_int ldb)
lapack_int LAPACKE_dtpmqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int
    nb, const double *v, lapack_int ldv, const double *t, lapack_int
    ldt, double *a, lapack_int lda, double *b, lapack_int ldb)
lapack_int LAPACKE_ctpmqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int
    nb, const lapack_complex_float *v, lapack_int ldv, const
    lapack_complex_float *t, lapack_int ldt, lapack_complex_float *a,
    lapack_int lda, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_ztpmqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int
    nb, const lapack_complex_double *v, lapack_int ldv, const
    lapack_complex_double *t, lapack_int ldt, lapack_complex_double *a,
    lapack_int lda, lapack_complex_double *b, lapack_int ldb)

tpqrt drops side and trans and keeps the l, nb, a, b, t situation. Still four precisions, still eating:

lapack_int LAPACKE_stpqrt (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, lapack_int nb, float *a, lapack_int lda, float *b,
    lapack_int ldb, float *t, lapack_int ldt)
lapack_int LAPACKE_dtpqrt (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, lapack_int nb, double *a, lapack_int lda, double
    *b, lapack_int ldb, double *t, lapack_int ldt)
lapack_int LAPACKE_ctpqrt (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, lapack_int nb, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *b, lapack_int ldb, lapack_complex_float
    *t, lapack_int ldt)
lapack_int LAPACKE_ztpqrt (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, lapack_int nb, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *b, lapack_int ldb, lapack_complex_double
    *t, lapack_int ldt)

tpqrt2 — bye nb, you were cute but we're doing fixed blocking now:

lapack_int LAPACKE_stpqrt2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, float *a, lapack_int lda, float *b, lapack_int ldb,
    float *t, lapack_int ldt)
lapack_int LAPACKE_dtpqrt2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, double *a, lapack_int lda, double *b, lapack_int
    ldb, double *t, lapack_int ldt)
lapack_int LAPACKE_ctpqrt2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *b, lapack_int ldb, lapack_complex_float *t,
    lapack_int ldt)
lapack_int LAPACKE_ztpqrt2 (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double *t,
    lapack_int ldt)

tprfb — the apply-the-thing step 💀

Four chars, no waiting: side, trans, direct, storev, then the full m, n, k, l cast plus v, t, a, b and all their leading dimensions. She's the "actually use the factorization you just built" girlie:

lapack_int LAPACKE_stprfb (int matrix_layout, char side, char trans,
    char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    lapack_int l, const float *v, lapack_int ldv, const float *t,
    lapack_int ldt, float *a, lapack_int lda, float *b, lapack_int ldb)
lapack_int LAPACKE_dtprfb (int matrix_layout, char side, char trans,
    char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    lapack_int l, const double *v, lapack_int ldv, const double *t,
    lapack_int ldt, double *a, lapack_int lda, double *b, lapack_int
    ldb)
lapack_int LAPACKE_ctprfb (int matrix_layout, char side, char trans,
    char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    lapack_int l, const lapack_complex_float *v, lapack_int ldv, const
    lapack_complex_float *t, lapack_int ldt, lapack_complex_float *a,
    lapack_int lda, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_ztprfb (int matrix_layout, char side, char trans,
    char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    lapack_int l, const lapack_complex_double *v, lapack_int ldv, const
    lapack_complex_double *t, lapack_int ldt, lapack_complex_double *a,
    lapack_int lda, lapack_complex_double *b, lapack_int ldb)

The _work remixes 🔥

Same functions, but now you pass in the buffer yourself — work shows up at the end, and if you get its size wrong that's between you and your lwork. Starting with the gemqrt_work set:

lapack_int LAPACKE_sgemqrt_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, lapack_int nb,
    const float *v, lapack_int ldv, const float *t, lapack_int ldt,
    float *c, lapack_int ldc, float *work)
lapack_int LAPACKE_dgemqrt_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, lapack_int nb,
    const double *v, lapack_int ldv, const double *t, lapack_int ldt,
    double *c, lapack_int ldc, double *work)
lapack_int LAPACKE_cgemqrt_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, lapack_int nb,
    const lapack_complex_float *v, lapack_int ldv, const
    lapack_complex_float *t, lapack_int ldt, lapack_complex_float *c,
    lapack_int ldc, lapack_complex_float *work)
lapack_int LAPACKE_zgemqrt_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, lapack_int nb,
    const lapack_complex_double *v, lapack_int ldv, const
    lapack_complex_double *t, lapack_int ldt, lapack_complex_double *c,
    lapack_int ldc, lapack_complex_double *work)

Then geqrt_work, where the pattern repeats and work just slides into the last slot 🧚:

lapack_int LAPACKE_sgeqrt_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nb, float *a, lapack_int lda, float *t,
    lapack_int ldt, float *work)
lapack_int LAPACKE_dgeqrt_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nb, double *a, lapack_int lda, double *t,
    lapack_int ldt, double *work)
lapack_int LAPACKE_cgeqrt_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nb, lapack_complex_float *a, lapack_int

…and that's genuinely where this part cuts off mid-signature 😭 — the cgeqrt_work prototype is still going, so hold that thought for the next chunk. No cap, we're literally in the middle of a parameter list.

okay so we're still deep in the SYNOPSIS bestie, and this stretch is giving QR factorization extended universe 🌀✨ — like, the geqrt girlies and their whole tpqrt/tpmqrt/tprfb friend group showed up to the party, then the _rook pivot squad crashed it, and honestly? iconic behavior. let me lay it all out for you exactly as the header declares it, no cap 🫶

First up, the geqrt trio — _work flavors only, which means you're bringing your own workspace to the function like the organized queen you are 💅. s/d/c/z, all four precisions, one after another:

lapack_int LAPACKE_sgeqrt_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nb, float *a, lapack_int lda, float *t,
    lapack_int ldt, float *work)
lapack_int LAPACKE_dgeqrt_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nb, double *a, lapack_int lda, double *t,
    lapack_int ldt, double *work)
lapack_int LAPACKE_cgeqrt_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nb, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *t, lapack_int ldt, lapack_complex_float
    *work)
lapack_int LAPACKE_zgeqrt_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int nb, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *t, lapack_int ldt, lapack_complex_double
    *work)

then the geqrt2 glow-up ✨ (same s/d/c/z energy, no nb, no external work — it's the lowkey version of the family):

lapack_int LAPACKE_sgeqrt2_work (int matrix_layout, lapack_int m,
    lapack_int n, float *a, lapack_int lda, float *t, lapack_int ldt)
lapack_int LAPACKE_dgeqrt2_work (int matrix_layout, lapack_int m,
    lapack_int n, double *a, lapack_int lda, double *t, lapack_int ldt)
lapack_int LAPACKE_cgeqrt2_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *t, lapack_int ldt)
lapack_int LAPACKE_zgeqrt2_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *t, lapack_int ldt)

and geqrt3 said "make it three" 🎀:

lapack_int LAPACKE_sgeqrt3_work (int matrix_layout, lapack_int m,
    lapack_int n, float *a, lapack_int lda, float *t, lapack_int ldt)
lapack_int LAPACKE_dgeqrt3_work (int matrix_layout, lapack_int m,
    lapack_int n, double *a, lapack_int lda, double *t, lapack_int ldt)
lapack_int LAPACKE_cgeqrt3_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *t, lapack_int ldt)
lapack_int LAPACKE_zgeqrt3_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *t, lapack_int ldt)

nowwww the tp crew 🦋 — tpmqrt, tpqrt, tpqrt2, tprfb, each rocking the full s/d/c/z quartet. tpmqrt is the one with all the char arguments (side, trans) plus m, n, k, l, nb, and a whole parade of leading dimensions:

lapack_int LAPACKE_stpmqrt_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l,
    lapack_int nb, const float *v, lapack_int ldv, const float *t,
    lapack_int ldt, float *a, lapack_int lda, float *b, lapack_int ldb,
    float *work)
lapack_int LAPACKE_dtpmqrt_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l,
    lapack_int nb, const double *v, lapack_int ldv, const double *t,
    lapack_int ldt, double *a, lapack_int lda, double *b, lapack_int
    ldb, double *work)
lapack_int LAPACKE_ctpmqrt_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l,
    lapack_int nb, const lapack_complex_float *v, lapack_int ldv, const
    lapack_complex_float *t, lapack_int ldt, lapack_complex_float *a,
    lapack_int lda, lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *work)
lapack_int LAPACKE_ztpmqrt_work (int matrix_layout, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l,
    lapack_int nb, const lapack_complex_double *v, lapack_int ldv, const
    lapack_complex_double *t, lapack_int ldt, lapack_complex_double *a,
    lapack_int lda, lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *work)

tpqrt next, with its l, nb, and work besties tagging along:

lapack_int LAPACKE_stpqrt_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int l, lapack_int nb, float *a, lapack_int lda,
    float *b, lapack_int ldb, float *t, lapack_int ldt, float *work)
lapack_int LAPACKE_dtpqrt_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int l, lapack_int nb, double *a, lapack_int
    lda, double *b, lapack_int ldb, double *t, lapack_int ldt, double
    *work)
lapack_int LAPACKE_ctpqrt_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int l, lapack_int nb, lapack_complex_float *a,
    lapack_int lda, lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *t, lapack_int ldt, lapack_complex_float *work)
lapack_int LAPACKE_ztpqrt_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int l, lapack_int nb, lapack_complex_double *a,
    lapack_int lda, lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *t, lapack_int ldt, lapack_complex_double
    *work)

tpqrt2 keeps it cute and lean — just m, n, l, the two matrices a and b, and t:

lapack_int LAPACKE_stpqrt2_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int l, float *a, lapack_int lda, float *b,
    lapack_int ldb, float *t, lapack_int ldt)
lapack_int LAPACKE_dtpqrt2_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int l, double *a, lapack_int lda, double *b,
    lapack_int ldb, double *t, lapack_int ldt)
lapack_int LAPACKE_ctpqrt2_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int l, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *b, lapack_int ldb, lapack_complex_float *t,
    lapack_int ldt)
lapack_int LAPACKE_ztpqrt2_work (int matrix_layout, lapack_int m,
    lapack_int n, lapack_int l, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *b, lapack_int ldb, lapack_complex_double
    *t, lapack_int ldt)

and tprfb has the most char energy of all 🫶 — side, trans, direct, AND storev, plus m, n, k, l, and it even takes an ldwork at the very end:

lapack_int LAPACKE_stprfb_work (int matrix_layout, char side, char
    trans, char direct, char storev, lapack_int m, lapack_int n,
    lapack_int k, lapack_int l, const float *v, lapack_int ldv, const
    float *t, lapack_int ldt, float *a, lapack_int lda, float *b,
    lapack_int ldb, float *work, lapack_int ldwork)
lapack_int LAPACKE_dtprfb_work (int matrix_layout, char side, char
    trans, char direct, char storev, lapack_int m, lapack_int n,
    lapack_int k, lapack_int l, const double *v, lapack_int ldv, const
    double *t, lapack_int ldt, double *a, lapack_int lda, double *b,
    lapack_int ldb, double *work, lapack_int ldwork)
lapack_int LAPACKE_ctprfb_work (int matrix_layout, char side, char
    trans, char direct, char storev, lapack_int m, lapack_int n,
    lapack_int k, lapack_int l, const lapack_complex_float *v,
    lapack_int ldv, const lapack_complex_float *t, lapack_int ldt,
    lapack_complex_float *a, lapack_int lda, lapack_complex_float *b,
    lapack_int ldb, lapack_complex_float *work, lapack_int ldwork)
lapack_int LAPACKE_ztprfb_work (int matrix_layout, char side, char
    trans, char direct, char storev, lapack_int m, lapack_int n,
    lapack_int k, lapack_int l, const lapack_complex_double *v,
    lapack_int ldv, const lapack_complex_double *t, lapack_int ldt,
    lapack_complex_double *a, lapack_int lda, lapack_complex_double *b,
    lapack_int ldb, lapack_complex_double *work, lapack_int ldwork)

okay now the rook pivot group enters the chat and it's a whole moment 👑 — sysv_rook, sytrf_rook, sytrs_rook each come in s/d/c/z, and there's ipiv everywhere because pivots are literally the main characters here:

lapack_int LAPACKE_ssysv_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, float *a, lapack_int lda, lapack_int *ipiv,
    float *b, lapack_int ldb)
lapack_int LAPACKE_dsysv_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, double *a, lapack_int lda, lapack_int *ipiv,
    double *b, lapack_int ldb)
lapack_int LAPACKE_csysv_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda,
    lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zsysv_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
    lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
lapack_int LAPACKE_ssytrf_rook (int matrix_layout, char uplo, lapack_int
    n, float *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_dsytrf_rook (int matrix_layout, char uplo, lapack_int
    n, double *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_csytrf_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_zsytrf_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_ssytrs_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const float *a, lapack_int lda, const lapack_int
    *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_dsytrs_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const double *a, lapack_int lda, const
    lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_csytrs_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
    const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zsytrs_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
    const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)

and then the Hermitian rook besties, hetrf_rook and hetrs_rook 🌸 — note they're complex-only (just c and z, no s/d, because Hermitian doesn't do real, iykyk):

lapack_int LAPACKE_chetrf_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_zhetrf_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv)
lapack_int LAPACKE_chetrs_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
    const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zhetrs_rook (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
    const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)

and then out of NOWHERE we get the lone symmetric rank-1 update duo, csyr and zsyr 💜 — no s/d, just the complex girlies, with an alpha scalar and an x vector and an incx:

lapack_int LAPACKE_csyr (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float alpha, const lapack_complex_float *x,
    lapack_int incx, lapack_complex_float *a, lapack_int lda)
lapack_int LAPACKE_zsyr (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double alpha, const lapack_complex_double *x,
    lapack_int incx, lapack_complex_double *a, lapack_int lda)

and finallyyyy the _work remixes of the rook squad come rolling in 🎀 — sysv_rook_work and sytrf_rook_work, each adding work + lwork on the end. sysv_rook_work shows up in full s/d/c/z:

lapack_int LAPACKE_ssysv_rook_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, float *a, lapack_int lda, lapack_int
    *ipiv, float *b, lapack_int ldb, float *work, lapack_int lwork)
lapack_int LAPACKE_dsysv_rook_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, double *a, lapack_int lda, lapack_int
    *ipiv, double *b, lapack_int ldb, double *work, lapack_int lwork)
lapack_int LAPACKE_csysv_rook_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zsysv_rook_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *work, lapack_int lwork)

and sytrf_rook_work starts its s/d/c/z set — and bestie, the page literally cuts off mid-signature here 🙈 so I'm giving you exactly what's written, cliffhanger and all:

lapack_int LAPACKE_ssytrf_rook_work (int matrix_layout, char uplo,
    lapack_int n, float *a, lapack_int lda, lapack_int *ipiv, float
    *work, lapack_int lwork)
lapack_int LAPACKE_dsytrf_rook_work (int matrix_layout, char uplo,
    lapack_int n, double *a, lapack_int lda, lapack_int *ipiv, double
    *work, lapack_int lwork)
lapack_int LAPACKE_csytrf_rook_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int
    *ipiv, lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zsytrf_rook_work (int matrix_layout, char uplo,

to be continued obviously 😭💅 and if you're following along you already know the next part picks up right where this one left off — go get it bestie 🦋✨

...and this signature was literally mid-sentence, so here's the tail end of it exactly as it trails in — no cap, that's just where the page break landed 🫶

           lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int
           *ipiv, lapack_complex_double *work, lapack_int lwork)

okay so the _rook pivot girlies are still going 👑 they solve with the factors from their _rook factorization cousins — sytrs_rook_work for the symmetric side, in all four precision flavours:

       lapack_int LAPACKE_ssytrs_rook_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const
           lapack_int *ipiv, float *b, lapack_int ldb)
       lapack_int LAPACKE_dsytrs_rook_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const double *a, lapack_int lda,
           const lapack_int *ipiv, double *b, lapack_int ldb)
       lapack_int LAPACKE_csytrs_rook_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_float *b,
           lapack_int ldb)
       lapack_int LAPACKE_zsytrs_rook_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_double *b,
           lapack_int ldb)

and then the Hermitian _rook duo — factor and solve, both complex-only because that's their whole thing 💅 chetrf_rook_work / zhetrf_rook_work factor, chetrs_rook_work / zhetrs_rook_work solve:

       lapack_int LAPACKE_chetrf_rook_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int
           *ipiv, lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zhetrf_rook_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int
           *ipiv, lapack_complex_double *work, lapack_int lwork)
       lapack_int LAPACKE_chetrs_rook_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_float *b,
           lapack_int ldb)
       lapack_int LAPACKE_zhetrs_rook_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_double *b,
           lapack_int ldb)

syr moment 🌸 the symmetric rank-1 update, complex edition, with a scalar alpha and a vector x strutting in with stride incx. Note the vibe shift: no nrhs here, just a and lda getting updated ✨

       lapack_int LAPACKE_csyr_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float alpha, const lapack_complex_float *x,
           lapack_int incx, lapack_complex_float *a, lapack_int lda)
       lapack_int LAPACKE_zsyr_work (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double alpha, const lapack_complex_double *x,
           lapack_int incx, lapack_complex_double *a, lapack_int lda)

and the little icon she is — LAPACKE_ilaver, the only one in this whole stretch that returns void instead of a lapack_int, and she just hands you the version numbers back through three pointers. main character energy honestly 👑

       void LAPACKE_ilaver (lapack_int *vers_major, lapack_int *vers_minor,
           lapack_int *vers_patch)

now entering the _aa era 🔥 factor-and-solve-all-at-once, symmetric side first. ssysv_aa / dsysv_aa / csysv_aa / zsysv_aa take ipiv, then each has its _work twin carrying work and lwork:

       lapack_int LAPACKE_ssysv_aa (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, float *a, lapack_int lda, lapack_int *ipiv, float
           *b, lapack_int ldb)
       lapack_int LAPACKE_ssysv_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, float *a, lapack_int lda, lapack_int
           *ipiv, float *b, lapack_int ldb, float *work, lapack_int lwork)
       lapack_int LAPACKE_dsysv_aa (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, double *a, lapack_int lda, lapack_int *ipiv, double
           *b, lapack_int ldb)
       lapack_int LAPACKE_dsysv_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, double *a, lapack_int lda, lapack_int
           *ipiv, double *b, lapack_int ldb, double *work, lapack_int lwork)
       lapack_int LAPACKE_csysv_aa (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, lapack_complex_float *a, lapack_int lda, lapack_int
           *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_csysv_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
           lda, lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zsysv_aa (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
           lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_zsysv_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
           lda, lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *work, lapack_int lwork)

same _aa treatment, Hermitian flavour — only two of them, because Hermitian is complex-only bestie, that's just science 🧚:

       lapack_int LAPACKE_chesv_aa (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, lapack_complex_float *a, lapack_int lda, lapack_int
           *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_chesv_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
           lda, lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb,
           lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zhesv_aa (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
           lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_zhesv_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
           lda, lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb,
           lapack_complex_double *work, lapack_int lwork)

the _aa factorizers, now without the solve 💀 six of them, no work/lwork in this batch — just matrix_layout, uplo, n, a, lda, ipiv:

       lapack_int LAPACKE_ssytrf_aa (int matrix_layout, char uplo, lapack_int
           n, float *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_dsytrf_aa (int matrix_layout, char uplo, lapack_int
           n, double *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_csytrf_aa (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_zsytrf_aa (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_chetrf_aa (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_float *a, lapack_int lda, lapack_int *ipiv)
       lapack_int LAPACKE_zhetrf_aa (int matrix_layout, char uplo, lapack_int
           n, lapack_complex_double *a, lapack_int lda, lapack_int *ipiv)

and their _work versions, same six, now with the work/lwork glow-up 🦋:

       lapack_int LAPACKE_ssytrf_aa_work (int matrix_layout, char uplo,
           lapack_int n, float *a, lapack_int lda, lapack_int *ipiv, float
           *work, lapack_int lwork)
       lapack_int LAPACKE_dsytrf_aa_work (int matrix_layout, char uplo,
           lapack_int n, double *a, lapack_int lda, lapack_int *ipiv, double
           *work, lapack_int lwork)
       lapack_int LAPACKE_csytrf_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int
           *ipiv, lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zsytrf_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int
           *ipiv, lapack_complex_double *work, lapack_int lwork)
       lapack_int LAPACKE_chetrf_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_int
           *ipiv, lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_zhetrf_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_int
           *ipiv, lapack_complex_double *work, lapack_int lwork)

_aa solvers, the whole squad of twelve 🎀 and bestie, look at the ORDER, it is not alphabetical and I need you to respect it: c, c work, che, che work, d, d work, s, s work, z, z work, zhe, zhe work. Do not reorder, do not "tidy" it, it's giving chaotic-but-correct 🌈

       lapack_int LAPACKE_csytrs_aa (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_csytrs_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_float *b,
           lapack_int ldb, lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_chetrs_aa (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_chetrs_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_float *b,
           lapack_int ldb, lapack_complex_float *work, lapack_int lwork)
       lapack_int LAPACKE_dsytrs_aa (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const double *a, lapack_int lda, const
           lapack_int *ipiv, double *b, lapack_int ldb)
       lapack_int LAPACKE_dsytrs_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const double *a, lapack_int lda,
           const lapack_int *ipiv, double *b, lapack_int ldb, double *work,
           lapack_int lwork)
       lapack_int LAPACKE_ssytrs_aa (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const float *a, lapack_int lda, const lapack_int
           *ipiv, float *b, lapack_int ldb)
       lapack_int LAPACKE_ssytrs_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const
           lapack_int *ipiv, float *b, lapack_int ldb, float *work, lapack_int
           lwork)
       lapack_int LAPACKE_zsytrs_aa (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_zsytrs_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_double *b,
           lapack_int ldb, lapack_complex_double *work, lapack_int lwork)
       lapack_int LAPACKE_zhetrs_aa (int matrix_layout, char uplo, lapack_int
           n, lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
           const lapack_int *ipiv, lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_zhetrs_aa_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
           lapack_int lda, const lapack_int *ipiv, lapack_complex_double *b,
           lapack_int ldb, lapack_complex_double *work, lapack_int lwork)

and finally the _rk cuties show up 💜 note the extra e pointer sitting right after lda — that's float *e, double *e, lapack_complex_float *e — before ipiv even gets a turn. ssysv_rk and her _work twin, dsysv_rk and hers, then csysv_rk and csysv_rk_work… and that's where this part runs out of page 🍓

       lapack_int LAPACKE_ssysv_rk (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, float *a, lapack_int lda, float *e, lapack_int
           *ipiv, float *b, lapack_int ldb)
       lapack_int LAPACKE_ssysv_rk_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *e,
           lapack_int *ipiv, float *b, lapack_int ldb, float *work, lapack_int
           lwork)
       lapack_int LAPACKE_dsysv_rk (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, double *a, lapack_int lda, double *e, lapack_int
           *ipiv, double *b, lapack_int ldb)
       lapack_int LAPACKE_dsysv_rk_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double *e,
           lapack_int *ipiv, double *b, lapack_int ldb, double *work,
           lapack_int lwork)
       lapack_int LAPACKE_csysv_rk (int matrix_layout, char uplo, lapack_int n,
           lapack_int nrhs, lapack_complex_float *a, lapack_int lda,
           lapack_complex_float *e, lapack_int *ipiv, lapack_complex_float *b,
           lapack_int ldb)
       lapack_int LAPACKE_csysv_rk_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
           lda, lapack_complex_float *e, lapack_int *ipiv, lapack_complex_float
           *b, lapack_int ldb, lapack_complex_float *work, lapack_int lwork)
bestie do NOT panic that this cuts off mid-parenthesis — it's a 197-part page, we're on 57, the _rk story literally continues in the next chunk 😭 this is not a typo, it's just the manpage breathing

okay so we're still deep in the prototype dump and honestly? it's giving "the compiler's grocery list" and i'm obsessed. these next ones are all the _rk and _3 variants — the fancy newer factorization fam 💅 — so let's just keep scrolling through them, bestie, no skips.


first up, the _rk solve crew (symmetric and Hermitian, complex only, living their best life):

lapack_int LAPACKE_zsysv_rk (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *e, lapack_int *ipiv, lapack_complex_double
    *b, lapack_int ldb)
lapack_int LAPACKE_zsysv_rk_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *e, lapack_int *ipiv,
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double
    *work, lapack_int lwork)
lapack_int LAPACKE_chesv_rk (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *e, lapack_int *ipiv, lapack_complex_float *b,
    lapack_int ldb)
lapack_int LAPACKE_chesv_rk_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *e, lapack_int *ipiv, lapack_complex_float
    *b, lapack_int ldb, lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zhesv_rk (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *e, lapack_int *ipiv, lapack_complex_double
    *b, lapack_int ldb)
lapack_int LAPACKE_zhesv_rk_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *e, lapack_int *ipiv,
    lapack_complex_double *b, lapack_int ldb, lapack_complex_double
    *work, lapack_int lwork)

like, z = double complex, c = single complex, sy = symmetric, he = Hermitian, and sv = solve, and _rk is the whole rook-pivoting glow-up. the _work twin just lets you pass in your own work/lwork scratch space so you're not at the allocator's mercy 🫶


then the trf_rk factorization besties — this is the "break it down first" stage, all four real/complex flavours plus the Hermitian girlies:

lapack_int LAPACKE_ssytrf_rk (int matrix_layout, char uplo, lapack_int
    n, float *a, lapack_int lda, float *e, lapack_int *ipiv)
lapack_int LAPACKE_dsytrf_rk (int matrix_layout, char uplo, lapack_int
    n, double *a, lapack_int lda, double *e, lapack_int *ipiv)
lapack_int LAPACKE_csytrf_rk (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *e,
    lapack_int *ipiv)
lapack_int LAPACKE_zsytrf_rk (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_complex_double
    *e, lapack_int *ipiv)
lapack_int LAPACKE_chetrf_rk (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *e,
    lapack_int *ipiv)
lapack_int LAPACKE_zhetrf_rk (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_double *a, lapack_int lda, lapack_complex_double
    *e, lapack_int *ipiv)

see how e is a whole separate output? that's the rook pivoting's signature little souvenir — it carries the off-diagonal scaling factors, and ipiv is still doing its pivot thing. slay.


and their _work versions, because sometimes you gotta BYO buffer:

lapack_int LAPACKE_ssytrf_rk_work (int matrix_layout, char uplo,
    lapack_int n, float *a, lapack_int lda, float *e, lapack_int *ipiv,
    float *work, lapack_int lwork)
lapack_int LAPACKE_dsytrf_rk_work (int matrix_layout, char uplo,
    lapack_int n, double *a, lapack_int lda, double *e, lapack_int
    *ipiv, double *work, lapack_int lwork)
lapack_int LAPACKE_csytrf_rk_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *e, lapack_int *ipiv, lapack_complex_float
    *work, lapack_int lwork)
lapack_int LAPACKE_zsytrf_rk_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *e, lapack_int *ipiv, lapack_complex_double
    *work, lapack_int lwork)
lapack_int LAPACKE_chetrf_rk_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *e, lapack_int *ipiv, lapack_complex_float
    *work, lapack_int lwork)
lapack_int LAPACKE_zhetrf_rk_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *e, lapack_int *ipiv, lapack_complex_double
    *work, lapack_int lwork)

okay now the trs_3 girls — solving after the _3 factorization, note the const on a, e, and ipiv because we're just reading them, not messy-editing them. respectful. periodt.

lapack_int LAPACKE_csytrs_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
    const lapack_complex_float *e, const lapack_int *ipiv,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_csytrs_3_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
    lapack_int lda, const lapack_complex_float *e, const lapack_int
    *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_chetrs_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float *a, lapack_int lda,
    const lapack_complex_float *e, const lapack_int *ipiv,
    lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_chetrs_3_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float *a,
    lapack_int lda, const lapack_complex_float *e, const lapack_int
    *ipiv, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_dsytrs_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double *a, lapack_int lda, const double *e,
    const lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_dsytrs_3_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, const double *a, lapack_int lda,
    const double *e, const lapack_int *ipiv, double *b, lapack_int ldb)
lapack_int LAPACKE_ssytrs_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float *a, lapack_int lda, const float *e,
    const lapack_int *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_ssytrs_3_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, const float *a, lapack_int lda, const
    float *e, const lapack_int *ipiv, float *b, lapack_int ldb)
lapack_int LAPACKE_zsytrs_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
    const lapack_complex_double *e, const lapack_int *ipiv,
    lapack_complex_double *b, lapack_int ldb)
lapack_int LAPACKE_zsytrs_3_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
    lapack_int lda, const lapack_complex_double *e, const lapack_int
    *ipiv, lapack_complex_double *b, lapack_int ldb)
lapack_int LAPACKE_zhetrs_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double *a, lapack_int lda,
    const lapack_complex_double *e, const lapack_int *ipiv,
    lapack_complex_double *b, lapack_int ldb)
lapack_int LAPACKE_zhetrs_3_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_double *a,
    lapack_int lda, const lapack_complex_double *e, const lapack_int
    *ipiv, lapack_complex_double *b, lapack_int ldb)

next: the tri_3 icons — computing the actual inverse after the _3 factorization. a is not const here (it gets overwritten with the inverse, bestie, so don't come crying if your original matrix ghosts you 😭):

lapack_int LAPACKE_ssytri_3 (int matrix_layout, char uplo, lapack_int n,
    float *a, lapack_int lda, const float *e, const lapack_int *ipiv)
lapack_int LAPACKE_dsytri_3 (int matrix_layout, char uplo, lapack_int n,
    double *a, lapack_int lda, const double *e, const lapack_int *ipiv)
lapack_int LAPACKE_csytri_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float *a, lapack_int lda, const lapack_complex_float
    *e, const lapack_int *ipiv)
lapack_int LAPACKE_zsytri_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *e, const lapack_int *ipiv)
lapack_int LAPACKE_chetri_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float *a, lapack_int lda, const lapack_complex_float
    *e, const lapack_int *ipiv)
lapack_int LAPACKE_zhetri_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *e, const lapack_int *ipiv)
lapack_int LAPACKE_ssytri_3_work (int matrix_layout, char uplo,
    lapack_int n, float *a, lapack_int lda, const float *e, const
    lapack_int *ipiv, float *work, lapack_int lwork)
lapack_int LAPACKE_dsytri_3_work (int matrix_layout, char uplo,
    lapack_int n, double *a, lapack_int lda, const double *e, const
    lapack_int *ipiv, double *work, lapack_int lwork)
lapack_int LAPACKE_csytri_3_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float *a, lapack_int lda, const
    lapack_complex_float *e, const lapack_int *ipiv,
    lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zsytri_3_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *e, const lapack_int *ipiv,
    lapack_complex_double *work, lapack_int lwork)
lapack_int LAPACKE_chetri_3_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float *a, lapack_int lda, const
    lapack_complex_float *e, const lapack_int *ipiv,
    lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zhetri_3_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *e, const lapack_int *ipiv,
    lapack_complex_double *work, lapack_int lwork)

and finally (for this stretch, anyway 💀) the con_3 crew — condition number estimators, i.e. "how sketchy is my matrix, on a scale from slay to yikes". note the anorm input and rcond output, plus these take iwork as well as work in the _work versions. special little detail, we love a distinct signature:

lapack_int LAPACKE_ssycon_3 (int matrix_layout, char uplo, lapack_int n,
    const float *a, lapack_int lda, const float *e, const lapack_int
    *ipiv, float anorm, float *rcond)
lapack_int LAPACKE_dsycon_3 (int matrix_layout, char uplo, lapack_int n,
    const double *a, lapack_int lda, const double *e, const lapack_int
    *ipiv, double anorm, double *rcond)
lapack_int LAPACKE_csycon_3 (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float *a, lapack_int lda, const
    lapack_complex_float *e, const lapack_int *ipiv, float anorm, float
    *rcond)
lapack_int LAPACKE_zsycon_3 (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *e, const lapack_int *ipiv, double anorm,
    double *rcond)
lapack_int LAPACKE_checon_3 (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float *a, lapack_int lda, const
    lapack_complex_float *e, const lapack_int *ipiv, float anorm, float
    *rcond)
lapack_int LAPACKE_zhecon_3 (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double *a, lapack_int lda, const
    lapack_complex_double *e, const lapack_int *ipiv, double anorm,
    double *rcond)
lapack_int LAPACKE_ssycon_3_work (int matrix_layout, char uplo,
    lapack_int n, const float *a, lapack_int lda, const float *e, const
    lapack_int *ipiv, float anorm, float *rcond, float *work, lapack_int
    *iwork)
lapack_int LAPACKE_dsycon_3_work (int matrix_layout, char uplo,
    lapack_int n, const double *a, lapack_int lda, const double *e,
    const lapack_int *ipiv, double anorm, double *rcond, double *work,
    lapack_int *iwork)
lapack_int LAPACKE_csycon_3_work (int matrix_layout, char uplo,
    lapack_int n, const lapack_complex_float *a, lapack_int lda, const
    lapack_complex_float *e, const lapack_int *ipiv, float anorm, float
    *rcond, lapack_complex_float *work)

okay that's this batch of prototype girlies handled — and yes the list keeps going, because of course it does 💀 but we're literally so close to being fluent in this header, i can feel it. more coming right up ✨

okay so we're still deep in prototype city and honestly? this section is giving "the header file that ate an entire afternoon" 😭 but it's fine, because every single one of these bad boys returns a lapack_int and takes int matrix_layout as its very first argument — that's just the house style, periodt 💅 let's take them in squads ✨


🫶 the condition-number girlies (the _3 era)

these are the _3-flavored condition estimators. you hand over uplo, the dimension n, the matrix a with its lda, the e array, the pivot list ipiv, and an anorm that you bring yourself. rcond comes back out at you through a pointer, and there's a work array because of course there is 🎀

lapack_int LAPACKE_zsycon_3_work (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double *a, lapack_int lda, const lapack_complex_double *e, const lapack_int *ipiv, double anorm, double *rcond, lapack_complex_double *work)
lapack_int LAPACKE_checon_3_work (int matrix_layout, char uplo, lapack_int n, const lapack_complex_float *a, lapack_int lda, const lapack_complex_float *e, const lapack_int *ipiv, float anorm, float *rcond, lapack_complex_float *work)
lapack_int LAPACKE_zhecon_3_work (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double *a, lapack_int lda, const lapack_complex_double *e, const lapack_int *ipiv, double anorm, double *rcond, lapack_complex_double *work)

note how z and c get double/float anorm and rcond — the complex types keep their real precision for those two, iykyk 🌸


🦋 the gelq family (LQ factorization, no cap)

four precisions, four _work-less convenience calls. you pass m, n, the matrix a with lda, then t and its tsize 🌈

lapack_int LAPACKE_sgelq (int matrix_layout, lapack_int m, lapack_int n, float *a, lapack_int lda, float *t, lapack_int tsize)
lapack_int LAPACKE_dgelq (int matrix_layout, lapack_int m, lapack_int n, double *a, lapack_int lda, double *t, lapack_int tsize)
lapack_int LAPACKE_cgelq (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *t, lapack_int tsize)
lapack_int LAPACKE_zgelq (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_complex_double *t, lapack_int tsize)

and the _work versions, which tack on work + lwork at the end so you can be the main character who manages her own scratch space 🔥

lapack_int LAPACKE_sgelq_work (int matrix_layout, lapack_int m, lapack_int n, float *a, lapack_int lda, float *t, lapack_int tsize, float *work, lapack_int lwork)
lapack_int LAPACKE_dgelq_work (int matrix_layout, lapack_int m, lapack_int n, double *a, lapack_int lda, double *t, lapack_int tsize, double *work, lapack_int lwork)
lapack_int LAPACKE_cgelq_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *t, lapack_int tsize, lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zgelq_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_complex_double *t, lapack_int tsize, lapack_complex_double *work, lapack_int lwork)

💜 gemlq — the multiply-by-Q squad

same energy, but now it's a multiply: side, trans, m, n, k, a const a with lda, a const t with tsize, and c with ldc getting written into 🎀

lapack_int LAPACKE_sgemlq (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const float *a, lapack_int lda, const float *t, lapack_int tsize, float *c, lapack_int ldc)
lapack_int LAPACKE_dgemlq (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const double *a, lapack_int lda, const double *t, lapack_int tsize, double *c, lapack_int ldc)
lapack_int LAPACKE_cgemlq (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float *a, lapack_int lda, const lapack_complex_float *t, lapack_int tsize, lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zgemlq (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *a, lapack_int lda, const lapack_complex_double *t, lapack_int tsize, lapack_complex_double *c, lapack_int ldc)

plus the _work foursome — identical, then work and lwork riding at the back 🚗

lapack_int LAPACKE_sgemlq_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const float *a, lapack_int lda, const float *t, lapack_int tsize, float *c, lapack_int ldc, float *work, lapack_int lwork)
lapack_int LAPACKE_dgemlq_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const double *a, lapack_int lda, const double *t, lapack_int tsize, double *c, lapack_int ldc, double *work, lapack_int lwork)
lapack_int LAPACKE_cgemlq_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float *a, lapack_int lda, const lapack_complex_float *t, lapack_int tsize, lapack_complex_float *c, lapack_int ldc, lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zgemlq_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *a, lapack_int lda, const lapack_complex_double *t, lapack_int tsize, lapack_complex_double *c, lapack_int ldc, lapack_complex_double *work, lapack_int lwork)

🧚 geqr — yes it's the QR twin, we love symmetry

literally the gelq shape again, just qr instead of lq. m, n, a, lda, t, tsize — go off ⭐

lapack_int LAPACKE_sgeqr (int matrix_layout, lapack_int m, lapack_int n, float *a, lapack_int lda, float *t, lapack_int tsize)
lapack_int LAPACKE_dgeqr (int matrix_layout, lapack_int m, lapack_int n, double *a, lapack_int lda, double *t, lapack_int tsize)
lapack_int LAPACKE_cgeqr (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *t, lapack_int tsize)
lapack_int LAPACKE_zgeqr (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_complex_double *t, lapack_int tsize)

and their _work besties 🫶

lapack_int LAPACKE_sgeqr_work (int matrix_layout, lapack_int m, lapack_int n, float *a, lapack_int lda, float *t, lapack_int tsize, float *work, lapack_int lwork)
lapack_int LAPACKE_dgeqr_work (int matrix_layout, lapack_int m, lapack_int n, double *a, lapack_int lda, double *t, lapack_int tsize, double *work, lapack_int lwork)
lapack_int LAPACKE_cgeqr_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_float *a, lapack_int lda, lapack_complex_float *t, lapack_int tsize, lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zgeqr_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double *a, lapack_int lda, lapack_complex_double *t, lapack_int tsize, lapack_complex_double *work, lapack_int lwork)

💖 gemqr — the multiply-by-Q (QR version)

same side/trans/m/n/k situation, const a, const t, mutable c, and that ldc 💅

lapack_int LAPACKE_sgemqr (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const float *a, lapack_int lda, const float *t, lapack_int tsize, float *c, lapack_int ldc)
lapack_int LAPACKE_dgemqr (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const double *a, lapack_int lda, const double *t, lapack_int tsize, double *c, lapack_int ldc)
lapack_int LAPACKE_cgemqr (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float *a, lapack_int lda, const lapack_complex_float *t, lapack_int tsize, lapack_complex_float *c, lapack_int ldc)
lapack_int LAPACKE_zgemqr (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *a, lapack_int lda, const lapack_complex_double *t, lapack_int tsize, lapack_complex_double *c, lapack_int ldc)

_work crew, as promised 🎀

lapack_int LAPACKE_sgemqr_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const float *a, lapack_int lda, const float *t, lapack_int tsize, float *c, lapack_int ldc, float *work, lapack_int lwork)
lapack_int LAPACKE_dgemqr_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const double *a, lapack_int lda, const double *t, lapack_int tsize, double *c, lapack_int ldc, double *work, lapack_int lwork)
lapack_int LAPACKE_cgemqr_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float *a, lapack_int lda, const lapack_complex_float *t, lapack_int tsize, lapack_complex_float *c, lapack_int ldc, lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zgemqr_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *a, lapack_int lda, const lapack_complex_double *t, lapack_int tsize, lapack_complex_double *c, lapack_int ldc, lapack_complex_double *work, lapack_int lwork)

🍓 getsls — trans, m, n, nrhs gang

here a and b are not const (they get chewed up), lda and ldb do their thing, and nrhs tells it how many right-hand sides are in the group chat 👑

lapack_int LAPACKE_sgetsls (int matrix_layout, char trans, lapack_int m, lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *b, lapack_int ldb)
lapack_int LAPACKE_dgetsls (int matrix_layout, char trans, lapack_int m, lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double *b, lapack_int ldb)
lapack_int LAPACKE_cgetsls (int matrix_layout, char trans, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_zgetsls (int matrix_layout, char trans, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda, lapack_complex_double *b, lapack_int ldb)

and obviously _work, because work/lwork never miss a party 😭

lapack_int LAPACKE_sgetsls_work (int matrix_layout, char trans, lapack_int m, lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *b, lapack_int ldb, float *work, lapack_int lwork)
lapack_int LAPACKE_dgetsls_work (int matrix_layout, char trans, lapack_int m, lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double *b, lapack_int ldb, double *work, lapack_int lwork)
lapack_int LAPACKE_cgetsls_work (int matrix_layout, char trans, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int lda, lapack_complex_float *b, lapack_int ldb, lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zgetsls_work (int matrix_layout, char trans, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int lda, lapack_complex_double *b, lapack_int ldb, lapack_complex_double *work, lapack_int lwork)

👑 the 2stage era has entered the chat

welcome to the two-stage eigenvalue routines. the plain ev and evd ones are jobz, uplo, n, a, lda, w — cute, compact, iconic 🔥

lapack_int LAPACKE_ssyev_2stage (int matrix_layout, char jobz, char uplo, lapack_int n, float *a, lapack_int lda, float *w)
lapack_int LAPACKE_dsyev_2stage (int matrix_layout, char jobz, char uplo, lapack_int n, double *a, lapack_int lda, double *w)
lapack_int LAPACKE_ssyevd_2stage (int matrix_layout, char jobz, char uplo, lapack_int n, float *a, lapack_int lda, float *w)
lapack_int LAPACKE_dsyevd_2stage (int matrix_layout, char jobz, char uplo, lapack_int n, double *a, lapack_int lda, double *w)

then evr shows up with the full glam: jobz, range, uplo, n, a, lda, the interval vl + vu, the indices il + iu, abstol, plus m, w, z, ldz and isuppz 😮‍💨

lapack_int LAPACKE_ssyevr_2stage (int matrix_layout, char jobz, char range, char uplo, lapack_int n, float *a, lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w, float *z, lapack_int ldz, lapack_int *isuppz)
lapack_int LAPACKE_dsyevr_2stage (int matrix_layout, char jobz, char range, char uplo, lapack_int n, double *a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int *m, double *w, double *z, lapack_int ldz, lapack_int *isuppz)

and evx is basically evr's cousin who swapped isuppz for ifail 🙈

lapack_int LAPACKE_ssyevx_2stage (int matrix_layout, char jobz, char range, char uplo, lapack_int n, float *a, lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w, float *z, lapack_int ldz, lapack_int *ifail)
lapack_int LAPACKE_dsyevx_2stage (int matrix_layout, char jobz, char

okay and that last one literally gets cut off mid-signature right here in the source — the double version of syevx_2stage keeps going into the next chunk, so don't panic, she's not broken, she's just continuing 💀 see you in the next drop bestie 🦋

okay so we literally pick up mid-signature — the tail end of the last one from before is this, no cap:

           range, char uplo, lapack_int n, double *a, lapack_int lda, double
           vl, double vu, lapack_int il, lapack_int iu, double abstol,
           lapack_int *m, double *w, double *z, lapack_int ldz, lapack_int
           *ifail)

and now we're in the _2stage_work era, bestie. symmetric eigenvalue energy, single and double precision, both showing up like they're matching outfits 🎀

       lapack_int LAPACKE_ssyev_2stage_work (int matrix_layout, char jobz, char
           uplo, lapack_int n, float *a, lapack_int lda, float *w, float *work,
           lapack_int lwork)
       lapack_int LAPACKE_dsyev_2stage_work (int matrix_layout, char jobz, char
           uplo, lapack_int n, double *a, lapack_int lda, double *w, double
           *work, lapack_int lwork)
       lapack_int LAPACKE_ssyevd_2stage_work (int matrix_layout, char jobz,
           char uplo, lapack_int n, float *a, lapack_int lda, float *w, float
           *work, lapack_int lwork, lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_dsyevd_2stage_work (int matrix_layout, char jobz,
           char uplo, lapack_int n, double *a, lapack_int lda, double *w,
           double *work, lapack_int lwork, lapack_int *iwork, lapack_int
           liwork)

see how the d versions are just the s versions but thiccer? double the precision, double the work array drama 💅 stay with me.

next up: the evr and evx girlies — they brought their range, vl, vu, il, iu and abstol besties along, plus output counters and workspace for DAYS:

       lapack_int LAPACKE_ssyevr_2stage_work (int matrix_layout, char jobz,
           char range, char uplo, lapack_int n, float *a, lapack_int lda, float
           vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int
           *m, float *w, float *z, lapack_int ldz, lapack_int *isuppz, float
           *work, lapack_int lwork, lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_dsyevr_2stage_work (int matrix_layout, char jobz,
           char range, char uplo, lapack_int n, double *a, lapack_int lda,
           double vl, double vu, lapack_int il, lapack_int iu, double abstol,
           lapack_int *m, double *w, double *z, lapack_int ldz, lapack_int
           *isuppz, double *work, lapack_int lwork, lapack_int *iwork,
           lapack_int liwork)
       lapack_int LAPACKE_ssyevx_2stage_work (int matrix_layout, char jobz,
           char range, char uplo, lapack_int n, float *a, lapack_int lda, float
           vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int
           *m, float *w, float *z, lapack_int ldz, float *work, lapack_int
           lwork, lapack_int *iwork, lapack_int *ifail)
       lapack_int LAPACKE_dsyevx_2stage_work (int matrix_layout, char jobz,
           char range, char uplo, lapack_int n, double *a, lapack_int lda,
           double vl, double vu, lapack_int il, lapack_int iu, double abstol,
           lapack_int *m, double *w, double *z, lapack_int ldz, double *work,
           lapack_int lwork, lapack_int *iwork, lapack_int *ifail)

the way evr gives you isuppz and evx gives you ifail instead… they're different flavors, okay? don't mix them up 🦋


and THEN we pivot to Hermitian matrices with a c/z moment — complex single and complex double, living their best _2stage lives:

       lapack_int LAPACKE_cheev_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, float
           *w)
       lapack_int LAPACKE_zheev_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, double
           *w)
       lapack_int LAPACKE_cheevd_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, float
           *w)
       lapack_int LAPACKE_zheevd_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, double
           *w)

these are the cute short ones — no extra workspace args in the plain versions, just jobz, uplo, n, a, lda, and w. minimal, clean, iconic ✨

then the evr and evx Hermitian versions roll in with the full entourage again, range through isuppz / ifail:

       lapack_int LAPACKE_cheevr_2stage (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_complex_float *a, lapack_int
           lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
           lapack_int *m, float *w, lapack_complex_float *z, lapack_int ldz,
           lapack_int *isuppz)
       lapack_int LAPACKE_zheevr_2stage (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_complex_double *a, lapack_int
           lda, double vl, double vu, lapack_int il, lapack_int iu, double
           abstol, lapack_int *m, double *w, lapack_complex_double *z,
           lapack_int ldz, lapack_int *isuppz)
       lapack_int LAPACKE_cheevx_2stage (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_complex_float *a, lapack_int
           lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
           lapack_int *m, float *w, lapack_complex_float *z, lapack_int ldz,
           lapack_int *ifail)
       lapack_int LAPACKE_zheevx_2stage (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_complex_double *a, lapack_int
           lda, double vl, double vu, lapack_int il, lapack_int iu, double
           abstol, lapack_int *m, double *w, lapack_complex_double *z,
           lapack_int ldz, lapack_int *ifail)

and now the _work versions of those, where rwork enters the chat 🌸 (yes, complex routines get a real workspace buddy, that's just how it is):

       lapack_int LAPACKE_cheev_2stage_work (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_complex_float *a, lapack_int lda, float
           *w, lapack_complex_float *work, lapack_int lwork, float *rwork)
       lapack_int LAPACKE_zheev_2stage_work (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_complex_double *a, lapack_int lda, double
           *w, lapack_complex_double *work, lapack_int lwork, double *rwork)
       lapack_int LAPACKE_cheevd_2stage_work (int matrix_layout, char jobz,
           char uplo, lapack_int n, lapack_complex_float *a, lapack_int lda,
           float *w, lapack_complex_float *work, lapack_int lwork, float
           *rwork, lapack_int lrwork, lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_zheevd_2stage_work (int matrix_layout, char jobz,
           char uplo, lapack_int n, lapack_complex_double *a, lapack_int lda,
           double *w, lapack_complex_double *work, lapack_int lwork, double
           *rwork, lapack_int lrwork, lapack_int *iwork, lapack_int liwork)

like, work, rwork, iwork, lwork, lrwork, liwork — it's giving workspace overload and honestly? valid. 😭

here come the evr / evx work variants, fully accessorized:

       lapack_int LAPACKE_cheevr_2stage_work (int matrix_layout, char jobz,
           char range, char uplo, lapack_int n, lapack_complex_float *a,
           lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu,
           float abstol, lapack_int *m, float *w, lapack_complex_float *z,
           lapack_int ldz, lapack_int *isuppz, lapack_complex_float *work,
           lapack_int lwork, float *rwork, lapack_int lrwork, lapack_int
           *iwork, lapack_int liwork)
       lapack_int LAPACKE_zheevr_2stage_work (int matrix_layout, char jobz,
           char range, char uplo, lapack_int n, lapack_complex_double *a,
           lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu,
           double abstol, lapack_int *m, double *w, lapack_complex_double *z,
           lapack_int ldz, lapack_int *isuppz, lapack_complex_double *work,
           lapack_int lwork, double *rwork, lapack_int lrwork, lapack_int
           *iwork, lapack_int liwork)
       lapack_int LAPACKE_cheevx_2stage_work (int matrix_layout, char jobz,
           char range, char uplo, lapack_int n, lapack_complex_float *a,
           lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu,
           float abstol, lapack_int *m, float *w, lapack_complex_float *z,
           lapack_int ldz, lapack_complex_float *work, lapack_int lwork, float
           *rwork, lapack_int *iwork, lapack_int *ifail)
       lapack_int LAPACKE_zheevx_2stage_work (int matrix_layout, char jobz,
           char range, char uplo, lapack_int n, lapack_complex_double *a,
           lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu,
           double abstol, lapack_int *m, double *w, lapack_complex_double *z,
           lapack_int ldz, lapack_complex_double *work, lapack_int lwork,
           double *rwork, lapack_int *iwork, lapack_int *ifail)

okay now the band-matrix section enters and it's a whole different silhouette — you got kd, ab, ldab, and often q / ldq in the mix. banded symmetric, single + double, let's go 🔥

       lapack_int LAPACKE_ssbev_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_int kd, float *ab, lapack_int ldab, float
           *w, float *z, lapack_int ldz)
       lapack_int LAPACKE_dsbev_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_int kd, double *ab, lapack_int ldab,
           double *w, double *z, lapack_int ldz)
       lapack_int LAPACKE_ssbevd_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_int kd, float *ab, lapack_int ldab, float
           *w, float *z, lapack_int ldz)
       lapack_int LAPACKE_dsbevd_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_int kd, double *ab, lapack_int ldab,
           double *w, double *z, lapack_int ldz)

the evx versions show up with range, vl, vu, il, iu, abstol, m, ifail AND the q/ldq pair — main character energy fr fr:

       lapack_int LAPACKE_ssbevx_2stage (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_int kd, float *ab, lapack_int
           ldab, float *q, lapack_int ldq, float vl, float vu, lapack_int il,
           lapack_int iu, float abstol, lapack_int *m, float *w, float *z,
           lapack_int ldz, lapack_int *ifail)
       lapack_int LAPACKE_dsbevx_2stage (int matrix_layout, char jobz, char
           range, char uplo, lapack_int n, lapack_int kd, double *ab,
           lapack_int ldab, double *q, lapack_int ldq, double vl, double vu,
           lapack_int il, lapack_int iu, double abstol, lapack_int *m, double
           *w, double *z, lapack_int ldz, lapack_int *ifail)

and the _work band girlies — ssbev/dsbev pick up work + lwork:

       lapack_int LAPACKE_ssbev_2stage_work (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_int kd, float *ab, lapack_int ldab, float
           *w, float *z, lapack_int ldz, float *work, lapack_int lwork)
       lapack_int LAPACKE_dsbev_2stage_work (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_int kd, double *ab, lapack_int ldab,
           double *w, double *z, lapack_int ldz, double *work, lapack_int
           lwork)

ssbevd/dsbevd also bring iwork and liwork along for the ride:

       lapack_int LAPACKE_ssbevd_2stage_work (int matrix_layout, char jobz,
           char uplo, lapack_int n, lapack_int kd, float *ab, lapack_int ldab,
           float *w, float *z, lapack_int ldz, float *work, lapack_int lwork,
           lapack_int *iwork, lapack_int liwork)
       lapack_int LAPACKE_dsbevd_2stage_work (int matrix_layout, char jobz,
           char uplo, lapack_int n, lapack_int kd, double *ab, lapack_int ldab,
           double *w, double *z, lapack_int ldz, double *work, lapack_int
           lwork, lapack_int *iwork, lapack_int liwork)

and the evx work ones are the fullest fit — q, ldq, range stuff, abstol, m, z, ldz, work, lwork, iwork, ifail, all of it 💀:

       lapack_int LAPACKE_ssbevx_2stage_work (int matrix_layout, char jobz,
           char range, char uplo, lapack_int n, lapack_int kd, float *ab,
           lapack_int ldab, float *q, lapack_int ldq, float vl, float vu,
           lapack_int il, lapack_int iu, float abstol, lapack_int *m, float *w,
           float *z, lapack_int ldz, float *work, lapack_int lwork, lapack_int
           *iwork, lapack_int *ifail)
       lapack_int LAPACKE_dsbevx_2stage_work (int matrix_layout, char jobz,
           char range, char uplo, lapack_int n, lapack_int kd, double *ab,
           lapack_int ldab, double *q, lapack_int ldq, double vl, double vu,
           lapack_int il, lapack_int iu, double abstol, lapack_int *m, double
           *w, double *z, lapack_int ldz, double *work, lapack_int lwork,
           lapack_int *iwork, lapack_int *ifail)

finally for this stretch, banded Hermitian — chbev/zhbev and chbevd/zhbevd, complex banded besties with their ab, ldab, w, z, ldz setup 🌈:

       lapack_int LAPACKE_chbev_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_int kd, lapack_complex_float *ab,
           lapack_int ldab, float *w, lapack_complex_float *z, lapack_int ldz)
       lapack_int LAPACKE_zhbev_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_int kd, lapack_complex_double *ab,
           lapack_int ldab, double *w, lapack_complex_double *z, lapack_int
           ldz)
       lapack_int LAPACKE_chbevd_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_int kd, lapack_complex_float *ab,
           lapack_int ldab, float *w, lapack_complex_float *z, lapack_int ldz)
       lapack_int LAPACKE_zhbevd_2stage (int matrix_layout, char jobz, char
           uplo, lapack_int n, lapack_int kd, lapack_complex_double *ab,
           lapack_int ldab, double *w, lapack_complex_double *z, lapack_int
           ldz)

that's where this part lands, and yes there's still more coming — don't close the tab yet, bestie 🫶

okay so we are STILL in the function-prototype era of this page and honestly? it's giving "wall of text" but make it ✨fancy✨. every one of these is a lapack_int-returning function, and if you clock the pattern you'll be thriving. keep your eyes on the params, bestie, because they are the whole personality 💅

🦋 the 2-stage banded Hermitian eigensolvers (the ones that also want you to pass a q)

lapack_int LAPACKE_chbevx_2stage (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int kd, lapack_complex_float
    *ab, lapack_int ldab, lapack_complex_float *q, lapack_int ldq, float
    vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int
    *m, float *w, lapack_complex_float *z, lapack_int ldz, lapack_int
    *ifail)
lapack_int LAPACKE_zhbevx_2stage (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int kd, lapack_complex_double
    *ab, lapack_int ldab, lapack_complex_double *q, lapack_int ldq,
    double vl, double vu, lapack_int il, lapack_int iu, double abstol,
    lapack_int *m, double *w, lapack_complex_double *z, lapack_int ldz,
    lapack_int *ifail)

not the range, vl, vu, il, iu, abstol, *m and *ifail combo — that's the "pick me a slice of eigenvalues and tell me who failed" starter pack ✨ the _x in the name is doing so much work here, iykyk.


🎀 the _work girlies for those two

lapack_int LAPACKE_chbev_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, lapack_int kd, lapack_complex_float *ab,
    lapack_int ldab, float *w, lapack_complex_float *z, lapack_int ldz,
    lapack_complex_float *work, lapack_int lwork, float *rwork)
lapack_int LAPACKE_zhbev_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, lapack_int kd, lapack_complex_double *ab,
    lapack_int ldab, double *w, lapack_complex_double *z, lapack_int
    ldz, lapack_complex_double *work, lapack_int lwork, double *rwork)
lapack_int LAPACKE_chbevd_2stage_work (int matrix_layout, char jobz,
    char uplo, lapack_int n, lapack_int kd, lapack_complex_float *ab,
    lapack_int ldab, float *w, lapack_complex_float *z, lapack_int ldz,
    lapack_complex_float *work, lapack_int lwork, float *rwork,
    lapack_int lrwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_zhbevd_2stage_work (int matrix_layout, char jobz,
    char uplo, lapack_int n, lapack_int kd, lapack_complex_double *ab,
    lapack_int ldab, double *w, lapack_complex_double *z, lapack_int
    ldz, lapack_complex_double *work, lapack_int lwork, double *rwork,
    lapack_int lrwork, lapack_int *iwork, lapack_int liwork)
lapack_int LAPACKE_chbevx_2stage_work (int matrix_layout, char jobz,
    char range, char uplo, lapack_int n, lapack_int kd,
    lapack_complex_float *ab, lapack_int ldab, lapack_complex_float *q,
    lapack_int ldq, float vl, float vu, lapack_int il, lapack_int iu,
    float abstol, lapack_int *m, float *w, lapack_complex_float *z,
    lapack_int ldz, lapack_complex_float *work, lapack_int lwork, float
    *rwork, lapack_int *iwork, lapack_int *ifail)
lapack_int LAPACKE_zhbevx_2stage_work (int matrix_layout, char jobz,
    char range, char uplo, lapack_int n, lapack_int kd,
    lapack_complex_double *ab, lapack_int ldab, lapack_complex_double
    *q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int
    iu, double abstol, lapack_int *m, double *w, lapack_complex_double
    *z, lapack_int ldz, lapack_complex_double *work, lapack_int lwork,
    double *rwork, lapack_int *iwork, lapack_int *ifail)

okay the d ones (that's chbevd/zhbevd) said "let's also bring lrwork, iwork and liwork to the function" and honestly? main character energy 👑 the _x ones keep ifail all the way through — if you're passing ifail, hi, you're the responsible friend now 🫶


🌸 generalized symmetric-definite eigenproblems, but make it 2-stage

lapack_int LAPACKE_ssygv_2stage (int matrix_layout, lapack_int itype,
    char jobz, char uplo, lapack_int n, float *a, lapack_int lda, float
    *b, lapack_int ldb, float *w)
lapack_int LAPACKE_dsygv_2stage (int matrix_layout, lapack_int itype,
    char jobz, char uplo, lapack_int n, double *a, lapack_int lda,
    double *b, lapack_int ldb, double *w)
lapack_int LAPACKE_ssygv_2stage_work (int matrix_layout, lapack_int
    itype, char jobz, char uplo, lapack_int n, float *a, lapack_int lda,
    float *b, lapack_int ldb, float *w, float *work, lapack_int lwork)
lapack_int LAPACKE_dsygv_2stage_work (int matrix_layout, lapack_int
    itype, char jobz, char uplo, lapack_int n, double *a, lapack_int
    lda, double *b, lapack_int ldb, double *w, double *work, lapack_int
    lwork)

two matrices besties!! a and b, both with their own leading dimension (lda and ldb), plus that itype selector at the front and *w at the back. so many little guys in one signature 😭


💜 the Hermitian version (same energy, but a and b are complex)

lapack_int LAPACKE_chegv_2stage (int matrix_layout, lapack_int itype,
    char jobz, char uplo, lapack_int n, lapack_complex_float *a,
    lapack_int lda, lapack_complex_float *b, lapack_int ldb, float *w)
lapack_int LAPACKE_zhegv_2stage (int matrix_layout, lapack_int itype,
    char jobz, char uplo, lapack_int n, lapack_complex_double *a,
    lapack_int lda, lapack_complex_double *b, lapack_int ldb, double *w)
lapack_int LAPACKE_chegv_2stage_work (int matrix_layout, lapack_int
    itype, char jobz, char uplo, lapack_int n, lapack_complex_float *a,
    lapack_int lda, lapack_complex_float *b, lapack_int ldb, float *w,
    lapack_complex_float *work, lapack_int lwork, float *rwork)
lapack_int LAPACKE_zhegv_2stage_work (int matrix_layout, lapack_int
    itype, char jobz, char uplo, lapack_int n, lapack_complex_double *a,
    lapack_int lda, lapack_complex_double *b, lapack_int ldb, double *w,
    lapack_complex_double *work, lapack_int lwork, double *rwork)

the _work versions picked up a little rwork as a treat 🍓 and the w (eigenvalues) stays real even when a and b are complex — that's just how she is, periodt.


✨ the _aa_2stage solve era begins

lapack_int LAPACKE_ssysv_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *tb,
    lapack_int ltb, lapack_int *ipiv, lapack_int *ipiv2, float *b,
    lapack_int ldb)
lapack_int LAPACKE_ssysv_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *tb,
    lapack_int ltb, lapack_int *ipiv, lapack_int *ipiv2, float *b,
    lapack_int ldb, float *work, lapack_int lwork)
lapack_int LAPACKE_dsysv_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double
    *tb, lapack_int ltb, lapack_int *ipiv, lapack_int *ipiv2, double *b,
    lapack_int ldb)
lapack_int LAPACKE_dsysv_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double
    *tb, lapack_int ltb, lapack_int *ipiv, lapack_int *ipiv2, double *b,
    lapack_int ldb, double *work, lapack_int lwork)
lapack_int LAPACKE_csysv_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_csysv_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zsysv_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_double *b, lapack_int ldb)
lapack_int LAPACKE_zsysv_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *work, lapack_int lwork)

TWO pivot arrays!! ipiv AND ipiv2 — it's giving "I have a backup plan and a backup plan for my backup plan" 🙈 also peep tb with its own ltb, very demure, very mindful.


🧚 the Hermitian _aa_2stage solvers

lapack_int LAPACKE_chesv_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_float *b, lapack_int ldb)
lapack_int LAPACKE_chesv_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
    lda, lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_float *b, lapack_int ldb,
    lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zhesv_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_double *b, lapack_int ldb)
lapack_int LAPACKE_zhesv_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
    lda, lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_double *b, lapack_int ldb,
    lapack_complex_double *work, lapack_int lwork)

che/zhe instead of ss/dd/cs/zz — that's the Hermitian glow-up 💅 same arg energy though, so if you learned the sysv ones you're literally already done.


🔥 factorizations: sytrf_aa_2stage (the "no b, just vibes" set)

lapack_int LAPACKE_ssytrf_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, float *a, lapack_int lda, float *tb, lapack_int ltb,
    lapack_int *ipiv, lapack_int *ipiv2)
lapack_int LAPACKE_ssytrf_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, float *a, lapack_int lda, float *tb, lapack_int ltb,
    lapack_int *ipiv, lapack_int *ipiv2, float *work, lapack_int lwork)
lapack_int LAPACKE_dsytrf_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, double *a, lapack_int lda, double *tb, lapack_int ltb,
    lapack_int *ipiv, lapack_int *ipiv2)
lapack_int LAPACKE_dsytrf_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, double *a, lapack_int lda, double *tb, lapack_int ltb,
    lapack_int *ipiv, lapack_int *ipiv2, double *work, lapack_int lwork)
lapack_int LAPACKE_csytrf_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2)
lapack_int LAPACKE_csytrf_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zsytrf_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2)
lapack_int LAPACKE_zsytrf_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_double *work, lapack_int lwork)

notice how nrhs and b and ldb just… dipped 🫧 no solving today, we're just factoring. the non-_work ones don't even take work/lwork — iconic minimalism, ngl.


💀 and now the Hermitian factorizations

lapack_int LAPACKE_chetrf_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2)
lapack_int LAPACKE_chetrf_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float *a, lapack_int lda,
    lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_float *work, lapack_int lwork)
lapack_int LAPACKE_zhetrf_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2)
lapack_int LAPACKE_zhetrf_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_double *a, lapack_int lda,
    lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
    lapack_int *ipiv2, lapack_complex_double *work, lapack_int lwork)

che/zhe twins of the sy ones above — the way that these are just copy-paste with a new letter is lowkey sending me 😭


🌈 and we get ONE (1) line of the next family before this part cuts off, because of course we do

lapack_int LAPACKE_ssytrs_aa_2stage (int matrix_layout, char uplo,

and that's where the page just… stops mid-signature 💀 _trs said "I'm next" and dipped. keep scrolling, bestie, she finishes in the next part — no cap.

...bestie we're still deep in the prototype wall and honestly? it's giving phonebook, but make it glam 💅 — the _2stage girls are finishing up, so let's not lose the thread. This is the tail end of the ssytrs_aa_2stage_work signature, then the whole squad rolls in:

           lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *tb,
           lapack_int ltb, lapack_int *ipiv, lapack_int *ipiv2, float *b,
           lapack_int ldb)
       lapack_int LAPACKE_ssytrs_aa_2stage_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, float *a, lapack_int lda, float *tb,
           lapack_int ltb, lapack_int *ipiv, lapack_int *ipiv2, float *b,
           lapack_int ldb)
       lapack_int LAPACKE_dsytrs_aa_2stage (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double
           *tb, lapack_int ltb, lapack_int *ipiv, lapack_int *ipiv2, double *b,
           lapack_int ldb)
       lapack_int LAPACKE_dsytrs_aa_2stage_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, double *a, lapack_int lda, double
           *tb, lapack_int ltb, lapack_int *ipiv, lapack_int *ipiv2, double *b,
           lapack_int ldb)
       lapack_int LAPACKE_csytrs_aa_2stage (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
           lda, lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_csytrs_aa_2stage_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
           lda, lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zsytrs_aa_2stage (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_zsytrs_aa_2stage_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_double *b, lapack_int ldb)

okay so notice the pattern bestie — s/d/c/z for the four precision flavors, and every one of them gets a plain name plus a _work twin. It's the same energy as having a main character and her work-in-progress bestie 🫶


and here come the Hermitian girlies — chetrs_aa_2stage and zhetrs_aa_2stage, same deal, both with their _work counterparts:

       lapack_int LAPACKE_chetrs_aa_2stage (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
           lda, lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_chetrs_aa_2stage_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_float *a, lapack_int
           lda, lapack_complex_float *tb, lapack_int ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_float *b, lapack_int ldb)
       lapack_int LAPACKE_zhetrs_aa_2stage (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_double *b, lapack_int ldb)
       lapack_int LAPACKE_zhetrs_aa_2stage_work (int matrix_layout, char uplo,
           lapack_int n, lapack_int nrhs, lapack_complex_double *a, lapack_int
           lda, lapack_complex_double *tb, lapack_int ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_double *b, lapack_int ldb)

🌸 and now we enter the LAPACK_ zone — no E in the middle, these are the raw Fortran-style interfaces, and the way they hand you pointers to everything including the info... it's giving "you WILL be checking your return codes, bestie" 💀

First up, the LU factorization icons — getrf, all four precisions:

       void LAPACK_sgetrf (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, lapack_int *ipiv, lapack_int *info)
       void LAPACK_dgetrf (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *ipiv, lapack_int *info)
       void LAPACK_cgetrf (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_int *ipiv, lapack_int *info)
       void LAPACK_zgetrf (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_int *ipiv, lapack_int *info)

and their little siblings getrf2 — same energy, different suffix, still iconic:

       void LAPACK_sgetrf2 (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, lapack_int *ipiv, lapack_int *info)
       void LAPACK_dgetrf2 (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *ipiv, lapack_int *info)
       void LAPACK_cgetrf2 (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_int *ipiv, lapack_int *info)
       void LAPACK_zgetrf2 (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_int *ipiv, lapack_int *info)

then the banded besties gbtrf — note the extra kl and ku args, she's got range (literally, lower and upper bandwidth, iykyk):

       void LAPACK_sgbtrf (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, float *ab, lapack_int *ldab, lapack_int *ipiv,
           lapack_int *info)
       void LAPACK_dgbtrf (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, double *ab, lapack_int *ldab, lapack_int *ipiv,
           lapack_int *info)
       void LAPACK_cgbtrf (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, lapack_complex_float *ab, lapack_int *ldab,
           lapack_int *ipiv, lapack_int *info)
       void LAPACK_zgbtrf (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, lapack_complex_double *ab, lapack_int *ldab,
           lapack_int *ipiv, lapack_int *info)

and the tridiagonal trio gttrf — dl, d, du, du2, ipiv, info, she's got a lot going on and we respect it 💜:

       void LAPACK_sgttrf (lapack_int *n, float *dl, float *d, float *du, float
           *du2, lapack_int *ipiv, lapack_int *info)
       void LAPACK_dgttrf (lapack_int *n, double *dl, double *d, double *du,
           double *du2, lapack_int *ipiv, lapack_int *info)
       void LAPACK_cgttrf (lapack_int *n, lapack_complex_float *dl,
           lapack_complex_float *d, lapack_complex_float *du,
           lapack_complex_float *du2, lapack_int *ipiv, lapack_int *info)
       void LAPACK_zgttrf (lapack_int *n, lapack_complex_double *dl,
           lapack_complex_double *d, lapack_complex_double *du,
           lapack_complex_double *du2, lapack_int *ipiv, lapack_int *info)

✨ Cholesky era ✨ — potrf2 first (the sequel, naturally):

       void LAPACK_spotrf2 (char *uplo, lapack_int *n, float *a, lapack_int
           *lda, lapack_int *info)
       void LAPACK_dpotrf2 (char *uplo, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *info)
       void LAPACK_cpotrf2 (char *uplo, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, lapack_int *info)
       void LAPACK_zpotrf2 (char *uplo, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_int *info)

then the OGs, potrf:

       void LAPACK_spotrf (char *uplo, lapack_int *n, float *a, lapack_int
           *lda, lapack_int *info)
       void LAPACK_dpotrf (char *uplo, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *info)
       void LAPACK_cpotrf (char *uplo, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, lapack_int *info)
       void LAPACK_zpotrf (char *uplo, lapack_int *n, lapack_complex_double *a,
           lapack_int *lda, lapack_int *info)

and pstrf — pivoted, so she's got piv, rank, tol and work to carry, highkey the busiest girl here 🎀:

       void LAPACK_dpstrf (char *uplo, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *piv, lapack_int *rank, double *tol, double *work,
           lapack_int *info)
       void LAPACK_spstrf (char *uplo, lapack_int *n, float *a, lapack_int
           *lda, lapack_int *piv, lapack_int *rank, float *tol, float *work,
           lapack_int *info)
       void LAPACK_zpstrf (char *uplo, lapack_int *n, lapack_complex_double *a,
           lapack_int *lda, lapack_int *piv, lapack_int *rank, double *tol,
           double *work, lapack_int *info)
       void LAPACK_cpstrf (char *uplo, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, lapack_int *piv, lapack_int *rank, float *tol,
           float *work, lapack_int *info)

(and yes bestie, the d and z ones came first in that list — sometimes the alphabet gets reordered and we just deal 💅)


okay, pftrf — RFP format, she brought transr to the party:

       void LAPACK_dpftrf (char *transr, char *uplo, lapack_int *n, double *a,
           lapack_int *info)
       void LAPACK_spftrf (char *transr, char *uplo, lapack_int *n, float *a,
           lapack_int *info)
       void LAPACK_zpftrf (char *transr, char *uplo, lapack_int *n,
           lapack_complex_double *a, lapack_int *info)
       void LAPACK_cpftrf (char *transr, char *uplo, lapack_int *n,
           lapack_complex_float *a, lapack_int *info)

packed storage crew pptrf — note it's ap, not a, because packed life is different:

       void LAPACK_spptrf (char *uplo, lapack_int *n, float *ap, lapack_int
           *info)
       void LAPACK_dpptrf (char *uplo, lapack_int *n, double *ap, lapack_int
           *info)
       void LAPACK_cpptrf (char *uplo, lapack_int *n, lapack_complex_float *ap,
           lapack_int *info)
       void LAPACK_zpptrf (char *uplo, lapack_int *n, lapack_complex_double
           *ap, lapack_int *info)

banded positive-definite pbtrf — kd and ldab in the house:

       void LAPACK_spbtrf (char *uplo, lapack_int *n, lapack_int *kd, float
           *ab, lapack_int *ldab, lapack_int *info)
       void LAPACK_dpbtrf (char *uplo, lapack_int *n, lapack_int *kd, double
           *ab, lapack_int *ldab, lapack_int *info)
       void LAPACK_cpbtrf (char *uplo, lapack_int *n, lapack_int *kd,
           lapack_complex_float *ab, lapack_int *ldab, lapack_int *info)
       void LAPACK_zpbtrf (char *uplo, lapack_int *n, lapack_int *kd,
           lapack_complex_double *ab, lapack_int *ldab, lapack_int *info)

and tridiagonal positive-definite pttrf — just d and e, minimal queen, no notes 🦋:

       void LAPACK_spttrf (lapack_int *n, float *d, float *e, lapack_int *info)
       void LAPACK_dpttrf (lapack_int *n, double *d, double *e, lapack_int
           *info)
       void LAPACK_cpttrf (lapack_int *n, float *d, lapack_complex_float *e,
           lapack_int *info)
       void LAPACK_zpttrf (lapack_int *n, double *d, lapack_complex_double *e,
           lapack_int *info)

🔥 symmetric & Hermitian indefinite factorization hours 🔥 — sytrf with her work/lwork duo:

       void LAPACK_ssytrf (char *uplo, lapack_int *n, float *a, lapack_int
           *lda, lapack_int *ipiv, float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_dsytrf (char *uplo, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *ipiv, double *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_csytrf (char *uplo, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, lapack_int *ipiv, lapack_complex_float *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_zsytrf (char *uplo, lapack_int *n, lapack_complex_double *a,
           lapack_int *lda, lapack_int *ipiv, lapack_complex_double *work,
           lapack_int *lwork, lapack_int *info)

and the hetrf twins, same shape, complex-only, living her truth:

       void LAPACK_chetrf (char *uplo, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, lapack_int *ipiv, lapack_complex_float *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_zhetrf (char *uplo, lapack_int *n, lapack_complex_double *a,
           lapack_int *lda, lapack_int *ipiv, lapack_complex_double *work,
           lapack_int *lwork, lapack_int *info)

packed versions sptrf / hptrf — no lwork here, she's low-maintenance:

       void LAPACK_ssptrf (char *uplo, lapack_int *n, float *ap, lapack_int
           *ipiv, lapack_int *info)
       void LAPACK_dsptrf (char *uplo, lapack_int *n, double *ap, lapack_int
           *ipiv, lapack_int *info)
       void LAPACK_csptrf (char *uplo, lapack_int *n, lapack_complex_float *ap,
           lapack_int *ipiv, lapack_int *info)
       void LAPACK_zsptrf (char *uplo, lapack_int *n, lapack_complex_double
           *ap, lapack_int *ipiv, lapack_int *info)
       void LAPACK_chptrf (char *uplo, lapack_int *n, lapack_complex_float *ap,
           lapack_int *ipiv, lapack_int *info)
       void LAPACK_zhptrf (char *uplo, lapack_int *n, lapack_complex_double
           *ap, lapack_int *ipiv, lapack_int *info)

and now the solve girlies arrive — getrs, and heads up: a and ipiv are const here because she's reading, not rewriting, periodt:

       void LAPACK_sgetrs (char *trans, lapack_int *n, lapack_int *nrhs, const
           float *a, lapack_int *lda, const lapack_int *ipiv, float *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_dgetrs (char *trans, lapack_int *n, lapack_int *nrhs, const
           double *a, lapack_int *lda, const lapack_int *ipiv, double *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_cgetrs (char *trans, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, const lapack_int *ipiv,
           lapack_complex_float *b, lapack_int *ldb, lapack_int *info)

...and we're cutting right there mid-cgetrs, bestie — do not close the fence in your head, the zgetrs of it all is coming in the next part 😭🫶

okay bestie, buckle up, we're deep in the prototype section and it's just... an absolute parade of solver routines 💅 every single one of these is void and every single argument is a pointer (yes, even the integers, yes, even info, don't ask, it's a LAPACK thing, we love her) 🎀

🦋 the ?getrs girlies — solve after a getrf

       void LAPACK_zgetrs (char *trans, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *a, lapack_int *lda, const lapack_int *ipiv,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)

✨ banded energy: ?gbtrs

       void LAPACK_sgbtrs (char *trans, lapack_int *n, lapack_int *kl,
           lapack_int *ku, lapack_int *nrhs, const float *ab, lapack_int *ldab,
           const lapack_int *ipiv, float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dgbtrs (char *trans, lapack_int *n, lapack_int *kl,
           lapack_int *ku, lapack_int *nrhs, const double *ab, lapack_int
           *ldab, const lapack_int *ipiv, double *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_cgbtrs (char *trans, lapack_int *n, lapack_int *kl,
           lapack_int *ku, lapack_int *nrhs, const lapack_complex_float *ab,
           lapack_int *ldab, const lapack_int *ipiv, lapack_complex_float *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_zgbtrs (char *trans, lapack_int *n, lapack_int *kl,
           lapack_int *ku, lapack_int *nrhs, const lapack_complex_double *ab,
           lapack_int *ldab, const lapack_int *ipiv, lapack_complex_double *b,
           lapack_int *ldb, lapack_int *info)

like yes, four of them, one per precision, that's the whole vibe — s/d/c/z and she's consistent about it 🌈

🎀 tridiagonal cuties: ?gttrs

       void LAPACK_sgttrs (char *trans, lapack_int *n, lapack_int *nrhs, const
           float *dl, const float *d, const float *du, const float *du2, const
           lapack_int *ipiv, float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dgttrs (char *trans, lapack_int *n, lapack_int *nrhs, const
           double *dl, const double *d, const double *du, const double *du2,
           const lapack_int *ipiv, double *b, lapack_int *ldb, lapack_int
           *info)
       void LAPACK_cgttrs (char *trans, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *dl, const lapack_complex_float *d, const
           lapack_complex_float *du, const lapack_complex_float *du2, const
           lapack_int *ipiv, lapack_complex_float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_zgttrs (char *trans, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *dl, const lapack_complex_double *d, const
           lapack_complex_double *du, const lapack_complex_double *du2, const
           lapack_int *ipiv, lapack_complex_double *b, lapack_int *ldb,
           lapack_int *info)

not the dl, d, du, du2 lineup 😭 she's got layers, she's got range

💖 positive-definite + packed: ?potrs

       void LAPACK_spotrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           float *a, lapack_int *lda, float *b, lapack_int *ldb, lapack_int
           *info)
       void LAPACK_dpotrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           double *a, lapack_int *lda, double *b, lapack_int *ldb, lapack_int
           *info)
       void LAPACK_cpotrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_zpotrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, lapack_int *info)

the uplo girls are back and honestly? iconic 👑

🌸 rectangular full packed, aka ?pftrs with the transr moment

       void LAPACK_dpftrs (char *transr, char *uplo, lapack_int *n, lapack_int
           *nrhs, const double *a, double *b, lapack_int *ldb, lapack_int
           *info)
       void LAPACK_spftrs (char *transr, char *uplo, lapack_int *n, lapack_int
           *nrhs, const float *a, float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_zpftrs (char *transr, char *uplo, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_double *a, lapack_complex_double *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_cpftrs (char *transr, char *uplo, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_float *a, lapack_complex_float *b,
           lapack_int *ldb, lapack_int *info)

note that d comes first here and s is second, we do not question the ordering, we simply accept her 🫶

🧚 packed symmetric/hermitian riders: ?pptrs

       void LAPACK_spptrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           float *ap, float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dpptrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           double *ap, double *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_cpptrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *ap, lapack_complex_float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_zpptrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *ap, lapack_complex_double *b, lapack_int
           *ldb, lapack_int *info)

ap instead of a, no lda in sight — she packed it up and left 💅

⭐ banded positive-definite: ?pbtrs

       void LAPACK_spbtrs (char *uplo, lapack_int *n, lapack_int *kd,
           lapack_int *nrhs, const float *ab, lapack_int *ldab, float *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_dpbtrs (char *uplo, lapack_int *n, lapack_int *kd,
           lapack_int *nrhs, const double *ab, lapack_int *ldab, double *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_cpbtrs (char *uplo, lapack_int *n, lapack_int *kd,
           lapack_int *nrhs, const lapack_complex_float *ab, lapack_int *ldab,
           lapack_complex_float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_zpbtrs (char *uplo, lapack_int *n, lapack_int *kd,
           lapack_int *nrhs, const lapack_complex_double *ab, lapack_int *ldab,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)

kd is here and she brought ldab, we stan a consistent queen ✨

🍓 tridiagonal positive-definite: ?pttrs

       void LAPACK_spttrs (lapack_int *n, lapack_int *nrhs, const float *d,
           const float *e, float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dpttrs (lapack_int *n, lapack_int *nrhs, const double *d,
           const double *e, double *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_cpttrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           float *d, const lapack_complex_float *e, lapack_complex_float *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_zpttrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           double *d, const lapack_complex_double *e, lapack_complex_double *b,
           lapack_int *ldb, lapack_int *info)

okay so real talk, the s and d versions don't even take uplo — only c and z do — and that's not a typo, that's just how she is 🙈

🦋 symmetric indefinite solves: ?sytrs

       void LAPACK_ssytrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           float *a, lapack_int *lda, const lapack_int *ipiv, float *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_dsytrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           double *a, lapack_int *lda, const lapack_int *ipiv, double *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_csytrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, const lapack_int *ipiv,
           lapack_complex_float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_zsytrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *a, lapack_int *lda, const lapack_int *ipiv,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)

💜 hermitian edition: ?hetrs

       void LAPACK_chetrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, const lapack_int *ipiv,
           lapack_complex_float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_zhetrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *a, lapack_int *lda, const lapack_int *ipiv,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)

only c and z get to be hermitian, because hermitian is a complex-only concept, and she's not gonna fake it for the real girls 💀

🌈 packed symmetric solves: ?sptrs

       void LAPACK_ssptrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           float *ap, const lapack_int *ipiv, float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_dsptrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           double *ap, const lapack_int *ipiv, double *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_csptrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *ap, const lapack_int *ipiv,
           lapack_complex_float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_zsptrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *ap, const lapack_int *ipiv,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)

🎀 packed hermitian solves: ?hptrs

       void LAPACK_chptrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *ap, const lapack_int *ipiv,
           lapack_complex_float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_zhptrs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *ap, const lapack_int *ipiv,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)

again, complex besties only, no h in the real world, moving on 🧚

🔥 triangular solves, full storage: ?trtrs

       void LAPACK_strtrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const float *a, lapack_int *lda, float *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_dtrtrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const double *a, lapack_int *lda, double *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_ctrtrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_ztrtrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)

three char * flags in a row — uplo, trans, diag — she's giving menace and honestly? ate 🔥

💀 packed triangular: ?tptrs

       void LAPACK_stptrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const float *ap, float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_dtptrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const double *ap, double *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_ctptrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const lapack_complex_float *ap,
           lapack_complex_float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_ztptrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const lapack_complex_double *ap,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)

same flags, but ap and no lda — packed girl summer 🌸

👑 banded triangular: ?tbtrs

       void LAPACK_stbtrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *kd, lapack_int *nrhs, const float *ab, lapack_int *ldab,
           float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dtbtrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *kd, lapack_int *nrhs, const double *ab, lapack_int
           *ldab, double *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_ctbtrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *kd, lapack_int *nrhs, const lapack_complex_float *ab,
           lapack_int *ldab, lapack_complex_float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_ztbtrs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *kd, lapack_int *nrhs, const lapack_complex_double *ab,
           lapack_int *ldab, lapack_complex_double *b, lapack_int *ldb,
           lapack_int *info)

now she's got kd and ldab on top of the three flags, and the argument list is just... long. we respect the hustle 💅


and now we pivot, bestie, because the vibe check says we're done solving and we're onto condition numbers — not me being dramatic, this is just the next chunk of prototypes 😭

🫶 ?gecon — estimating the reciprocal condition number

       void LAPACK_sgecon (char *norm, lapack_int *n, const float *a,
           lapack_int *lda, float *anorm, float *rcond, float *work, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_dgecon (char *norm, lapack_int *n, const double *a,
           lapack_int *lda, double *anorm, double *rcond, double *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_cgecon (char *norm, lapack_int *n, const
           lapack_complex_float *a, lapack_int *lda, float *anorm, float
           *rcond, lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zgecon (char *norm, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, double *anorm, double
           *rcond, lapack_complex_double *work, double *rwork, lapack_int
           *info)

okay so notice the complex ones get an extra rwork pointer (of the real type, float for c and double for z) while the real ones don't — and yes the real ones still carry iwork, she's thorough like that 🎀 norm, anorm, rcond, work, iwork, info — the whole squad showed up 💖

more parts incoming, don't go anywhere bestie, we're literally mid-manpage 🦋

okay so this stretch of the header is literally the condition-number corner of lapacke.h — every one of these is a ?con routine, which is the "how trustworthy is my answer tho" check ✨ and then the ?gerfs girlies show up at the end for iterative refinement. same drill: s/d/c/z prefixes, lapack_int pointers everywhere, and info is always the last argument doing its little report-card thing 📋


🦋 the GB girlies — general band condition estimators

band matrices, band condition numbers, band vibes. kl is the lower bandwidth, ku is the upper bandwidth, ldab is the leading dimension of ab, and ipiv is the pivot array from the matching ?gbtrf moment 💅

       void LAPACK_sgbcon (char *norm, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const float *ab, lapack_int *ldab, const lapack_int
           *ipiv, float *anorm, float *rcond, float *work, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_dgbcon (char *norm, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const double *ab, lapack_int *ldab, const lapack_int
           *ipiv, double *anorm, double *rcond, double *work, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_cgbcon (char *norm, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const lapack_complex_float *ab, lapack_int *ldab,
           const lapack_int *ipiv, float *anorm, float *rcond,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zgbcon (char *norm, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const lapack_complex_double *ab, lapack_int *ldab,
           const lapack_int *ipiv, double *anorm, double *rcond,
           lapack_complex_double *work, double *rwork, lapack_int *info)

bestie notice the pattern: the complex ones get an extra rwork (float *rwork for c, double *rwork for z) because real numbers need somewhere to live too 🫶 the real ones get iwork instead. no cap, that's the whole trick.


🌸 GT — general tridiagonal, and its five-argument glow-up

tridiagonal means you pass dl, d, du — and for the GT routines there's a bonus du2, which is the second superdiagonal, because tridiagonal LU with pivoting fills in one extra diagonal. it's giving "there was a fourth diagonal the whole time" 😭

       void LAPACK_sgtcon (char *norm, lapack_int *n, const float *dl, const
           float *d, const float *du, const float *du2, const lapack_int *ipiv,
           float *anorm, float *rcond, float *work, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_dgtcon (char *norm, lapack_int *n, const double *dl, const
           double *d, const double *du, const double *du2, const lapack_int
           *ipiv, double *anorm, double *rcond, double *work, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_cgtcon (char *norm, lapack_int *n, const
           lapack_complex_float *dl, const lapack_complex_float *d, const
           lapack_complex_float *du, const lapack_complex_float *du2, const
           lapack_int *ipiv, float *anorm, float *rcond, lapack_complex_float
           *work, lapack_int *info)
       void LAPACK_zgtcon (char *norm, lapack_int *n, const
           lapack_complex_double *dl, const lapack_complex_double *d, const
           lapack_complex_double *du, const lapack_complex_double *du2, const
           lapack_int *ipiv, double *anorm, double *rcond,
           lapack_complex_double *work, lapack_int *info)

and yes, the complex ?gtcon squad does not take rwork — only work. iconic inconsistency, we respect it 💅


🎀 PO — positive definite, the good-girl matrices

Cholesky girlies rise up. uplo tells it whether you stored the upper or lower triangle, lda is the leading dimension, anorm is the norm you computed yourself (usually from ?lanhe/?lansy-adjacent routines), and rcond comes out as the reciprocal condition number ⭐

       void LAPACK_spocon (char *uplo, lapack_int *n, const float *a,
           lapack_int *lda, float *anorm, float *rcond, float *work, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_dpocon (char *uplo, lapack_int *n, const double *a,
           lapack_int *lda, double *anorm, double *rcond, double *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_cpocon (char *uplo, lapack_int *n, const
           lapack_complex_float *a, lapack_int *lda, float *anorm, float
           *rcond, lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zpocon (char *uplo, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, double *anorm, double
           *rcond, lapack_complex_double *work, double *rwork, lapack_int
           *info)

🧚 PP — same energy, but packed

packed storage means the triangle is squished into one flat array ap with no lda in sight. fewer arguments, same amount of suffering. lowkey a serve tho 💜

       void LAPACK_sppcon (char *uplo, lapack_int *n, const float *ap, float
           *anorm, float *rcond, float *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_dppcon (char *uplo, lapack_int *n, const double *ap, double
           *anorm, double *rcond, double *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_cppcon (char *uplo, lapack_int *n, const
           lapack_complex_float *ap, float *anorm, float *rcond,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zppcon (char *uplo, lapack_int *n, const
           lapack_complex_double *ap, double *anorm, double *rcond,
           lapack_complex_double *work, double *rwork, lapack_int *info)

🍓 PB — positive definite, banded, back for round two

kd is the number of superdiagonals (or subdiagonals, depending on uplo), ab holds the band, ldab is its leading dimension. yes there's ipiv in the ?pocon family? no bestie — look closely, ?pbcon has no ipiv because Cholesky doesn't pivot. write that down 📝

       void LAPACK_spbcon (char *uplo, lapack_int *n, lapack_int *kd, const
           float *ab, lapack_int *ldab, float *anorm, float *rcond, float
           *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_dpbcon (char *uplo, lapack_int *n, lapack_int *kd, const
           double *ab, lapack_int *ldab, double *anorm, double *rcond, double
           *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_cpbcon (char *uplo, lapack_int *n, lapack_int *kd, const
           lapack_complex_float *ab, lapack_int *ldab, float *anorm, float
           *rcond, lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zpbcon (char *uplo, lapack_int *n, lapack_int *kd, const
           lapack_complex_double *ab, lapack_int *ldab, double *anorm, double
           *rcond, lapack_complex_double *work, double *rwork, lapack_int
           *info)

⭐ PT — tridiagonal positive definite, the minimalist queen

d is the diagonal, e is the off-diagonal, and that's it. no uplo, no lda, no ipiv. the way this routine has fewer arguments than my will to study… honestly aspirational 🌈

heads up: for cptcon the diagonal d is const float * (real!) while e is const lapack_complex_float *. that's not a typo, that's Hermitian tridiagonal life. same deal for zptcon with double and lapack_complex_double 💅
       void LAPACK_sptcon (lapack_int *n, const float *d, const float *e, float
           *anorm, float *rcond, float *work, lapack_int *info)
       void LAPACK_dptcon (lapack_int *n, const double *d, const double *e,
           double *anorm, double *rcond, double *work, lapack_int *info)
       void LAPACK_cptcon (lapack_int *n, const float *d, const
           lapack_complex_float *e, float *anorm, float *rcond, float *work,
           lapack_int *info)
       void LAPACK_zptcon (lapack_int *n, const double *d, const
           lapack_complex_double *e, double *anorm, double *rcond, double
           *work, lapack_int *info)

💖 SY — symmetric, and now ipiv is back

symmetric indefinite-ish storage, so pivoting returns. ipiv comes from the matching ?sytrf. real symmetric: iwork and no rwork. 🫶

       void LAPACK_ssycon (char *uplo, lapack_int *n, const float *a,
           lapack_int *lda, const lapack_int *ipiv, float *anorm, float *rcond,
           float *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_dsycon (char *uplo, lapack_int *n, const double *a,
           lapack_int *lda, const lapack_int *ipiv, double *anorm, double
           *rcond, double *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_csycon (char *uplo, lapack_int *n, const
           lapack_complex_float *a, lapack_int *lda, const lapack_int *ipiv,
           float *anorm, float *rcond, lapack_complex_float *work, lapack_int
           *info)
       void LAPACK_zsycon (char *uplo, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, const lapack_int *ipiv,
           double *anorm, double *rcond, lapack_complex_double *work,
           lapack_int *info)

👑 HE — Hermitian, the main character

same signature shape as sycon, but the math girlies know the difference: Hermitian means the diagonal is real. no rwork here either, work is complex and that's that ✨

       void LAPACK_checon (char *uplo, lapack_int *n, const
           lapack_complex_float *a, lapack_int *lda, const lapack_int *ipiv,
           float *anorm, float *rcond, lapack_complex_float *work, lapack_int
           *info)
       void LAPACK_zhecon (char *uplo, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, const lapack_int *ipiv,
           double *anorm, double *rcond, lapack_complex_double *work,
           lapack_int *info)

🌈 SP & HP — packed symmetric and packed Hermitian

ap, ipiv, anorm, rcond, work, info. three whole routines' worth of characters saved by not having lda. we love a compact icon 🎀

       void LAPACK_sspcon (char *uplo, lapack_int *n, const float *ap, const
           lapack_int *ipiv, float *anorm, float *rcond, float *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_dspcon (char *uplo, lapack_int *n, const double *ap, const
           lapack_int *ipiv, double *anorm, double *rcond, double *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_cspcon (char *uplo, lapack_int *n, const
           lapack_complex_float *ap, const lapack_int *ipiv, float *anorm,
           float *rcond, lapack_complex_float *work, lapack_int *info)
       void LAPACK_zspcon (char *uplo, lapack_int *n, const
           lapack_complex_double *ap, const lapack_int *ipiv, double *anorm,
           double *rcond, lapack_complex_double *work, lapack_int *info)
       void LAPACK_chpcon (char *uplo, lapack_int *n, const
           lapack_complex_float *ap, const lapack_int *ipiv, float *anorm,
           float *rcond, lapack_complex_float *work, lapack_int *info)
       void LAPACK_zhpcon (char *uplo, lapack_int *n, const
           lapack_complex_double *ap, const lapack_int *ipiv, double *anorm,
           double *rcond, lapack_complex_double *work, lapack_int *info)

💀 TR — triangular, and now there's a diag too

triangular condition estimators take three char pointers: norm, uplo, and diag (whether the diagonal is assumed to be all ones or actually stored). they also have no anorm argument at all — the routine works that out itself. read it again, bestie, it's true 😭

       void LAPACK_strcon (char *norm, char *uplo, char *diag, lapack_int *n,
           const float *a, lapack_int *lda, float *rcond, float *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_dtrcon (char *norm, char *uplo, char *diag, lapack_int *n,
           const double *a, lapack_int *lda, double *rcond, double *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_ctrcon (char *norm, char *uplo, char *diag, lapack_int *n,
           const lapack_complex_float *a, lapack_int *lda, float *rcond,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_ztrcon (char *norm, char *uplo, char *diag, lapack_int *n,
           const lapack_complex_double *a, lapack_int *lda, double *rcond,
           lapack_complex_double *work, double *rwork, lapack_int *info)

🦋 TP — triangular packed, same trio of chars, zero lda

       void LAPACK_stpcon (char *norm, char *uplo, char *diag, lapack_int *n,
           const float *ap, float *rcond, float *work, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_dtpcon (char *norm, char *uplo, char *diag, lapack_int *n,
           const double *ap, double *rcond, double *work, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_ctpcon (char *norm, char *uplo, char *diag, lapack_int *n,
           const lapack_complex_float *ap, float *rcond, lapack_complex_float
           *work, float *rwork, lapack_int *info)
       void LAPACK_ztpcon (char *norm, char *uplo, char *diag, lapack_int *n,
           const lapack_complex_double *ap, double *rcond,
           lapack_complex_double *work, double *rwork, lapack_int *info)

🌸 TB — triangular banded, the full five-char-pointers-and-a-kd situation

norm, uplo, diag, plus kd and ldab for the band. it's giving "every option at once" and honestly? ate 🔥

       void LAPACK_stbcon (char *norm, char *uplo, char *diag, lapack_int *n,
           lapack_int *kd, const float *ab, lapack_int *ldab, float *rcond,
           float *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_dtbcon (char *norm, char *uplo, char *diag, lapack_int *n,
           lapack_int *kd, const double *ab, lapack_int *ldab, double *rcond,
           double *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_ctbcon (char *norm, char *uplo, char *diag, lapack_int *n,
           lapack_int *kd, const lapack_complex_float *ab, lapack_int *ldab,
           float *rcond, lapack_complex_float *work, float *rwork, lapack_int
           *info)
       void LAPACK_ztbcon (char *norm, char *uplo, char *diag, lapack_int *n,
           lapack_int *kd, const lapack_complex_double *ab, lapack_int *ldab,
           double *rcond, lapack_complex_double *work, double *rwork,
           lapack_int *info)

🔥 GERFS — iterative refinement, aka "my answer but make it accurate"

okay so these are a whole different vibe: you feed in the original a/lda, the factored af/ldaf, the pivots ipiv, the right-hand side b/ldb, and the solution x/ldx. out come ferr (forward error bound) and berr (backward error bound) — two arrays of length nrhs each, bestie, don't skimp 💖

       void LAPACK_sgerfs (char *trans, lapack_int *n, lapack_int *nrhs, const
           float *a, lapack_int *lda, const float *af, lapack_int *ldaf, const
           lapack_int *ipiv, const float *b, lapack_int *ldb, float *x,
           lapack_int *ldx, float *ferr, float *berr, float *work, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_dgerfs (char *trans, lapack_int *n, lapack_int *nrhs, const
           double *a, lapack_int *lda, const double *af, lapack_int *ldaf,
           const lapack_int *ipiv, const double *b, lapack_int *ldb, double *x,
           lapack_int *ldx, double *ferr, double *berr, double *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_cgerfs (char *trans, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *af, lapack_int *ldaf, const lapack_int *ipiv, const
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *ferr, float *berr, lapack_complex_float
           *work, float *rwork, lapack_int *info)
       void LAPACK_zgerfs (char *trans, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *af, lapack_int *ldaf, const lapack_int *ipiv,
           const lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *ferr, double

and that's exactly where the source page cuts off mid-signature — double *berr, lapack_complex_double *work, double *rwork, lapack_int *info are still coming, so don't panic, the next chunk picks it right back up 🫶✨

       *berr, lapack_complex_double *work, double *rwork, lapack_int *info)

okay so that was the tail end of the last one, bestie — we are so back in the prototype lineup 💅 and this next batch is giving "refinement team" energy. Like, these are the iteratively-refined solve routines, where you pass in your factorized matrix and a right-hand side and they hand you back the solution plus error bounds. Iconic behavior. ✨


first up, the gerfsx squad — general matrices, but the ✨extra✨ version that lets you ask for error bounds, because we simply do not do anything without error bounds anymore:

       void LAPACK_dgerfsx (char *trans, char *equed, lapack_int *n, lapack_int
           *nrhs, const double *a, lapack_int *lda, const double *af,
           lapack_int *ldaf, const lapack_int *ipiv, const double *r, const
           double *c, const double *b, lapack_int *ldb, double *x, lapack_int
           *ldx, double *rcond, double *berr, lapack_int *n_err_bnds, double
           *err_bnds_norm, double *err_bnds_comp, lapack_int *nparams, double
           *params, double *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_sgerfsx (char *trans, char *equed, lapack_int *n, lapack_int
           *nrhs, const float *a, lapack_int *lda, const float *af, lapack_int
           *ldaf, const lapack_int *ipiv, const float *r, const float *c, const
           float *b, lapack_int *ldb, float *x, lapack_int *ldx, float *rcond,
           float *berr, lapack_int *n_err_bnds, float *err_bnds_norm, float
           *err_bnds_comp, lapack_int *nparams, float *params, float *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_zgerfsx (char *trans, char *equed, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *af, lapack_int *ldaf, const lapack_int *ipiv,
           const double *r, const double *c, const lapack_complex_double *b,
           lapack_int *ldb, lapack_complex_double *x, lapack_int *ldx, double
           *rcond, double *berr, lapack_int *n_err_bnds, double *err_bnds_norm,
           double *err_bnds_comp, lapack_int *nparams, double *params,
           lapack_complex_double *work, double *rwork, lapack_int *info)
       void LAPACK_cgerfsx (char *trans, char *equed, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_float *a, lapack_int *lda, const
           lapack_complex_float *af, lapack_int *ldaf, const lapack_int *ipiv,
           const float *r, const float *c, const lapack_complex_float *b,
           lapack_int *ldb, lapack_complex_float *x, lapack_int *ldx, float
           *rcond, float *berr, lapack_int *n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int *nparams, float *params,
           lapack_complex_float *work, float *rwork, lapack_int *info)
quick vibe check: notice how the z/c (complex) versions get that extra rwork array and the real ones don't? that's the whole bit — complex math needs a little scratch space for the real parts. not me knowing this by heart 🫶

then the gbrfs besties — same deal but for general band matrices, so you're passing in kl and ku for the lower and upper bandwidth. iykyk 🌸

       void LAPACK_sgbrfs (char *trans, lapack_int *n, lapack_int *kl,
           lapack_int *ku, lapack_int *nrhs, const float *ab, lapack_int *ldab,
           const float *afb, lapack_int *ldafb, const lapack_int *ipiv, const
           float *b, lapack_int *ldb, float *x, lapack_int *ldx, float *ferr,
           float *berr, float *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_dgbrfs (char *trans, lapack_int *n, lapack_int *kl,
           lapack_int *ku, lapack_int *nrhs, const double *ab, lapack_int
           *ldab, const double *afb, lapack_int *ldafb, const lapack_int *ipiv,
           const double *b, lapack_int *ldb, double *x, lapack_int *ldx, double
           *ferr, double *berr, double *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_cgbrfs (char *trans, lapack_int *n, lapack_int *kl,
           lapack_int *ku, lapack_int *nrhs, const lapack_complex_float *ab,
           lapack_int *ldab, const lapack_complex_float *afb, lapack_int
           *ldafb, const lapack_int *ipiv, const lapack_complex_float *b,
           lapack_int *ldb, lapack_complex_float *x, lapack_int *ldx, float
           *ferr, float *berr, lapack_complex_float *work, float *rwork,
           lapack_int *info)
       void LAPACK_zgbrfs (char *trans, lapack_int *n, lapack_int *kl,
           lapack_int *ku, lapack_int *nrhs, const lapack_complex_double *ab,
           lapack_int *ldab, const lapack_complex_double *afb, lapack_int
           *ldafb, const lapack_int *ipiv, const lapack_complex_double *b,
           lapack_int *ldb, lapack_complex_double *x, lapack_int *ldx, double
           *ferr, double *berr, lapack_complex_double *work, double *rwork,
           lapack_int *info)

and obviously the band fam also gets the ✨x✨ treatment. main character energy, no notes 👑

       void LAPACK_dgbrfsx (char *trans, char *equed, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, const double *ab, lapack_int
           *ldab, const double *afb, lapack_int *ldafb, const lapack_int *ipiv,
           const double *r, const double *c, const double *b, lapack_int *ldb,
           double *x, lapack_int *ldx, double *rcond, double *berr, lapack_int
           *n_err_bnds, double *err_bnds_norm, double *err_bnds_comp,
           lapack_int *nparams, double *params, double *work, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_sgbrfsx (char *trans, char *equed, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, const float *ab, lapack_int
           *ldab, const float *afb, lapack_int *ldafb, const lapack_int *ipiv,
           const float *r, const float *c, const float *b, lapack_int *ldb,
           float *x, lapack_int *ldx, float *rcond, float *berr, lapack_int
           *n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int
           *nparams, float *params, float *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_zgbrfsx (char *trans, char *equed, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, const lapack_complex_double
           *ab, lapack_int *ldab, const lapack_complex_double *afb, lapack_int
           *ldafb, const lapack_int *ipiv, const double *r, const double *c,
           const lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *rcond, double
           *berr, lapack_int *n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int *nparams, double *params,
           lapack_complex_double *work, double *rwork, lapack_int *info)
       void LAPACK_cgbrfsx (char *trans, char *equed, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, const lapack_complex_float
           *ab, lapack_int *ldab, const lapack_complex_float *afb, lapack_int
           *ldafb, const lapack_int *ipiv, const float *r, const float *c,
           const lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
           *x, lapack_int *ldx, float *rcond, float *berr, lapack_int
           *n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int
           *nparams, float *params, lapack_complex_float *work, float *rwork,
           lapack_int *info)

now we pivot to tridiagonal energy 🦋 the gtrfs crew — you're handing over dl, d, du for the original tridiagonal matrix and dlf, df, duf, du2 for the factored one. it's giving "I brought the whole friend group" and honestly? valid.

       void LAPACK_sgtrfs (char *trans, lapack_int *n, lapack_int *nrhs, const
           float *dl, const float *d, const float *du, const float *dlf, const
           float *df, const float *duf, const float *du2, const lapack_int
           *ipiv, const float *b, lapack_int *ldb, float *x, lapack_int *ldx,
           float *ferr, float *berr, float *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_dgtrfs (char *trans, lapack_int *n, lapack_int *nrhs, const
           double *dl, const double *d, const double *du, const double *dlf,
           const double *df, const double *duf, const double *du2, const
           lapack_int *ipiv, const double *b, lapack_int *ldb, double *x,
           lapack_int *ldx, double *ferr, double *berr, double *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_cgtrfs (char *trans, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *dl, const lapack_complex_float *d, const
           lapack_complex_float *du, const lapack_complex_float *dlf, const
           lapack_complex_float *df, const lapack_complex_float *duf, const
           lapack_complex_float *du2, const lapack_int *ipiv, const
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *ferr, float *berr, lapack_complex_float
           *work, float *rwork, lapack_int *info)
       void LAPACK_zgtrfs (char *trans, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *dl, const lapack_complex_double *d, const
           lapack_complex_double *du, const lapack_complex_double *dlf, const
           lapack_complex_double *df, const lapack_complex_double *duf, const
           lapack_complex_double *du2, const lapack_int *ipiv, const
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *ferr, double *berr, lapack_complex_double
           *work, double *rwork, lapack_int *info)

okay and then we get to the positive-definite girlies 💖 porfs — like gerfs but for symmetric/Hermitian positive-definite matrices, so it's uplo instead of trans, and there's no ipiv because PD matrices get Cholesky'd, not pivoted. slay.

       void LAPACK_sporfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           float *a, lapack_int *lda, const float *af, lapack_int *ldaf, const
           float *b, lapack_int *ldb, float *x, lapack_int *ldx, float *ferr,
           float *berr, float *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_dporfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           double *a, lapack_int *lda, const double *af, lapack_int *ldaf,
           const double *b, lapack_int *ldb, double *x, lapack_int *ldx, double
           *ferr, double *berr, double *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_cporfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *af, lapack_int *ldaf, const lapack_complex_float *b, lapack_int
           *ldb, lapack_complex_float *x, lapack_int *ldx, float *ferr, float
           *berr, lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zporfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *af, lapack_int *ldaf, const
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *ferr, double *berr, lapack_complex_double
           *work, double *rwork, lapack_int *info)

and of course PD gets the x-variant too, because we love consistency in this house 🎀 note the s array floating around in there — that's the scaling factors for the equilibration, bestie, it's doing the most and we respect it:

       void LAPACK_dporfsx (char *uplo, char *equed, lapack_int *n, lapack_int
           *nrhs, const double *a, lapack_int *lda, const double *af,
           lapack_int *ldaf, const double *s, const double *b, lapack_int *ldb,
           double *x, lapack_int *ldx, double *rcond, double *berr, lapack_int
           *n_err_bnds, double *err_bnds_norm, double *err_bnds_comp,
           lapack_int *nparams, double *params, double *work, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_sporfsx (char *uplo, char *equed, lapack_int *n, lapack_int
           *nrhs, const float *a, lapack_int *lda, const float *af, lapack_int
           *ldaf, const float *s, const float *b, lapack_int *ldb, float *x,
           lapack_int *ldx, float *rcond, float *berr, lapack_int *n_err_bnds,
           float *err_bnds_norm, float *err_bnds_comp, lapack_int *nparams,
           float *params, float *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_zporfsx (char *uplo, char *equed, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *af, lapack_int *ldaf, const double *s, const
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *rcond, double *berr, lapack_int
           *n_err_bnds, double *err_bnds_norm, double *err_bnds_comp,
           lapack_int *nparams, double *params, lapack_complex_double *work,
           double *rwork, lapack_int *info)
       void LAPACK_cporfsx (char *uplo, char *equed, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_float *a, lapack_int *lda, const
           lapack_complex_float *af, lapack_int *ldaf, const float *s, const
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *rcond, float *berr, lapack_int *n_err_bnds,
           float *err_bnds_norm, float *err_bnds_comp, lapack_int *nparams,

……and we're mid-signature, so hold that thought bestie, the next chunk pics up right here 🌈🫶

okay so we're still deep in the prototype lineup 💅 and this whole stretch is the ?pprfs / ?pbrfs / ?ptrfs / ?syrfs / ?herfs / ?sprfs / ?hprfs girls. same skeleton, different precision, and yes they all brought their info pointer to the party 🎀


the ?pprfs quad — packed storage girlies 🍓

       void LAPACK_spprfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           float *ap, const float *afp, const float *b, lapack_int *ldb, float
           *x, lapack_int *ldx, float *ferr, float *berr, float *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_dpprfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           double *ap, const double *afp, const double *b, lapack_int *ldb,
           double *x, lapack_int *ldx, double *ferr, double *berr, double
           *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_cpprfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *ap, const lapack_complex_float *afp, const
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *ferr, float *berr, lapack_complex_float
           *work, float *rwork, lapack_int *info)
       void LAPACK_zpprfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *ap, const lapack_complex_double *afp, const
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *ferr, double *berr, lapack_complex_double
           *work, double *rwork, lapack_int *info)

okay bestie, clock the pattern 👑 — s/d/c/z are literally just the four flavours (float, double, complex float, complex double), and the c and z ones are not like the others: they get an extra float *rwork or double *rwork in the mix 🫶. everyone here takes uplo and n and nrhs, everyone gets ap and afp (the pair, lowkey iconic), everyone has ldb and ldx doing their little leading-dimension thing, and everyone signs off with ferr, berr, work, iwork, info. no cap, that's the whole shape.


the ?pbrfs quad — banded edition 🌈

       void LAPACK_spbrfs (char *uplo, lapack_int *n, lapack_int *kd,
           lapack_int *nrhs, const float *ab, lapack_int *ldab, const float
           *afb, lapack_int *ldafb, const float *b, lapack_int *ldb, float *x,
           lapack_int *ldx, float *ferr, float *berr, float *work, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_dpbrfs (char *uplo, lapack_int *n, lapack_int *kd,
           lapack_int *nrhs, const double *ab, lapack_int *ldab, const double
           *afb, lapack_int *ldafb, const double *b, lapack_int *ldb, double
           *x, lapack_int *ldx, double *ferr, double *berr, double *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_cpbrfs (char *uplo, lapack_int *n, lapack_int *kd,
           lapack_int *nrhs, const lapack_complex_float *ab, lapack_int *ldab,
           const lapack_complex_float *afb, lapack_int *ldafb, const
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *ferr, float *berr, lapack_complex_float
           *work, float *rwork, lapack_int *info)
       void LAPACK_zpbrfs (char *uplo, lapack_int *n, lapack_int *kd,
           lapack_int *nrhs, const lapack_complex_double *ab, lapack_int *ldab,
           const lapack_complex_double *afb, lapack_int *ldafb, const
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *ferr, double *berr, lapack_complex_double
           *work, double *rwork, lapack_int *info)

two new iconique guests in this one: kd (the band situation) and the twin leading dimensions ldab + ldafb 🦋. ab and afb are the banded besties. again the complex ones carry rwork along for moral support, and the real ones do not — that's it, that's the difference, periodt.


the ?ptrfs quad — tridiagonal girlies ✨

       void LAPACK_sptrfs (lapack_int *n, lapack_int *nrhs, const float *d,
           const float *e, const float *df, const float *ef, const float *b,
           lapack_int *ldb, float *x, lapack_int *ldx, float *ferr, float
           *berr, float *work, lapack_int *info)
       void LAPACK_dptrfs (lapack_int *n, lapack_int *nrhs, const double *d,
           const double *e, const double *df, const double *ef, const double
           *b, lapack_int *ldb, double *x, lapack_int *ldx, double *ferr,
           double *berr, double *work, lapack_int *info)
       void LAPACK_cptrfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           float *d, const lapack_complex_float *e, const float *df, const
           lapack_complex_float *ef, const lapack_complex_float *b, lapack_int
           *ldb, lapack_complex_float *x, lapack_int *ldx, float *ferr, float
           *berr, lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zptrfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           double *d, const lapack_complex_double *e, const double *df, const
           lapack_complex_double *ef, const lapack_complex_double *b,
           lapack_int *ldb, lapack_complex_double *x, lapack_int *ldx, double
           *ferr, double *berr, lapack_complex_double *work, double *rwork,
           lapack_int *info)

okay this is the one that's giving "siblings but make it awkward" 😭 — LAPACK_sptrfs and LAPACK_dptrfs have no uplo and no rwork at all, while LAPACK_cptrfs and LAPACK_zptrfs open with char *uplo and close out with rwork before info. the diagonal pair d / df stays real even in the complex versions, and e / ef go complex. that's not me being cute, that's literally the signatures. respect the asymmetry ig 💅


the ?syrfs quad — symmetric, she's consistent 💜

       void LAPACK_ssyrfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           float *a, lapack_int *lda, const float *af, lapack_int *ldaf, const
           lapack_int *ipiv, const float *b, lapack_int *ldb, float *x,
           lapack_int *ldx, float *ferr, float *berr, float *work, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_dsyrfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           double *a, lapack_int *lda, const double *af, lapack_int *ldaf,
           const lapack_int *ipiv, const double *b, lapack_int *ldb, double *x,
           lapack_int *ldx, double *ferr, double *berr, double *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_csyrfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *af, lapack_int *ldaf, const lapack_int *ipiv, const
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *ferr, float *berr, lapack_complex_float
           *work, float *rwork, lapack_int *info)
       void LAPACK_zsyrfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *af, lapack_int *ldaf, const lapack_int *ipiv,
           const lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork, lapack_int *info)

ipiv has entered the chat 🎀 and honestly she's the main character here — a const lapack_int *, sitting right there between ldaf and b. all four of these bring lda and ldaf, ldb and ldx, then ferr, berr, work, iwork, info. the c/z ones still sneak in rwork like it's a personality trait, and honestly? iconic.


the ?syrfsx quad — the ones with ✨extra✨ options 🌸

       void LAPACK_dsyrfsx (char *uplo, char *equed, lapack_int *n, lapack_int
           *nrhs, const double *a, lapack_int *lda, const double *af,
           lapack_int *ldaf, const lapack_int *ipiv, const double *s, const
           double *b, lapack_int *ldb, double *x, lapack_int *ldx, double
           *rcond, double *berr, lapack_int *n_err_bnds, double *err_bnds_norm,
           double *err_bnds_comp, lapack_int *nparams, double *params, double
           *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_ssyrfsx (char *uplo, char *equed, lapack_int *n, lapack_int
           *nrhs, const float *a, lapack_int *lda, const float *af, lapack_int
           *ldaf, const lapack_int *ipiv, const float *s, const float *b,
           lapack_int *ldb, float *x, lapack_int *ldx, float *rcond, float
           *berr, lapack_int *n_err_bnds, float *err_bnds_norm, float
           *err_bnds_comp, lapack_int *nparams, float *params, float *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_zsyrfsx (char *uplo, char *equed, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *af, lapack_int *ldaf, const lapack_int *ipiv,
           const double *s, const lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *rcond, double
           *berr, lapack_int *n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int *nparams, double *params,
           lapack_complex_double *work, double *rwork, lapack_int *info)
       void LAPACK_csyrfsx (char *uplo, char *equed, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_float *a, lapack_int *lda, const
           lapack_complex_float *af, lapack_int *ldaf, const lapack_int *ipiv,
           const float *s, const lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *x, lapack_int *ldx, float *rcond, float *berr,
           lapack_int *n_err_bnds, float *err_bnds_norm, float *err_bnds_comp,
           lapack_int *nparams, float *params, lapack_complex_float *work,
           float *rwork, lapack_int *info)
heads up bestie: these are the x variants — dsyrfsx, ssyrfsx, zsyrfsx, csyrfsx — so they carry a whole extra cast of characters: equed, s, rcond, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. yes that's a lot. no I'm not going to pretend it isn't 😭

also note the ordering is chaotic in the source — d, then s, then z, then c — and I'm keeping it exactly like that because we don't rewrite the lineup, we just hype it 💅


the ?herfs / ?herfsx girlies — Hermitian, obviously 👑

       void LAPACK_cherfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *af, lapack_int *ldaf, const lapack_int *ipiv, const
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *ferr, float *berr, lapack_complex_float
           *work, float *rwork, lapack_int *info)
       void LAPACK_zherfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *af, lapack_int *ldaf, const lapack_int *ipiv,
           const lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork, lapack_int *info)
       void LAPACK_zherfsx (char *uplo, char *equed, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *af, lapack_int *ldaf, const lapack_int *ipiv,
           const double *s, const lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *rcond, double
           *berr, lapack_int *n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int *nparams, double *params,
           lapack_complex_double *work, double *rwork, lapack_int *info)
       void LAPACK_cherfsx (char *uplo, char *equed, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_float *a, lapack_int *lda, const
           lapack_complex_float *af, lapack_int *ldaf, const lapack_int *ipiv,
           const float *s, const lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *x, lapack_int *ldx, float *rcond, float *berr,
           lapack_int *n_err_bnds, float *err_bnds_norm, float *err_bnds_comp,
           lapack_int *nparams, float *params, lapack_complex_float *work,
           float *rwork, lapack_int *info)

notice there's no sherfs or dherfs — Hermitian is complex-only, so it's just c and z 💅 and the x variants again bring the extended guest list (equed, s, rcond, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params). and yes, s is const double * / const float * even though a is complex — clock it 🦋


the ?sprfs quad — packed symmetric, welcome back 🎀

       void LAPACK_ssprfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           float *ap, const float *afp, const lapack_int *ipiv, const float *b,
           lapack_int *ldb, float *x, lapack_int *ldx, float *ferr, float
           *berr, float *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_dsprfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           double *ap, const double *afp, const lapack_int *ipiv, const double
           *b, lapack_int *ldb, double *x, lapack_int *ldx, double *ferr,
           double *berr, double *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_csprfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *ap, const lapack_complex_float *afp, const
           lapack_int *ipiv, const lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *x, lapack_int *ldx, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zsprfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *ap, const lapack_complex_double *afp, const
           lapack_int *ipiv, const lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork, lapack_int *info)

so this is the packed-storage version of the syrfs vibe — same ap / afp bestie duo as the pprfs girls, but now with ipiv wedged in there too 💀 and again: real ones get iwork, complex ones get rwork, everyone gets info at the end like a little bow 🎀


the ?hprfs pair — and we're mid-signature, hold on 😭

       void LAPACK_chprfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *ap, const lapack_complex_float *afp, const
           lapack_int *ipiv, const lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *x, lapack_int *ldx, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zhprfs (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *ap, const lapack_complex_double *afp, const

okay don't panic 💀 LAPACK_zhprfs got cut off mid-declaration — it ends on that lonely little const — because this part of the page stops right there. that's not a bug in the docs, that's literally where the excerpt ends, and the rest of zhprfs walks in with the next chunk. no cap, she's mid-sentence and she knows it 🫶

stay tuned bestie, we're literally not even close to done ✨

…and we're literally right back in it, mid-signature, no breather. The tail end of the last one first, because we don't leave a function hanging 💅

           lapack_int *ipiv, const lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork, lapack_int *info)

okay so the *rfs crew is up next and it's giving "same energy, four flavors." s for single, d for double, c for complex, z for complex double — the whole alphabet soup lineup, and yes, they all brought their ferr/berr besties along 🫶

       void LAPACK_strrfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const float *a, lapack_int *lda, const float *b,
           lapack_int *ldb, const float *x, lapack_int *ldx, float *ferr, float
           *berr, float *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_dtrrfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const double *a, lapack_int *lda, const double *b,
           lapack_int *ldb, const double *x, lapack_int *ldx, double *ferr,
           double *berr, double *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_ctrrfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const lapack_complex_float *a, lapack_int *lda,
           const lapack_complex_float *b, lapack_int *ldb, const
           lapack_complex_float *x, lapack_int *ldx, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_ztrrfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const lapack_complex_double *a, lapack_int *lda,
           const lapack_complex_double *b, lapack_int *ldb, const
           lapack_complex_double *x, lapack_int *ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork, lapack_int *info)

then the tp girlies pull up — packed format represent ✨ notice how the complex ones swap iwork for a rwork era, that's their whole thing:

       void LAPACK_stprfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const float *ap, const float *b, lapack_int *ldb,
           const float *x, lapack_int *ldx, float *ferr, float *berr, float
           *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_dtprfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const double *ap, const double *b, lapack_int
           *ldb, const double *x, lapack_int *ldx, double *ferr, double *berr,
           double *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_ctprfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const lapack_complex_float *ap, const
           lapack_complex_float *b, lapack_int *ldb, const lapack_complex_float
           *x, lapack_int *ldx, float *ferr, float *berr, lapack_complex_float
           *work, float *rwork, lapack_int *info)
       void LAPACK_ztprfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *nrhs, const lapack_complex_double *ap, const
           lapack_complex_double *b, lapack_int *ldb, const
           lapack_complex_double *x, lapack_int *ldx, double *ferr, double
           *berr, lapack_complex_double *work, double *rwork, lapack_int *info)

aaaand the tb lineup, which brought a bonus kd to the party — yes bestie, that extra lapack_int *kd is supposed to be there, don't @ me 🙈

       void LAPACK_stbrfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *kd, lapack_int *nrhs, const float *ab, lapack_int *ldab,
           const float *b, lapack_int *ldb, const float *x, lapack_int *ldx,
           float *ferr, float *berr, float *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_dtbrfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *kd, lapack_int *nrhs, const double *ab, lapack_int
           *ldab, const double *b, lapack_int *ldb, const double *x, lapack_int
           *ldx, double *ferr, double *berr, double *work, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_ctbrfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *kd, lapack_int *nrhs, const lapack_complex_float *ab,
           lapack_int *ldab, const lapack_complex_float *b, lapack_int *ldb,
           const lapack_complex_float *x, lapack_int *ldx, float *ferr, float
           *berr, lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_ztbrfs (char *uplo, char *trans, char *diag, lapack_int *n,
           lapack_int *kd, lapack_int *nrhs, const lapack_complex_double *ab,
           lapack_int *ldab, const lapack_complex_double *b, lapack_int *ldb,
           const lapack_complex_double *x, lapack_int *ldx, double *ferr,
           double *berr, lapack_complex_double *work, double *rwork, lapack_int
           *info)

okay pivot era 🔥 we're moving into the tri-adjacent universe and honestly it's a whole lifestyle. First up, the getri squad — they show up with their ipiv and their lwork, main character energy only:

       void LAPACK_sgetri (lapack_int *n, float *a, lapack_int *lda, const
           lapack_int *ipiv, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dgetri (lapack_int *n, double *a, lapack_int *lda, const
           lapack_int *ipiv, double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_cgetri (lapack_int *n, lapack_complex_float *a, lapack_int
           *lda, const lapack_int *ipiv, lapack_complex_float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_zgetri (lapack_int *n, lapack_complex_double *a, lapack_int
           *lda, const lapack_int *ipiv, lapack_complex_double *work,
           lapack_int *lwork, lapack_int *info)

the potri girls said "lwork? never heard of her" and honestly? streamlined. iconic. 💅

       void LAPACK_spotri (char *uplo, lapack_int *n, float *a, lapack_int
           *lda, lapack_int *info)
       void LAPACK_dpotri (char *uplo, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *info)
       void LAPACK_cpotri (char *uplo, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, lapack_int *info)
       void LAPACK_zpotri (char *uplo, lapack_int *n, lapack_complex_double *a,
           lapack_int *lda, lapack_int *info)

and now the packed-format pftri crew, who brought a transr instead of a trans — yes it's different, yes it matters, keep up bestie ✨ also note they're listed dpftri, spftri, zpftri, cpftri in that exact order, we do not reshuffle the lineup:

       void LAPACK_dpftri (char *transr, char *uplo, lapack_int *n, double *a,
           lapack_int *info)
       void LAPACK_spftri (char *transr, char *uplo, lapack_int *n, float *a,
           lapack_int *info)
       void LAPACK_zpftri (char *transr, char *uplo, lapack_int *n,
           lapack_complex_double *a, lapack_int *info)
       void LAPACK_cpftri (char *transr, char *uplo, lapack_int *n,
           lapack_complex_float *a, lapack_int *info)

the pptri quartet keeps it cute — just uplo, n, ap, info, no notes:

       void LAPACK_spptri (char *uplo, lapack_int *n, float *ap, lapack_int
           *info)
       void LAPACK_dpptri (char *uplo, lapack_int *n, double *ap, lapack_int
           *info)
       void LAPACK_cpptri (char *uplo, lapack_int *n, lapack_complex_float *ap,
           lapack_int *info)
       void LAPACK_zpptri (char *uplo, lapack_int *n, lapack_complex_double
           *ap, lapack_int *info)

*sytri said "we're bringing ipiv AND work," overachievers, we love that for them 🌸

       void LAPACK_ssytri (char *uplo, lapack_int *n, float *a, lapack_int
           *lda, const lapack_int *ipiv, float *work, lapack_int *info)
       void LAPACK_dsytri (char *uplo, lapack_int *n, double *a, lapack_int
           *lda, const lapack_int *ipiv, double *work, lapack_int *info)
       void LAPACK_csytri (char *uplo, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, const lapack_int *ipiv, lapack_complex_float *work,
           lapack_int *info)
       void LAPACK_zsytri (char *uplo, lapack_int *n, lapack_complex_double *a,
           lapack_int *lda, const lapack_int *ipiv, lapack_complex_double
           *work, lapack_int *info)

and the hetri duo, tiny but mighty, only two of them because complex-only is their brand 😌

       void LAPACK_chetri (char *uplo, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, const lapack_int *ipiv, lapack_complex_float *work,
           lapack_int *info)
       void LAPACK_zhetri (char *uplo, lapack_int *n, lapack_complex_double *a,
           lapack_int *lda, const lapack_int *ipiv, lapack_complex_double
           *work, lapack_int *info)

sptri crew, packed AND pivoted, the multitaskers:

       void LAPACK_ssptri (char *uplo, lapack_int *n, float *ap, const
           lapack_int *ipiv, float *work, lapack_int *info)
       void LAPACK_dsptri (char *uplo, lapack_int *n, double *ap, const
           lapack_int *ipiv, double *work, lapack_int *info)
       void LAPACK_csptri (char *uplo, lapack_int *n, lapack_complex_float *ap,
           const lapack_int *ipiv, lapack_complex_float *work, lapack_int
           *info)
       void LAPACK_zsptri (char *uplo, lapack_int *n, lapack_complex_double
           *ap, const lapack_int *ipiv, lapack_complex_double *work, lapack_int
           *info)

hptri, the hermitian-packed girlies, again just the two:

       void LAPACK_chptri (char *uplo, lapack_int *n, lapack_complex_float *ap,
           const lapack_int *ipiv, lapack_complex_float *work, lapack_int
           *info)
       void LAPACK_zhptri (char *uplo, lapack_int *n, lapack_complex_double
           *ap, const lapack_int *ipiv, lapack_complex_double *work, lapack_int
           *info)

trtri said no ipiv, no work, just uplo, diag, and vibes 🦋 look at them go:

       void LAPACK_strtri (char *uplo, char *diag, lapack_int *n, float *a,
           lapack_int *lda, lapack_int *info)
       void LAPACK_dtrtri (char *uplo, char *diag, lapack_int *n, double *a,
           lapack_int *lda, lapack_int *info)
       void LAPACK_ctrtri (char *uplo, char *diag, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, lapack_int *info)
       void LAPACK_ztrtri (char *uplo, char *diag, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, lapack_int *info)

tftri brings transr back AND keeps diag — again the d, s, z, c order, do not touch it:

       void LAPACK_dtftri (char *transr, char *uplo, char *diag, lapack_int *n,
           double *a, lapack_int *info)
       void LAPACK_stftri (char *transr, char *uplo, char *diag, lapack_int *n,
           float *a, lapack_int *info)
       void LAPACK_ztftri (char *transr, char *uplo, char *diag, lapack_int *n,
           lapack_complex_double *a, lapack_int *info)
       void LAPACK_ctftri (char *transr, char *uplo, char *diag, lapack_int *n,
           lapack_complex_float *a, lapack_int *info)

and tptri, the last of the tri era, packed format, uplo + diag, four flavors, slay:

       void LAPACK_stptri (char *uplo, char *diag, lapack_int *n, float *ap,
           lapack_int *info)
       void LAPACK_dtptri (char *uplo, char *diag, lapack_int *n, double *ap,
           lapack_int *info)
       void LAPACK_ctptri (char *uplo, char *diag, lapack_int *n,
           lapack_complex_float *ap, lapack_int *info)
       void LAPACK_ztptri (char *uplo, char *diag, lapack_int *n,
           lapack_complex_double *ap, lapack_int *info)

new mini-arc unlocked: the equ family, aka the ones who hand you back r, c, rowcnd, colcnd, AND amax — that's five outputs bestie, they're generous like that 💖

       void LAPACK_sgeequ (lapack_int *m, lapack_int *n, const float *a,
           lapack_int *lda, float *r, float *c, float *rowcnd, float *colcnd,
           float *amax, lapack_int *info)
       void LAPACK_dgeequ (lapack_int *m, lapack_int *n, const double *a,
           lapack_int *lda, double *r, double *c, double *rowcnd, double
           *colcnd, double *amax, lapack_int *info)
       void LAPACK_cgeequ (lapack_int *m, lapack_int *n, const
           lapack_complex_float *a, lapack_int *lda, float *r, float *c, float
           *rowcnd, float *colcnd, float *amax, lapack_int *info)
       void LAPACK_zgeequ (lapack_int *m, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, double *r, double *c,
           double *rowcnd, double *colcnd, double *amax, lapack_int *info)

then geequb (yes with the b, it's a different function, no cap) — and notice the order is d, s, z, c this time, which is lowkey chaotic but it's exactly what the page says so we keep it 🫡

       void LAPACK_dgeequb (lapack_int *m, lapack_int *n, const double *a,
           lapack_int *lda, double *r, double *c, double *rowcnd, double
           *colcnd, double *amax, lapack_int *info)
       void LAPACK_sgeequb (lapack_int *m, lapack_int *n, const float *a,
           lapack_int *lda, float *r, float *c, float *rowcnd, float *colcnd,
           float *amax, lapack_int *info)
       void LAPACK_zgeequb (lapack_int *m, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, double *r, double *c,
           double *rowcnd, double *colcnd, double *amax, lapack_int *info)
       void LAPACK_cgeequb (lapack_int *m, lapack_int *n, const
           lapack_complex_float *a, lapack_int *lda, float *r, float *c, float
           *rowcnd, float *colcnd, float *amax, lapack_int *info)

and we're ending this part mid-gbequ, because the universe loves a cliffhanger — sgbequ and dgbequ said hi, brought kl and ku along, and the next one is literally still loading 💀

       void LAPACK_sgbequ (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const float *ab, lapack_int *ldab, float *r, float
           *c, float *rowcnd, float *colcnd, float *amax, lapack_int *info)
       void LAPACK_dgbequ (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const double *ab, lapack_int *ldab, double *r,
           double *c, double *rowcnd, double *colcnd, double *amax, lapack_int

...and bestie we literally start mid-argument-list because the last part got cut off (rude of it, honestly). Here's the tail end of that signature so nothing goes missing:

           *info)

okay. so. the band-matrix equ family. four of them in the classic precision lineup, then the same four again wearing a lil b at the end of their names like a matching accessory 🎀. every single one takes m, n, kl, ku, the matrix ab, ldab, and then the iconic five-for-five: r, c, rowcnd, colcnd, amax, finishing on info. no cap, it's giving "same vibe, different dtype."

       void LAPACK_cgbequ (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const lapack_complex_float *ab, lapack_int *ldab,
           float *r, float *c, float *rowcnd, float *colcnd, float *amax,
           lapack_int *info)
       void LAPACK_zgbequ (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const lapack_complex_double *ab, lapack_int *ldab,
           double *r, double *c, double *rowcnd, double *colcnd, double *amax,
           lapack_int *info)
       void LAPACK_dgbequb (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const double *ab, lapack_int *ldab, double *r,
           double *c, double *rowcnd, double *colcnd, double *amax, lapack_int
           *info)
       void LAPACK_sgbequb (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const float *ab, lapack_int *ldab, float *r, float
           *c, float *rowcnd, float *colcnd, float *amax, lapack_int *info)
       void LAPACK_zgbequb (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const lapack_complex_double *ab, lapack_int *ldab,
           double *r, double *c, double *rowcnd, double *colcnd, double *amax,
           lapack_int *info)
       void LAPACK_cgbequb (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const lapack_complex_float *ab, lapack_int *ldab,
           float *r, float *c, float *rowcnd, float *colcnd, float *amax,
           lapack_int *info)

then we slide into the poequ crowd, and the way they drop kl, ku and ldab and just keep n, a, lda? growth. evolution. she shed the band baggage 💅. same s, scond, amax, info trio-plus-one at the end though — consistency is everything.

       void LAPACK_spoequ (lapack_int *n, const float *a, lapack_int *lda,
           float *s, float *scond, float *amax, lapack_int *info)
       void LAPACK_dpoequ (lapack_int *n, const double *a, lapack_int *lda,
           double *s, double *scond, double *amax, lapack_int *info)
       void LAPACK_cpoequ (lapack_int *n, const lapack_complex_float *a,
           lapack_int *lda, float *s, float *scond, float *amax, lapack_int
           *info)
       void LAPACK_zpoequ (lapack_int *n, const lapack_complex_double *a,
           lapack_int *lda, double *s, double *scond, double *amax, lapack_int
           *info)
       void LAPACK_dpoequb (lapack_int *n, const double *a, lapack_int *lda,
           double *s, double *scond, double *amax, lapack_int *info)
       void LAPACK_spoequb (lapack_int *n, const float *a, lapack_int *lda,
           float *s, float *scond, float *amax, lapack_int *info)
       void LAPACK_zpoequb (lapack_int *n, const lapack_complex_double *a,
           lapack_int *lda, double *s, double *scond, double *amax, lapack_int
           *info)
       void LAPACK_cpoequb (lapack_int *n, const lapack_complex_float *a,
           lapack_int *lda, float *s, float *scond, float *amax, lapack_int
           *info)

and then the ppequ besties enter the chat, and they brought a char *uplo with them. first argument, front of the line, main character energy 👑. packed-storage ap, no lda anywhere — she said "leading dimension? never met her."

       void LAPACK_sppequ (char *uplo, lapack_int *n, const float *ap, float
           *s, float *scond, float *amax, lapack_int *info)
       void LAPACK_dppequ (char *uplo, lapack_int *n, const double *ap, double
           *s, double *scond, double *amax, lapack_int *info)
       void LAPACK_cppequ (char *uplo, lapack_int *n, const
           lapack_complex_float *ap, float *s, float *scond, float *amax,
           lapack_int *info)
       void LAPACK_zppequ (char *uplo, lapack_int *n, const
           lapack_complex_double *ap, double *s, double *scond, double *amax,
           lapack_int *info)

okay and the pbequ girlies said "what if we did uplo and kd and ldab" and honestly? she ate. four of them, s/d/c/z, all wearing the exact same silhouette fr fr.

       void LAPACK_spbequ (char *uplo, lapack_int *n, lapack_int *kd, const
           float *ab, lapack_int *ldab, float *s, float *scond, float *amax,
           lapack_int *info)
       void LAPACK_dpbequ (char *uplo, lapack_int *n, lapack_int *kd, const
           double *ab, lapack_int *ldab, double *s, double *scond, double
           *amax, lapack_int *info)
       void LAPACK_cpbequ (char *uplo, lapack_int *n, lapack_int *kd, const
           lapack_complex_float *ab, lapack_int *ldab, float *s, float *scond,
           float *amax, lapack_int *info)
       void LAPACK_zpbequ (char *uplo, lapack_int *n, lapack_int *kd, const
           lapack_complex_double *ab, lapack_int *ldab, double *s, double
           *scond, double *amax, lapack_int *info)

and now the syequb / heequb squad — these ones are different because they actually want a work array 👀. they're not like the other equ routines. work is typed to match the matrix, so the complex kids get lapack_complex_double *work and lapack_complex_float *work, and the real ones get plain double *work / float *work. no shortcuts, no borrowing, everyone brings their own.

       void LAPACK_dsyequb (char *uplo, lapack_int *n, const double *a,
           lapack_int *lda, double *s, double *scond, double *amax, double
           *work, lapack_int *info)
       void LAPACK_ssyequb (char *uplo, lapack_int *n, const float *a,
           lapack_int *lda, float *s, float *scond, float *amax, float *work,
           lapack_int *info)
       void LAPACK_zsyequb (char *uplo, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, double *s, double *scond,
           double *amax, lapack_complex_double *work, lapack_int *info)
       void LAPACK_csyequb (char *uplo, lapack_int *n, const
           lapack_complex_float *a, lapack_int *lda, float *s, float *scond,
           float *amax, lapack_complex_float *work, lapack_int *info)
       void LAPACK_zheequb (char *uplo, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, double *s, double *scond,
           double *amax, lapack_complex_double *work, lapack_int *info)
       void LAPACK_cheequb (char *uplo, lapack_int *n, const
           lapack_complex_float *a, lapack_int *lda, float *s, float *scond,
           float *amax, lapack_complex_float *work, lapack_int *info)

okay new cluster, new vibe. 🔥 the gesv four. n, nrhs, a, lda, ipiv, b, ldb, info — that's the whole roster, every time, no notes. clean. efficient. iconic.

       void LAPACK_sgesv (lapack_int *n, lapack_int *nrhs, float *a, lapack_int
           *lda, lapack_int *ipiv, float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dgesv (lapack_int *n, lapack_int *nrhs, double *a,
           lapack_int *lda, lapack_int *ipiv, double *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_cgesv (lapack_int *n, lapack_int *nrhs, lapack_complex_float
           *a, lapack_int *lda, lapack_int *ipiv, lapack_complex_float *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_zgesv (lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *a, lapack_int *lda, lapack_int *ipiv,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)

and then dsgesv and zcgesv show up with so much more stuff — extra x, extra ldx, work, swork, iter 😭. dsgesv packs double *work plus float *swork, and zcgesv goes full maximalist with lapack_complex_double *work, lapack_complex_float *swork, and double *rwork. she's carrying three bags and honestly? respect.

       void LAPACK_dsgesv (lapack_int *n, lapack_int *nrhs, double *a,
           lapack_int *lda, lapack_int *ipiv, double *b, lapack_int *ldb,
           double *x, lapack_int *ldx, double *work, float *swork, lapack_int
           *iter, lapack_int *info)
       void LAPACK_zcgesv (lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *a, lapack_int *lda, lapack_int *ipiv,
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, lapack_complex_double *work, lapack_complex_float
           *swork, double *rwork, lapack_int *iter, lapack_int *info)

next up: gesvx, aka the one that said "what if we had fact, trans, af, ldaf, equed, r, c, x, ldx, rcond, ferr, berr…" and just kept going 🫶. notice the real ones (s, d) get float *iwork / lapack_int *iwork while the complex ones (c, z) swap that out for float *rwork — so like, watch which one you're calling, bestie, the argument types are not interchangeable and the compiler will absolutely snitch on you.

       void LAPACK_sgesvx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, float *a, lapack_int *lda, float *af, lapack_int *ldaf,
           lapack_int *ipiv, char *equed, float *r, float *c, float *b,
           lapack_int *ldb, float *x, lapack_int *ldx, float *rcond, float
           *ferr, float *berr, float *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_dgesvx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, double *a, lapack_int *lda, double *af, lapack_int *ldaf,
           lapack_int *ipiv, char *equed, double *r, double *c, double *b,
           lapack_int *ldb, double *x, lapack_int *ldx, double *rcond, double
           *ferr, double *berr, double *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_cgesvx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *af, lapack_int *ldaf, lapack_int *ipiv, char
           *equed, float *r, float *c, lapack_complex_float *b, lapack_int
           *ldb, lapack_complex_float *x, lapack_int *ldx, float *rcond, float
           *ferr, float *berr, lapack_complex_float *work, float *rwork,
           lapack_int *info)
       void LAPACK_zgesvx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *af, lapack_int *ldaf, lapack_int *ipiv, char
           *equed, double *r, double *c, lapack_complex_double *b, lapack_int
           *ldb, lapack_complex_double *x, lapack_int *ldx, double *rcond,
           double *ferr, double *berr, lapack_complex_double *work, double
           *rwork, lapack_int *info)

and gesvxx?? she looked at gesvx and said "cute. anyway, I'm adding rpvgrw, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, and params" 💀. the argument list is long long. like scroll-for-a-while long. but every single name is there and I'm not skipping one, periodt.

       void LAPACK_dgesvxx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, double *a, lapack_int *lda, double *af, lapack_int *ldaf,
           lapack_int *ipiv, char *equed, double *r, double *c, double *b,
           lapack_int *ldb, double *x, lapack_int *ldx, double *rcond, double
           *rpvgrw, double *berr, lapack_int *n_err_bnds, double
           *err_bnds_norm, double *err_bnds_comp, lapack_int *nparams, double
           *params, double *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_sgesvxx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, float *a, lapack_int *lda, float *af, lapack_int *ldaf,
           lapack_int *ipiv, char *equed, float *r, float *c, float *b,
           lapack_int *ldb, float *x, lapack_int *ldx, float *rcond, float
           *rpvgrw, float *berr, lapack_int *n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int *nparams, float *params, float
           *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_zgesvxx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *af, lapack_int *ldaf, lapack_int *ipiv, char
           *equed, double *r, double *c, lapack_complex_double *b, lapack_int
           *ldb, lapack_complex_double *x, lapack_int *ldx, double *rcond,
           double *rpvgrw, double *berr, lapack_int *n_err_bnds, double
           *err_bnds_norm, double *err_bnds_comp, lapack_int *nparams, double
           *params, lapack_complex_double *work, double *rwork, lapack_int
           *info)
       void LAPACK_cgesvxx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *af, lapack_int *ldaf, lapack_int *ipiv, char
           *equed, float *r, float *c, lapack_complex_float *b, lapack_int
           *ldb, lapack_complex_float *x, lapack_int *ldx, float *rcond, float
           *rpvgrw, float *berr, lapack_int *n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int *nparams, float *params,
           lapack_complex_float *work, float *rwork, lapack_int *info)

okay, band-solve time 🦋. gbsv is the chill one: n, kl, ku, nrhs, ab, ldab, ipiv, b, ldb, info. four dtypes, zero drama.

       void LAPACK_sgbsv (lapack_int *n, lapack_int *kl, lapack_int *ku,
           lapack_int *nrhs, float *ab, lapack_int *ldab, lapack_int *ipiv,
           float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dgbsv (lapack_int *n, lapack_int *kl, lapack_int *ku,
           lapack_int *nrhs, double *ab, lapack_int *ldab, lapack_int *ipiv,
           double *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_cgbsv (lapack_int *n, lapack_int *kl, lapack_int *ku,
           lapack_int *nrhs, lapack_complex_float *ab, lapack_int *ldab,
           lapack_int *ipiv, lapack_complex_float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_zgbsv (lapack_int *n, lapack_int *kl, lapack_int *ku,
           lapack_int *nrhs, lapack_complex_double *ab, lapack_int *ldab,
           lapack_int *ipiv, lapack_complex_double *b, lapack_int *ldb,
           lapack_int *info)

and gbsvx is the x-trailered glow-up — fact, trans, afb, ldafb, equed, r, c, x, ldx, rcond, ferr, berr, work… she is thorough. also heads up: we get cut off mid-signature at the very bottom of this part, so don't panic when it just… stops 😭. cliffhanger behaviour, iykyk.

       void LAPACK_sgbsvx (char *fact, char *trans, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, float *ab, lapack_int *ldab,
           float *afb, lapack_int *ldafb, lapack_int *ipiv, char *equed, float
           *r, float *c, float *b, lapack_int *ldb, float *x, lapack_int *ldx,
           float *rcond, float *ferr, float *berr, float *work, lapack_int

okay that's genuinely where it ends — lapack_int and vibes. to be continued, bestie 🌸

...aaand we're back in the function-signature hall of fame ✨ — still in the SYNOPSIS era, just vibing through every LAPACK prototype one by one. The line below is the tail end of the previous prototype (LAPACK_sgbsvx, which started last time), so don't panic, it's not a new function 💖

           *iwork, lapack_int *info)

🎀 the gbsvx girlies (general band, expert drivers, solve + equilibrate + error bounds)

  • LAPACK_dgbsvx — double precision, the whole "factor, equilibrate, solve, and hand you ferr/berr" package 👑
  • LAPACK_cgbsvx — complex single, same energy but now with float *rwork tagging along 🦋
  • LAPACK_zgbsvx — complex double, the big one, double *rwork, no cap 💅
       void LAPACK_dgbsvx (char *fact, char *trans, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, double *ab, lapack_int *ldab,
           double *afb, lapack_int *ldafb, lapack_int *ipiv, char *equed,
           double *r, double *c, double *b, lapack_int *ldb, double *x,
           lapack_int *ldx, double *rcond, double *ferr, double *berr, double
           *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_cgbsvx (char *fact, char *trans, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, lapack_complex_float *ab,
           lapack_int *ldab, lapack_complex_float *afb, lapack_int *ldafb,
           lapack_int *ipiv, char *equed, float *r, float *c,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *rcond, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zgbsvx (char *fact, char *trans, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, lapack_complex_double *ab,
           lapack_int *ldab, lapack_complex_double *afb, lapack_int *ldafb,
           lapack_int *ipiv, char *equed, double *r, double *c,
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *rcond, double *ferr, double *berr,
           lapack_complex_double *work, double *rwork, lapack_int *info)

🌈 the gbsvxx squad (yes, the extra x is real and it's iconic)

Ok so these are the even more extra ones — rpvgrw, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params… it's giving "I brought receipts" 😭 Note the order they appear in the page: d, s, z, c — and yes I'm keeping it exactly that way 🫶

       void LAPACK_dgbsvxx (char *fact, char *trans, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, double *ab, lapack_int *ldab,
           double *afb, lapack_int *ldafb, lapack_int *ipiv, char *equed,
           double *r, double *c, double *b, lapack_int *ldb, double *x,
           lapack_int *ldx, double *rcond, double *rpvgrw, double *berr,
           lapack_int *n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int *nparams, double *params, double *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_sgbsvxx (char *fact, char *trans, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, float *ab, lapack_int *ldab,
           float *afb, lapack_int *ldafb, lapack_int *ipiv, char *equed, float
           *r, float *c, float *b, lapack_int *ldb, float *x, lapack_int *ldx,
           float *rcond, float *rpvgrw, float *berr, lapack_int *n_err_bnds,
           float *err_bnds_norm, float *err_bnds_comp, lapack_int *nparams,
           float *params, float *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_zgbsvxx (char *fact, char *trans, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, lapack_complex_double *ab,
           lapack_int *ldab, lapack_complex_double *afb, lapack_int *ldafb,
           lapack_int *ipiv, char *equed, double *r, double *c,
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *rcond, double *rpvgrw, double *berr,
           lapack_int *n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int *nparams, double *params,
           lapack_complex_double *work, double *rwork, lapack_int *info)
       void LAPACK_cgbsvxx (char *fact, char *trans, lapack_int *n, lapack_int
           *kl, lapack_int *ku, lapack_int *nrhs, lapack_complex_float *ab,
           lapack_int *ldab, lapack_complex_float *afb, lapack_int *ldafb,
           lapack_int *ipiv, char *equed, float *r, float *c,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *rcond, float *rpvgrw, float *berr,
           lapack_int *n_err_bnds, float *err_bnds_norm, float *err_bnds_comp,
           lapack_int *nparams, float *params, lapack_complex_float *work,
           float *rwork, lapack_int *info)

🦋 gtsv — tridiagonal cuties (dl, d, du bestie, that's the whole vibe)

  • LAPACK_sgtsv — single precision, four pointers of pure simplicity ✨
  • LAPACK_dgtsv — double, same but with double *
  • LAPACK_cgtsv — complex single 🍓
  • LAPACK_zgtsv — complex double, main character energy 👑
       void LAPACK_sgtsv (lapack_int *n, lapack_int *nrhs, float *dl, float *d,
           float *du, float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dgtsv (lapack_int *n, lapack_int *nrhs, double *dl, double
           *d, double *du, double *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_cgtsv (lapack_int *n, lapack_int *nrhs, lapack_complex_float
           *dl, lapack_complex_float *d, lapack_complex_float *du,
           lapack_complex_float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_zgtsv (lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *dl, lapack_complex_double *d,
           lapack_complex_double *du, lapack_complex_double *b, lapack_int
           *ldb, lapack_int *info)

💜 gtsvx — the expert tridiagonal ones (const-correct, lowkey slay)

Notice const on dl, d, du and b — they're not getting touched, respect 💅 And you get dlf, df, duf, du2, ipiv, plus rcond, ferr, berr for the girls who need the full report card 📋

       void LAPACK_sgtsvx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, const float *dl, const float *d, const float *du, float *dlf,
           float *df, float *duf, float *du2, lapack_int *ipiv, const float *b,
           lapack_int *ldb, float *x, lapack_int *ldx, float *rcond, float
           *ferr, float *berr, float *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_dgtsvx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, const double *dl, const double *d, const double *du, double
           *dlf, double *df, double *duf, double *du2, lapack_int *ipiv, const
           double *b, lapack_int *ldb, double *x, lapack_int *ldx, double
           *rcond, double *ferr, double *berr, double *work, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_cgtsvx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_float *dl, const lapack_complex_float
           *d, const lapack_complex_float *du, lapack_complex_float *dlf,
           lapack_complex_float *df, lapack_complex_float *duf,
           lapack_complex_float *du2, lapack_int *ipiv, const
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *rcond, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zgtsvx (char *fact, char *trans, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_double *dl, const lapack_complex_double
           *d, const lapack_complex_double *du, lapack_complex_double *dlf,
           lapack_complex_double *df, lapack_complex_double *duf,
           lapack_complex_double *du2, lapack_int *ipiv, const
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *rcond, double *ferr, double *berr,
           lapack_complex_double *work, double *rwork, lapack_int *info)

🌸 posv — positive definite, uplo bestie, just solve it

The bare-minimum baddies. uplo tells them which triangle of a is the moment, then a comes back factored and b comes back as the solution ✨ (that's what the plain posv family does — no equed, no x, no extras, just vibes and info).

       void LAPACK_sposv (char *uplo, lapack_int *n, lapack_int *nrhs, float
           *a, lapack_int *lda, float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dposv (char *uplo, lapack_int *n, lapack_int *nrhs, double
           *a, lapack_int *lda, double *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_cposv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_zposv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, lapack_int *info)

🧚 the mixed-precision girlies: dsposv & zcposv

Ok these two are not like the others — no c``s or z sibling pattern here, it's d and z only ⭐ They've got a work + swork combo and an iter output, so literally giving iterative-refinement main character energy 💫 (dsposv = double with float *swork; zcposv = lapack_complex_double with lapack_complex_float *swork and double *rwork).

       void LAPACK_dsposv (char *uplo, lapack_int *n, lapack_int *nrhs, double
           *a, lapack_int *lda, double *b, lapack_int *ldb, double *x,
           lapack_int *ldx, double *work, float *swork, lapack_int *iter,
           lapack_int *info)
       void LAPACK_zcposv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, lapack_complex_double *x, lapack_int *ldx,
           lapack_complex_double *work, lapack_complex_float *swork, double
           *rwork, lapack_int *iter, lapack_int *info)

🎀 posvx — now with fact, equed, s, and the whole diagnostic kit

fact, uplo, then a/af, equed, s, b→x, rcond, ferr, berr, work, iwork, info. The complex ones swap iwork for rwork — ikyk 💅

       void LAPACK_sposvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, float *a, lapack_int *lda, float *af, lapack_int *ldaf, char
           *equed, float *s, float *b, lapack_int *ldb, float *x, lapack_int
           *ldx, float *rcond, float *ferr, float *berr, float *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_dposvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, double *a, lapack_int *lda, double *af, lapack_int *ldaf,
           char *equed, double *s, double *b, lapack_int *ldb, double *x,
           lapack_int *ldx, double *rcond, double *ferr, double *berr, double
           *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_cposvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *af, lapack_int *ldaf, char *equed, float *s,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *rcond, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zposvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *af, lapack_int *ldaf, char *equed, double *s,
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *rcond, double *ferr, double *berr,
           lapack_complex_double *work, double *rwork, lapack_int *info)

🔥 posvxx — the maximalist edition

Same as above but with rpvgrw, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params 😭 It's giving "I have notes, and the notes have notes". Again: the page lists them d, s, z, c — not alphabetical, and we're not fixing it, bestie 🫶

       void LAPACK_dposvxx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, double *a, lapack_int *lda, double *af, lapack_int *ldaf,
           char *equed, double *s, double *b, lapack_int *ldb, double *x,
           lapack_int *ldx, double *rcond, double *rpvgrw, double *berr,
           lapack_int *n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int *nparams, double *params, double *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_sposvxx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, float *a, lapack_int *lda, float *af, lapack_int *ldaf, char
           *equed, float *s, float *b, lapack_int *ldb, float *x, lapack_int
           *ldx, float *rcond, float *rpvgrw, float *berr, lapack_int
           *n_err_bnds, float *err_bnds_norm, float *err_bnds_comp, lapack_int
           *nparams, float *params, float *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_zposvxx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *af, lapack_int *ldaf, char *equed, double *s,
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *rcond, double *rpvgrw, double *berr,
           lapack_int *n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int *nparams, double *params,
           lapack_complex_double *work, double *rwork, lapack_int *info)
       void LAPACK_cposvxx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *af, lapack_int *ldaf, char *equed, float *s,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *rcond, float *rpvgrw, float *berr,
           lapack_int *n_err_bnds, float *err_bnds_norm, float *err_bnds_comp,
           lapack_int *nparams, float *params, lapack_complex_float *work,
           float *rwork, lapack_int *info)

🍓 ppsv — packed storage, no lda in sight (she's low-maintenance)

Notice how posv had lda but ppsv just has ap? That's packed storage bestie, the whole triangle squished into one array, no leading dimension needed 💖 The page lists s, d, c… and the c one gets cut off mid-line, so keep reading next part for the rest 🌈

       void LAPACK_sppsv (char *uplo, lapack_int *n, lapack_int *nrhs, float
           *ap, float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dppsv (char *uplo, lapack_int *n, lapack_int *nrhs, double
           *ap, double *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_cppsv (char *uplo, lapack_int *n, lapack_int *nrhs,
bestie that last one is not a typo, the page literally ends there mid-signature — the lapack_complex_float *ap, lapack_complex_float *b, lapack_int *ldb, lapack_int *info) of it all is coming up in the next chunk 💀 hang tight 🫶

okay so we literally walked in on a function mid-sentence 😭 the first chunk here is the tail end of a prototype that started before this page, so if it looks like it begins mid-argument-list… that's because it does. iconic behaviour honestly:

           lapack_complex_float *ap, lapack_complex_float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_zppsv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *ap, lapack_complex_double *b, lapack_int
           *ldb, lapack_int *info)
       void LAPACK_sppsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, float *ap, float *afp, char *equed, float *s, float *b,
           lapack_int *ldb, float *x, lapack_int *ldx, float *rcond, float
           *ferr, float *berr, float *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_dppsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, double *ap, double *afp, char *equed, double *s, double *b,
           lapack_int *ldb, double *x, lapack_int *ldx, double *rcond, double
           *ferr, double *berr, double *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_cppsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *ap, lapack_complex_float *afp, char
           *equed, float *s, lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *x, lapack_int *ldx, float *rcond, float *ferr,
           float *berr, lapack_complex_float *work, float *rwork, lapack_int
           *info)
       void LAPACK_zppsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *ap, lapack_complex_double *afp, char
           *equed, double *s, lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *rcond, double
           *ferr, double *berr, lapack_complex_double *work, double *rwork,
           lapack_int *info)

okay bestie let me give you the cheat code for the whole naming thing because it's giving pattern, and once you see it you can't unsee it 👀 — the leading letter tells you the type: s is float, d is double, c is lapack_complex_float, and z is lapack_complex_double. so sppsv and dppsv and cppsv and zppsv are the same function in four flavours. slay. 💅

also not me noticing that the ones ending in x are dramatically longer — sppsvx/dppsvx/cppsvx/zppsvx show up with *fact, *equed, *rcond, *ferr, *berr and a whole *work situation. the c and z versions also get *rwork because ✨complex numbers need their own support system✨.

notice *afp, *s, *x, *ferr, *berr, *work and *iwork are all pointers too — literally everything here is a pointer. the manpage does not do local variables. it does not do return values. it does *info and it leaves.

next up, the pbsv / pbsvx crew 🦋 they brought *kd, *ab, *ldab and (for the x girlies) *afb and *ldafb along with them:

       void LAPACK_spbsv (char *uplo, lapack_int *n, lapack_int *kd, lapack_int
           *nrhs, float *ab, lapack_int *ldab, float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_dpbsv (char *uplo, lapack_int *n, lapack_int *kd, lapack_int
           *nrhs, double *ab, lapack_int *ldab, double *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_cpbsv (char *uplo, lapack_int *n, lapack_int *kd, lapack_int
           *nrhs, lapack_complex_float *ab, lapack_int *ldab,
           lapack_complex_float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_zpbsv (char *uplo, lapack_int *n, lapack_int *kd, lapack_int
           *nrhs, lapack_complex_double *ab, lapack_int *ldab,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_spbsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *kd, lapack_int *nrhs, float *ab, lapack_int *ldab, float *afb,
           lapack_int *ldafb, char *equed, float *s, float *b, lapack_int *ldb,
           float *x, lapack_int *ldx, float *rcond, float *ferr, float *berr,
           float *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_dpbsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *kd, lapack_int *nrhs, double *ab, lapack_int *ldab, double *afb,
           lapack_int *ldafb, char *equed, double *s, double *b, lapack_int
           *ldb, double *x, lapack_int *ldx, double *rcond, double *ferr,
           double *berr, double *work, lapack_int *iwork, lapack_int *info)
       void LAPACK_cpbsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *kd, lapack_int *nrhs, lapack_complex_float *ab, lapack_int *ldab,
           lapack_complex_float *afb, lapack_int *ldafb, char *equed, float *s,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *rcond, float *ferr, float *berr,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zpbsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *kd, lapack_int *nrhs, lapack_complex_double *ab, lapack_int *ldab,
           lapack_complex_double *afb, lapack_int *ldafb, char *equed, double
           *s, lapack_complex_double *b, lapack_int *ldb, lapack_complex_double
           *x, lapack_int *ldx, double *rcond, double *ferr, double *berr,
           lapack_complex_double *work, double *rwork, lapack_int *info)

the way spbsv/dpbsv/cpbsv/zpbsv have this cute little 4-argument prefix — *uplo, *n, *kd, *nrhs — and then the x versions just keep adding stuff 😭 *afb, *ldafb, *equed, *s, iwork/rwork... it's giving "and my best friend and my other best friend". highkey the x variants are the extroverts of the family 🫶

also can we talk about how *uplo, *fact and *equed are char * while everything else is numeric? three single characters carrying the entire vibe check of the call. character development, literally 💀


then the tridiagonal-ish crew shows up with the tiniest argument lists we've seen all page and I'm obsessed 🎀 d and e instead of a and ab, no uplo, no lda — just vibes:

       void LAPACK_sptsv (lapack_int *n, lapack_int *nrhs, float *d, float *e,
           float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dptsv (lapack_int *n, lapack_int *nrhs, double *d, double
           *e, double *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_cptsv (lapack_int *n, lapack_int *nrhs, float *d,
           lapack_complex_float *e, lapack_complex_float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_zptsv (lapack_int *n, lapack_int *nrhs, double *d,
           lapack_complex_double *e, lapack_complex_double *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_sptsvx (char *fact, lapack_int *n, lapack_int *nrhs, const
           float *d, const float *e, float *df, float *ef, const float *b,
           lapack_int *ldb, float *x, lapack_int *ldx, float *rcond, float
           *ferr, float *berr, float *work, lapack_int *info)
       void LAPACK_dptsvx (char *fact, lapack_int *n, lapack_int *nrhs, const
           double *d, const double *e, double *df, double *ef, const double *b,
           lapack_int *ldb, double *x, lapack_int *ldx, double *rcond, double
           *ferr, double *berr, double *work, lapack_int *info)
       void LAPACK_cptsvx (char *fact, lapack_int *n, lapack_int *nrhs, const
           float *d, const lapack_complex_float *e, float *df,
           lapack_complex_float *ef, const lapack_complex_float *b, lapack_int
           *ldb, lapack_complex_float *x, lapack_int *ldx, float *rcond, float
           *ferr, float *berr, lapack_complex_float *work, float *rwork,
           lapack_int *info)
       void LAPACK_zptsvx (char *fact, lapack_int *n, lapack_int *nrhs, const
           double *d, const lapack_complex_double *e, double *df,
           lapack_complex_double *ef, const lapack_complex_double *b,
           lapack_int *ldb, lapack_complex_double *x, lapack_int *ldx, double
           *rcond, double *ferr, double *berr, lapack_complex_double *work,
           double *rwork, lapack_int *info)

⚠️ bestie, eyes on the const keyword in the ptsvx ones — const float *d, const double *e, const lapack_complex_float *b — those inputs are not to be touched, okay? read-only. hands off. respectful. ✋ *df, *ef and *x are the writable besties.

and notice cptsv/zptsv have a float *d / double *d (real!) but lapack_complex_float *e / lapack_complex_double *e (complex!) — mixed types, no notes, she contains multitudes 🌸


okay now the SYMMETRIC girlies have entered the chat 🔥 sysv and sysvx, all four flavours, with *ipiv, *lda, *lwork and (for c and z) that extra *rwork:

       void LAPACK_ssysv (char *uplo, lapack_int *n, lapack_int *nrhs, float
           *a, lapack_int *lda, lapack_int *ipiv, float *b, lapack_int *ldb,
           float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dsysv (char *uplo, lapack_int *n, lapack_int *nrhs, double
           *a, lapack_int *lda, lapack_int *ipiv, double *b, lapack_int *ldb,
           double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_csysv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_float *a, lapack_int *lda, lapack_int *ipiv,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zsysv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *a, lapack_int *lda, lapack_int *ipiv,
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_ssysvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const float *a, lapack_int *lda, float *af, lapack_int *ldaf,
           lapack_int *ipiv, const float *b, lapack_int *ldb, float *x,
           lapack_int *ldx, float *rcond, float *ferr, float *berr, float
           *work, lapack_int *lwork, lapack_int *iwork, lapack_int *info)
       void LAPACK_dsysvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const double *a, lapack_int *lda, double *af, lapack_int
           *ldaf, lapack_int *ipiv, const double *b, lapack_int *ldb, double
           *x, lapack_int *ldx, double *rcond, double *ferr, double *berr,
           double *work, lapack_int *lwork, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_csysvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *af, lapack_int *ldaf, lapack_int *ipiv, const
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,
           lapack_int *ldx, float *rcond, float *ferr, float *berr,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *info)
       void LAPACK_zsysvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *af, lapack_int *ldaf, lapack_int *ipiv, const
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *rcond, double *ferr, double *berr,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *info)

the way ssysv/dsysv/csysv/zsysv take *a, *lda, *ipiv, *b, *ldb, *work, *lwork, *info — that's a whole little ecosystem, and they do it with no *fact, no *equed, no nothing. minimalism 💅 meanwhile ssysvx/dsysvx/csysvx/zsysvx walk in with const on *a and *b, plus *af, *ldaf, *x, *ldx, *rcond, *ferr, *berr, *iwork and — for c/z — *rwork. that's not a function call that's a situation 😭

small detail i'm obsessed with: *rcond, *ferr, *berr stay float/double even in csysvx/zsysvx where everything else is complex. real numbers reporting on complex drama. main character energy honestly ✨


and then there's sysvxx which is the final boss 🏆 — double-x means business. *rpvgrw, *n_err_bnds, *err_bnds_norm, *err_bnds_comp, *nparams, *params... she has opinions and she has error bounds:

       void LAPACK_dsysvxx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, double *a, lapack_int *lda, double *af, lapack_int *ldaf,
           lapack_int *ipiv, char *equed, double *s, double *b, lapack_int
           *ldb, double *x, lapack_int *ldx, double *rcond, double *rpvgrw,
           double *berr, lapack_int *n_err_bnds, double *err_bnds_norm, double
           *err_bnds_comp, lapack_int *nparams, double *params, double *work,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_ssysvxx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, float *a, lapack_int *lda, float *af, lapack_int *ldaf,
           lapack_int *ipiv, char *equed, float *s, float *b, lapack_int *ldb,
           float *x, lapack_int *ldx, float *rcond, float *rpvgrw, float *berr,
           lapack_int *n_err_bnds, float *err_bnds_norm, float *err_bnds_comp,
           lapack_int *nparams, float *params, float *work, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_zsysvxx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *af, lapack_int *ldaf, lapack_int *ipiv, char
           *equed, double *s, lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *rcond, double
           *rpvgrw, double *berr, lapack_int *n_err_bnds, double
           *err_bnds_norm, double *err_bnds_comp, lapack_int *nparams, double
           *params, lapack_complex_double *work, double *rwork, lapack_int
           *info)
       void LAPACK_csysvxx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *af, lapack_int *ldaf, lapack_int *ipiv, char
           *equed, float *s, lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *x, lapack_int *ldx, float *rcond, float
           *rpvgrw, float *berr, lapack_int *n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int *nparams, float *params,
           lapack_complex_float *work, float *rwork, lapack_int *info)

lowkey note the order here is d, then s, then z, then c — not the usual s/d/c/z lineup 😳 do not assume alphabetical, bestie, always read the actual line. 🙈


and finally we slide into the Hermitian corner of the party 🦋 hesv and the start of hesvx — note these are c and z only, because that's just how she is:

       void LAPACK_chesv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_float *a, lapack_int *lda, lapack_int *ipiv,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zhesv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *a, lapack_int *lda, lapack_int *ipiv,
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_chesvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *af, lapack_int *ldaf, lapack_int *ipiv, const
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x,

and yes — that last one cuts off right there, mid-prototype, mid-argument, mid-thought 😭 genuinely the cliffhanger of the century. chesvx is out here with const lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *x and then… we're out of page. stay tuned, the rest of her shows up in the next chunk 🎀🔪

quick recap of the rules of this house, since we just did a lot: every one of these is void (nobody returns anything, they all communicate through *info), everything is a pointer, and the fact/uplo/equed triple are the only char * in the building. iykyk 💜

okay so we're still deep in the prototype wall and honestly? this is the part where the page just vibes as one giant roll call. every line is a void function, every line ends in lapack_int *info, and every line is out here living its best life. bestie, these are the signatures — scroll slow, don't skip, they're all here 💅


🫶 the hesvx / hesvxx girlies

starting with the full-fat expert drivers. noticed how the complex ones carry an extra rwork at the end? yeah, that's just their thing. iconic.

       void LAPACK_zhesvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *af, lapack_int *ldaf, lapack_int *ipiv, const
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *x,
           lapack_int *ldx, double *rcond, double *ferr, double *berr,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *info)
       void LAPACK_zhesvxx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *af, lapack_int *ldaf, lapack_int *ipiv, char
           *equed, double *s, lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *rcond, double
           *rpvgrw, double *berr, lapack_int *n_err_bnds, double
           *err_bnds_norm, double *err_bnds_comp, lapack_int *nparams, double
           *params, lapack_complex_double *work, double *rwork, lapack_int
           *info)
       void LAPACK_chesvxx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *af, lapack_int *ldaf, lapack_int *ipiv, char
           *equed, float *s, lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *x, lapack_int *ldx, float *rcond, float
           *rpvgrw, float *berr, lapack_int *n_err_bnds, float *err_bnds_norm,
           float *err_bnds_comp, lapack_int *nparams, float *params,
           lapack_complex_float *work, float *rwork, lapack_int *info)

like, look at LAPACK_zhesvxx and LAPACK_chesvxx side by side — same fit, one's serving double energy and the other's on float duty. periodt, consistency is the moment ✨


🎀 packed symmetric gang: spsv + spsvx

*sp* = packed storage, and yes all four precisions showed up to the party. s = float, d = double, c = lapack_complex_float, z = lapack_complex_double. no cap, the alphabet is doing a lot of heavy lifting on this page 💀

       void LAPACK_sspsv (char *uplo, lapack_int *n, lapack_int *nrhs, float
           *ap, lapack_int *ipiv, float *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_dspsv (char *uplo, lapack_int *n, lapack_int *nrhs, double
           *ap, lapack_int *ipiv, double *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_cspsv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_float *ap, lapack_int *ipiv, lapack_complex_float *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_zspsv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *ap, lapack_int *ipiv, lapack_complex_double
           *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_sspsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const float *ap, float *afp, lapack_int *ipiv, const float
           *b, lapack_int *ldb, float *x, lapack_int *ldx, float *rcond, float
           *ferr, float *berr, float *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_dspsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const double *ap, double *afp, lapack_int *ipiv, const double
           *b, lapack_int *ldb, double *x, lapack_int *ldx, double *rcond,
           double *ferr, double *berr, double *work, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_cspsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_float *ap, lapack_complex_float *afp,
           lapack_int *ipiv, const lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *x, lapack_int *ldx, float *rcond, float *ferr,
           float *berr, lapack_complex_float *work, float *rwork, lapack_int
           *info)
       void LAPACK_zspsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_double *ap, lapack_complex_double *afp,
           lapack_int *ipiv, const lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *rcond, double
           *ferr, double *berr, lapack_complex_double *work, double *rwork,
           lapack_int *info)
little vibe check for you: sspsvx and dspsvx take lapack_int *iwork + float/double *work, while cspsvx and zspsvx swap that whole deal for a *rwork. don't mix them up, i'm begging 🙈

🦋 packed Hermitian: hpsv + hpsvx

same shape as the symmetric crew, just h instead of s. and they only come in complex flavors — chpsv/zhpsv and chpsvx/zhpsvx. keep up 🧚

       void LAPACK_chpsv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_float *ap, lapack_int *ipiv, lapack_complex_float *b,
           lapack_int *ldb, lapack_int *info)
       void LAPACK_zhpsv (char *uplo, lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *ap, lapack_int *ipiv, lapack_complex_double
           *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_chpsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_float *ap, lapack_complex_float *afp,
           lapack_int *ipiv, const lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *x, lapack_int *ldx, float *rcond, float *ferr,
           float *berr, lapack_complex_float *work, float *rwork, lapack_int
           *info)
       void LAPACK_zhpsvx (char *fact, char *uplo, lapack_int *n, lapack_int
           *nrhs, const lapack_complex_double *ap, lapack_complex_double *afp,
           lapack_int *ipiv, const lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *x, lapack_int *ldx, double *rcond, double
           *ferr, double *berr, lapack_complex_double *work, double *rwork,
           lapack_int *info)

🌸 QR era: geqrf

m, n, a, lda, tau, work, lwork, info — the whole squad. four precisions, one dream. the s/d versions stop at work, the c/z versions keep it in complex land the whole way through. slay 💖

       void LAPACK_sgeqrf (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, float *tau, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dgeqrf (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, double *tau, double *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_cgeqrf (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_complex_float *tau, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zgeqrf (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_complex_double *tau,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)

⭐ geqpf — the one with jpvt and no lwork

okay, notice: geqpf takes lapack_int *jpvt and has no lwork at all. the complex ones also get a rwork. she's different, she's lowkey built different, we respect her 💜

       void LAPACK_sgeqpf (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, lapack_int *jpvt, float *tau, float *work, lapack_int *info)
       void LAPACK_dgeqpf (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *jpvt, double *tau, double *work, lapack_int *info)
       void LAPACK_cgeqpf (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_int *jpvt, lapack_complex_float *tau,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_zgeqpf (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_int *jpvt, lapack_complex_double *tau,
           lapack_complex_double *work, double *rwork, lapack_int *info)

🔥 geqp3 — she brought lwork back

yup, lwork is back in the building for all four. jpvt stays. tau stays. complex ones keep their rwork too. it's giving glow-up 🌈

       void LAPACK_sgeqp3 (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, lapack_int *jpvt, float *tau, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dgeqp3 (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *jpvt, double *tau, double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_cgeqp3 (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_int *jpvt, lapack_complex_float *tau,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *info)
       void LAPACK_zgeqp3 (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_int *jpvt, lapack_complex_double *tau,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *info)

👑 generate-Q + apply-Q, the Q-niverse

so orgqr/ungqr are the generate girlies (m, n, k, a, lda, tau, work, lwork, info) and ormqr/unmqr are the apply girlies — they've got the extra side, trans, c, ldc situation. real ones know the difference. iykyk 🎀

       void LAPACK_sorgqr (lapack_int *m, lapack_int *n, lapack_int *k, float
           *a, lapack_int *lda, const float *tau, float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_dorgqr (lapack_int *m, lapack_int *n, lapack_int *k, double
           *a, lapack_int *lda, const double *tau, double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_sormqr (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const float *a, lapack_int *lda, const float
           *tau, float *c, lapack_int *ldc, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dormqr (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const double *a, lapack_int *lda, const double
           *tau, double *c, lapack_int *ldc, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_cungqr (lapack_int *m, lapack_int *n, lapack_int *k,
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *tau, lapack_complex_float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_zungqr (lapack_int *m, lapack_int *n, lapack_int *k,
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *tau, lapack_complex_double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_cunmqr (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const lapack_complex_float *a, lapack_int *lda,
           const lapack_complex_float *tau, lapack_complex_float *c, lapack_int
           *ldc, lapack_complex_float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_zunmqr (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const lapack_complex_double *a, lapack_int *lda,
           const lapack_complex_double *tau, lapack_complex_double *c,
           lapack_int *ldc, lapack_complex_double *work, lapack_int *lwork,
           lapack_int *info)

🍓 LQ era: gelqf + orglq / ormlq

same energy, l instead of r, and the whole family rolled through again. gelqf first, then the generators, then the appliers. obsessed with the symmetry ngl ✨

       void LAPACK_sgelqf (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, float *tau, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dgelqf (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, double *tau, double *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_cgelqf (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_complex_float *tau, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zgelqf (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_complex_double *tau,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_sorglq (lapack_int *m, lapack_int *n, lapack_int *k, float
           *a, lapack_int *lda, const float *tau, float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_dorglq (lapack_int *m, lapack_int *n, lapack_int *k, double
           *a, lapack_int *lda, const double *tau, double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_sormlq (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const float *a, lapack_int *lda, const float
           *tau, float *c, lapack_int *ldc, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dormlq (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const double *a, lapack_int *lda, const double
           *tau, double *c, lapack_int *ldc, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_cunglq (lapack_int *m, lapack_int *n, lapack_int *k,
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *tau, lapack_complex_float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_zunglq (lapack_int *m, lapack_int *n, lapack_int *k,
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *tau, lapack_complex_double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_cunmlq (char *side, char *trans, lapack_int *m, lapack_int

and that's exactly where this part cuts off mid-signature — LAPACK_cunmlq is literally mid-sentence and we're just gonna have to see how she ends up in the next chunk 😭💀 don't come for me, i'm transcribing faithfully fr fr 🫶

...and we're still in the signature pit, bestie 😭 — the code block just keeps going, so let's keep going with it. No new heading, we're mid-list, carry on:

           *n, lapack_int *k, const lapack_complex_float *a, lapack_int *lda,
           const lapack_complex_float *tau, lapack_complex_float *c, lapack_int
           *ldc, lapack_complex_float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_zunmlq (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const lapack_complex_double *a, lapack_int *lda,
           const lapack_complex_double *tau, lapack_complex_double *c,
           lapack_int *ldc, lapack_complex_double *work, lapack_int *lwork,
           lapack_int *info)

That's the LQ-unfold crew closing out 🦋 — and notice how a and tau are both wearing their little const badges in the unmlq variants, while c and work are absolutely not. Inputs stay untouched, outputs get written. Respect the badge, king 👑.


🎀 the QL household (and it is a whole household)

ok so geqlf makes the thing, orgql/ungql build the Q, and ormql/unmql apply it. Four precisions each because LAPACK does not believe in favourites 💅

       void LAPACK_sgeqlf (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, float *tau, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dgeqlf (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, double *tau, double *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_cgeqlf (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_complex_float *tau, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zgeqlf (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_complex_double *tau,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_sorgql (lapack_int *m, lapack_int *n, lapack_int *k, float
           *a, lapack_int *lda, const float *tau, float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_dorgql (lapack_int *m, lapack_int *n, lapack_int *k, double
           *a, lapack_int *lda, const double *tau, double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_cungql (lapack_int *m, lapack_int *n, lapack_int *k,
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *tau, lapack_complex_float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_zungql (lapack_int *m, lapack_int *n, lapack_int *k,
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *tau, lapack_complex_double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_sormql (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const float *a, lapack_int *lda, const float
           *tau, float *c, lapack_int *ldc, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dormql (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const double *a, lapack_int *lda, const double
           *tau, double *c, lapack_int *ldc, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_cunmql (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const lapack_complex_float *a, lapack_int *lda,
           const lapack_complex_float *tau, lapack_complex_float *c, lapack_int
           *ldc, lapack_complex_float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_zunmql (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const lapack_complex_double *a, lapack_int *lda,
           const lapack_complex_double *tau, lapack_complex_double *c,
           lapack_int *ldc, lapack_complex_double *work, lapack_int *lwork,
           lapack_int *info)

the way geqlf gets a non-const tau (it's an output, she's writing ✍️) but orgql and ormql get const tau (now it's an input, hands off 🙅‍♀️)? character development, honestly.

also side and trans are plain char * with zero const energy in the orm/unm ones. chaotic? yes. iconic? also yes. it's giving "we were young, we didn't know" 💀


🌸 the RQ family, aka gerqf and friends

       void LAPACK_sgerqf (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, float *tau, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dgerqf (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, double *tau, double *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_cgerqf (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_complex_float *tau, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zgerqf (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_complex_double *tau,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_sorgrq (lapack_int *m, lapack_int *n, lapack_int *k, float
           *a, lapack_int *lda, const float *tau, float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_dorgrq (lapack_int *m, lapack_int *n, lapack_int *k, double
           *a, lapack_int *lda, const double *tau, double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_cungrq (lapack_int *m, lapack_int *n, lapack_int *k,
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *tau, lapack_complex_float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_zungrq (lapack_int *m, lapack_int *n, lapack_int *k,
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *tau, lapack_complex_double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_sormrq (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const float *a, lapack_int *lda, const float
           *tau, float *c, lapack_int *ldc, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dormrq (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const double *a, lapack_int *lda, const double
           *tau, double *c, lapack_int *ldc, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_cunmrq (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const lapack_complex_float *a, lapack_int *lda,
           const lapack_complex_float *tau, lapack_complex_float *c, lapack_int
           *ldc, lapack_complex_float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_zunmrq (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const lapack_complex_double *a, lapack_int *lda,
           const lapack_complex_double *tau, lapack_complex_double *c,
           lapack_int *ldc, lapack_complex_double *work, lapack_int *lwork,
           lapack_int *info)

literally the exact same shape as the QL crew, just with an rq on the end instead of ql, and I'm obsessed with the consistency 🫶 copy-paste but make it math.


✨ tzrzf + ormrz: the ones with the extra letter

tzrzf is the m, n + usual suspects situation. then ormrz/unmrz show up with both k and l — one extra lapack_int than everybody else in this club, and honestly? main character behaviour 💅

       void LAPACK_stzrzf (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, float *tau, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dtzrzf (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, double *tau, double *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_ctzrzf (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_complex_float *tau, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_ztzrzf (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_complex_double *tau,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_sormrz (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, lapack_int *l, const float *a, lapack_int *lda,
           const float *tau, float *c, lapack_int *ldc, float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_dormrz (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, lapack_int *l, const double *a, lapack_int *lda,
           const double *tau, double *c, lapack_int *ldc, double *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_cunmrz (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, lapack_int *l, const lapack_complex_float *a,
           lapack_int *lda, const lapack_complex_float *tau,
           lapack_complex_float *c, lapack_int *ldc, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zunmrz (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, lapack_int *l, const lapack_complex_double *a,
           lapack_int *lda, const lapack_complex_double *tau,
           lapack_complex_double *c, lapack_int *ldc, lapack_complex_double
           *work, lapack_int *lwork, lapack_int *info)

💜 the gq pair: two factorizations in one call, she's efficient

ggqrf and ggrqf both take two matrices (a with lda + taua, and b with ldb + taub) — two taus, two leading dimensions, one info at the end holding it all together 😌

watch the argument ORDER tho, because it is NOT the same between them 👀 ggqrf leads with n, m, p and ggrqf leads with m, p, n. do not mix them up, i am begging 🙏

       void LAPACK_sggqrf (lapack_int *n, lapack_int *m, lapack_int *p, float
           *a, lapack_int *lda, float *taua, float *b, lapack_int *ldb, float
           *taub, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dggqrf (lapack_int *n, lapack_int *m, lapack_int *p, double
           *a, lapack_int *lda, double *taua, double *b, lapack_int *ldb,
           double *taub, double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_cggqrf (lapack_int *n, lapack_int *m, lapack_int *p,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float
           *taua, lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *taub, lapack_complex_float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_zggqrf (lapack_int *n, lapack_int *m, lapack_int *p,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double
           *taua, lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *taub, lapack_complex_double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_sggrqf (lapack_int *m, lapack_int *p, lapack_int *n, float
           *a, lapack_int *lda, float *taua, float *b, lapack_int *ldb, float
           *taub, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dggrqf (lapack_int *m, lapack_int *p, lapack_int *n, double
           *a, lapack_int *lda, double *taua, double *b, lapack_int *ldb,
           double *taub, double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_cggrqf (lapack_int *m, lapack_int *p, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float
           *taua, lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *taub, lapack_complex_float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_zggrqf (lapack_int *m, lapack_int *p, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double
           *taua, lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *taub, lapack_complex_double *work, lapack_int
           *lwork, lapack_int *info)

🔥 gebrd: bidiagonal era

gebrd gives you d and e (two real arrays for the diagonal-ish business) plus tauq and taup. the complex versions still take float *d / float *e / double *d / double *e though — real numbers in a complex world, we love a mixed cast 🌈

       void LAPACK_sgebrd (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, float *d, float *e, float *tauq, float *taup, float *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_dgebrd (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, double *d, double *e, double *tauq, double *taup, double
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_cgebrd (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, float *d, float *e, lapack_complex_float *tauq,
           lapack_complex_float *taup, lapack_complex_float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_zgebrd (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, double *d, double *e, lapack_complex_double
           *tauq, lapack_complex_double *taup, lapack_complex_double *work,
           lapack_int *lwork, lapack_int *info)

🦋 gbbrd: the one with the MOST arguments and NO lwork

bestie. look at this signature. vect, m, n, ncc, kl, ku, ab, ldab, d, e, q, ldq, pt, ldpt, c, ldc, work, info. seventeen things. no lwork in sight. she does not take a lwork. she does not need one. icon behaviour, honestly 💀✨

       void LAPACK_sgbbrd (char *vect, lapack_int *m, lapack_int *n, lapack_int
           *ncc, lapack_int *kl, lapack_int *ku, float *ab, lapack_int *ldab,
           float *d, float *e, float *q, lapack_int *ldq, float *pt, lapack_int
           *ldpt, float *c, lapack_int *ldc, float *work, lapack_int *info)
       void LAPACK_dgbbrd (char *vect, lapack_int *m, lapack_int *n, lapack_int
           *ncc, lapack_int *kl, lapack_int *ku, double *ab, lapack_int *ldab,
           double *d, double *e, double *q, lapack_int *ldq, double *pt,
           lapack_int *ldpt, double *c, lapack_int *ldc, double *work,

and yes we're stopping mid-signature again because that's just how this page rolls — the dgbbrd signature goes on, and so do we, in the next bit 🫶 don't go anywhere.

...still going, bestie, we're deep in the declaration zone now — but look, there's a whole pattern here and once you clock it you'll be reading these like a text from your best friend 💅

Every single one of these comes in the same little family of four: s = float, d = double, c = lapack_complex_float, z = lapack_complex_double. Same name, same parameters, different precision. It's giving matching friendship bracelets, fr fr.
      lapack_int *info)
  void LAPACK_cgbbrd (char *vect, lapack_int *m, lapack_int *n, lapack_int
      *ncc, lapack_int *kl, lapack_int *ku, lapack_complex_float *ab,
      lapack_int *ldab, float *d, float *e, lapack_complex_float *q,
      lapack_int *ldq, lapack_complex_float *pt, lapack_int *ldpt,
      lapack_complex_float *c, lapack_int *ldc, lapack_complex_float
      *work, float *rwork, lapack_int *info)
  void LAPACK_zgbbrd (char *vect, lapack_int *m, lapack_int *n, lapack_int
      *ncc, lapack_int *kl, lapack_int *ku, lapack_complex_double *ab,
      lapack_int *ldab, double *d, double *e, lapack_complex_double *q,
      lapack_int *ldq, lapack_complex_double *pt, lapack_int *ldpt,
      lapack_complex_double *c, lapack_int *ldc, lapack_complex_double
      *work, double *rwork, lapack_int *info)

Bestie notice how cgbbrd and zgbbrd are the only two in this family grabbing rwork on top of work? The real-valued ones didn't need it. That's not a vibe I invented, it's literally in the signature — count the pointers yourself if you don't believe me 🫶


Now the orgbr/ormbr/ungbr/unmbr crew — and yes, s/d come as a pair and c/z come as a pair, and the tau pointer is const on all four while a is not. Slay, const correctness. ✨

  void LAPACK_sorgbr (char *vect, lapack_int *m, lapack_int *n, lapack_int
      *k, float *a, lapack_int *lda, const float *tau, float *work,
      lapack_int *lwork, lapack_int *info)
  void LAPACK_dorgbr (char *vect, lapack_int *m, lapack_int *n, lapack_int
      *k, double *a, lapack_int *lda, const double *tau, double *work,
      lapack_int *lwork, lapack_int *info)
  void LAPACK_sormbr (char *vect, char *side, char *trans, lapack_int *m,
      lapack_int *n, lapack_int *k, const float *a, lapack_int *lda, const
      float *tau, float *c, lapack_int *ldc, float *work, lapack_int
      *lwork, lapack_int *info)
  void LAPACK_dormbr (char *vect, char *side, char *trans, lapack_int *m,
      lapack_int *n, lapack_int *k, const double *a, lapack_int *lda,
      const double *tau, double *c, lapack_int *ldc, double *work,
      lapack_int *lwork, lapack_int *info)
  void LAPACK_cungbr (char *vect, lapack_int *m, lapack_int *n, lapack_int
      *k, lapack_complex_float *a, lapack_int *lda, const
      lapack_complex_float *tau, lapack_complex_float *work, lapack_int
      *lwork, lapack_int *info)
  void LAPACK_zungbr (char *vect, lapack_int *m, lapack_int *n, lapack_int
      *k, lapack_complex_double *a, lapack_int *lda, const
      lapack_complex_double *tau, lapack_complex_double *work, lapack_int
      *lwork, lapack_int *info)
  void LAPACK_cunmbr (char *vect, char *side, char *trans, lapack_int *m,
      lapack_int *n, lapack_int *k, const lapack_complex_float *a,
      lapack_int *lda, const lapack_complex_float *tau,
      lapack_complex_float *c, lapack_int *ldc, lapack_complex_float
      *work, lapack_int *lwork, lapack_int *info)
  void LAPACK_zunmbr (char *vect, char *side, char *trans, lapack_int *m,
      lapack_int *n, lapack_int *k, const lapack_complex_double *a,
      lapack_int *lda, const lapack_complex_double *tau,
      lapack_complex_double *c, lapack_int *ldc, lapack_complex_double
      *work, lapack_int *lwork, lapack_int *info)

Notice the o vs u thing? sorgbr/dorgbr/sormbr/dormbr for the real ones, cungbr/zungbr/cunmbr/zunmbr for the complex ones. That's not a typo, that's the whole naming convention and if you "fix" it your code will not compile and you'll be sad 😭


Next up: the bidiagonal squad. bdsqr gets four flavours, bdsdc gets two, bdsvdx gets two. The way bdsqr keeps vt, u, and c all as full arrays with their own ldvt, ldu, ldc... main character energy honestly 👑

  void LAPACK_sbdsqr (char *uplo, lapack_int *n, lapack_int *ncvt,
      lapack_int *nru, lapack_int *ncc, float *d, float *e, float *vt,
      lapack_int *ldvt, float *u, lapack_int *ldu, float *c, lapack_int
      *ldc, float *work, lapack_int *info)
  void LAPACK_dbdsqr (char *uplo, lapack_int *n, lapack_int *ncvt,
      lapack_int *nru, lapack_int *ncc, double *d, double *e, double *vt,
      lapack_int *ldvt, double *u, lapack_int *ldu, double *c, lapack_int
      *ldc, double *work, lapack_int *info)
  void LAPACK_cbdsqr (char *uplo, lapack_int *n, lapack_int *ncvt,
      lapack_int *nru, lapack_int *ncc, float *d, float *e,
      lapack_complex_float *vt, lapack_int *ldvt, lapack_complex_float *u,
      lapack_int *ldu, lapack_complex_float *c, lapack_int *ldc, float
      *work, lapack_int *info)
  void LAPACK_zbdsqr (char *uplo, lapack_int *n, lapack_int *ncvt,
      lapack_int *nru, lapack_int *ncc, double *d, double *e,
      lapack_complex_double *vt, lapack_int *ldvt, lapack_complex_double
      *u, lapack_int *ldu, lapack_complex_double *c, lapack_int *ldc,
      double *work, lapack_int *info)
  void LAPACK_sbdsdc (char *uplo, char *compq, lapack_int *n, float *d,
      float *e, float *u, lapack_int *ldu, float *vt, lapack_int *ldvt,
      float *q, lapack_int *iq, float *work, lapack_int *iwork, lapack_int
      *info)
  void LAPACK_dbdsdc (char *uplo, char *compq, lapack_int *n, double *d,
      double *e, double *u, lapack_int *ldu, double *vt, lapack_int *ldvt,
      double *q, lapack_int *iq, double *work, lapack_int *iwork,
      lapack_int *info)
  void LAPACK_sbdsvdx (char *uplo, char *jobz, char *range, lapack_int *n,
      float *d, float *e, float *vl, float *vu, lapack_int *il, lapack_int
      *iu, lapack_int *ns, float *s, float *z, lapack_int *ldz, float
      *work, lapack_int *iwork, lapack_int *info)
  void LAPACK_dbdsvdx (char *uplo, char *jobz, char *range, lapack_int *n,
      double *d, double *e, double *vl, double *vu, lapack_int *il,
      lapack_int *iu, lapack_int *ns, double *s, double *z, lapack_int
      *ldz, double *work, lapack_int *iwork, lapack_int *info)

Real talk though: the complex bdsqr versions take float/double for d and e and work (because singular values are always real), but lapack_complex_* for vt, u, c. Mixed types, but make it fashion 💅


Okay and now we hit the tridiagonal block, which is a lot but it's literally the same shape on repeat. sytrd → orgtr → ormtr is your real-valued trio, hetrd → ungtr → unmtr is the complex trio. Same story for the packed versions after: sptrd → opgtr → opmtr, and hptrd → upgtr → upmtr.

  void LAPACK_ssytrd (char *uplo, lapack_int *n, float *a, lapack_int
      *lda, float *d, float *e, float *tau, float *work, lapack_int
      *lwork, lapack_int *info)
  void LAPACK_dsytrd (char *uplo, lapack_int *n, double *a, lapack_int
      *lda, double *d, double *e, double *tau, double *work, lapack_int
      *lwork, lapack_int *info)
  void LAPACK_sorgtr (char *uplo, lapack_int *n, float *a, lapack_int
      *lda, const float *tau, float *work, lapack_int *lwork, lapack_int
      *info)
  void LAPACK_dorgtr (char *uplo, lapack_int *n, double *a, lapack_int
      *lda, const double *tau, double *work, lapack_int *lwork, lapack_int
      *info)
  void LAPACK_sormtr (char *side, char *uplo, char *trans, lapack_int *m,
      lapack_int *n, const float *a, lapack_int *lda, const float *tau,
      float *c, lapack_int *ldc, float *work, lapack_int *lwork,
      lapack_int *info)
  void LAPACK_dormtr (char *side, char *uplo, char *trans, lapack_int *m,
      lapack_int *n, const double *a, lapack_int *lda, const double *tau,
      double *c, lapack_int *ldc, double *work, lapack_int *lwork,
      lapack_int *info)
  void LAPACK_chetrd (char *uplo, lapack_int *n, lapack_complex_float *a,
      lapack_int *lda, float *d, float *e, lapack_complex_float *tau,
      lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
  void LAPACK_zhetrd (char *uplo, lapack_int *n, lapack_complex_double *a,
      lapack_int *lda, double *d, double *e, lapack_complex_double *tau,
      lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
  void LAPACK_cungtr (char *uplo, lapack_int *n, lapack_complex_float *a,
      lapack_int *lda, const lapack_complex_float *tau,
      lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
  void LAPACK_zungtr (char *uplo, lapack_int *n, lapack_complex_double *a,
      lapack_int *lda, const lapack_complex_double *tau,
      lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
  void LAPACK_cunmtr (char *side, char *uplo, char *trans, lapack_int *m,
      lapack_int *n, const lapack_complex_float *a, lapack_int *lda, const
      lapack_complex_float *tau, lapack_complex_float *c, lapack_int *ldc,
      lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
  void LAPACK_zunmtr (char *side, char *uplo, char *trans, lapack_int *m,
      lapack_int *n, const lapack_complex_double *a, lapack_int *lda,
      const lapack_complex_double *tau, lapack_complex_double *c,
      lapack_int *ldc, lapack_complex_double *work, lapack_int *lwork,
      lapack_int *info)

The trick to remember which is which, iykyk: *trd functions make the tridiagonal form and spit out tau; the org*/ung* ones rebuild an actual orthogonal/unitary matrix q from that tau; and the orm*/unm* ones apply it to some matrix c without ever forming q. Three different jobs, three different signatures, zero guesswork needed. 🧚


Packed storage time — same drama, no lda anywhere because packed arrays don't need a leading dimension. Look at the parameter lists shrinking! Iconic ✨

  void LAPACK_ssptrd (char *uplo, lapack_int *n, float *ap, float *d,
      float *e, float *tau, lapack_int *info)
  void LAPACK_dsptrd (char *uplo, lapack_int *n, double *ap, double *d,
      double *e, double *tau, lapack_int *info)
  void LAPACK_sopgtr (char *uplo, lapack_int *n, const float *ap, const
      float *tau, float *q, lapack_int *ldq, float *work, lapack_int
      *info)
  void LAPACK_dopgtr (char *uplo, lapack_int *n, const double *ap, const
      double *tau, double *q, lapack_int *ldq, double *work, lapack_int
      *info)
  void LAPACK_sopmtr (char *side, char *uplo, char *trans, lapack_int *m,
      lapack_int *n, const float *ap, const float *tau, float *c,
      lapack_int *ldc, float *work, lapack_int *info)
  void LAPACK_dopmtr (char *side, char *uplo, char *trans, lapack_int *m,
      lapack_int *n, const double *ap, const double *tau, double *c,
      lapack_int *ldc, double *work, lapack_int *info)
  void LAPACK_chptrd (char *uplo, lapack_int *n, lapack_complex_float *ap,
      float *d, float *e, lapack_complex_float *tau, lapack_int *info)
  void LAPACK_zhptrd (char *uplo, lapack_int *n, lapack_complex_double
      *ap, double *d, double *e, lapack_complex_double *tau, lapack_int
      *info)
  void LAPACK_cupgtr (char *uplo, lapack_int *n, const
      lapack_complex_float *ap, const lapack_complex_float *tau,
      lapack_complex_float *q, lapack_int *ldq, lapack_complex_float
      *work, lapack_int *info)
  void LAPACK_zupgtr (char *uplo, lapack_int *n, const
      lapack_complex_double *ap, const lapack_complex_double *tau,
      lapack_complex_double *q, lapack_int *ldq, lapack_complex_double
      *work, lapack_int *info)
  void LAPACK_cupmtr (char *side, char *uplo, char *trans, lapack_int *m,
      lapack_int *n, const lapack_complex_float *ap, const
      lapack_complex_float *tau, lapack_complex_float *c, lapack_int *ldc,
      lapack_complex_float *work, lapack_int *info)
  void LAPACK_zupmtr (char *side, char *uplo, char *trans, lapack_int *m,
      lapack_int *n, const lapack_complex_double *ap, const
      lapack_complex_double *tau, lapack_complex_double *c, lapack_int
      *ldc, lapack_complex_double *work, lapack_int *info)
Heads up bestie: sptrd/dptrd — sorry, ssptrd/dsptrd and the hptrd pair — have no lwork/work parameter in this declaration at all, and the opgtr/opmtr/upgtr/upmtr ones take work but no lwork. Not me making that up — read the lines, the arguments just aren't there. If you're passing extra args, that's a skill issue 💀

And the banded tridiagonal reducers, sbtrd/dbtrd... nope, ssbtrd/dsbtrd/chbtrd/zhbtrd — with vect and uplo and kd all up front. Then the tridiagonal eigensolvers sterf (two flavours, no z in sight) and steqr (two flavours, compz first).

  void LAPACK_ssbtrd (char *vect, char *uplo, lapack_int *n, lapack_int
      *kd, float *ab, lapack_int *ldab, float *d, float *e, float *q,
      lapack_int *ldq, float *work, lapack_int *info)
  void LAPACK_dsbtrd (char *vect, char *uplo, lapack_int *n, lapack_int
      *kd, double *ab, lapack_int *ldab, double *d, double *e, double *q,
      lapack_int *ldq, double *work, lapack_int *info)
  void LAPACK_chbtrd (char *vect, char *uplo, lapack_int *n, lapack_int
      *kd, lapack_complex_float *ab, lapack_int *ldab, float *d, float *e,
      lapack_complex_float *q, lapack_int *ldq, lapack_complex_float
      *work, lapack_int *info)
  void LAPACK_zhbtrd (char *vect, char *uplo, lapack_int *n, lapack_int
      *kd, lapack_complex_double *ab, lapack_int *ldab, double *d, double
      *e, lapack_complex_double *q, lapack_int *ldq, lapack_complex_double
      *work, lapack_int *info)
  void LAPACK_ssterf (lapack_int *n, float *d, float *e, lapack_int *info)
  void LAPACK_dsterf (lapack_int *n, double *d, double *e, lapack_int
      *info)
  void LAPACK_ssteqr (char *compz, lapack_int *n, float *d, float *e,
      float *z, lapack_int *ldz, float *work, lapack_int *info)
  void LAPACK_dsteqr (char *compz, lapack_int *n, double *d, double *e,
      double *z, lapack_int *ldz, double *work, lapack_int *info)

The way sterf is out here with the shortest signature ever — just n, d, e, info, no vectors, no work, no nothing — and then steqr right after it has compz and z and ldz and work... they're literally siblings and one of them is a minimalist 🎀

And sterf has no complex versions at all, only s and d. That's it, that's the whole offering. Obsessed with the restraint. 🌸


kisses we're still mid-SYNOPSIS and there's more coming — don't go anywhere bestie 💖

🦋 the tridiagonal glam squad: steqr & stemr

okay so first up we have the eigenvalue girlies for symmetric tridiagonal matrices, and yes they come in all four flavors because ofc they do 💅

void LAPACK_csteqr (char *compz, lapack_int *n, float *d, float *e,
    lapack_complex_float *z, lapack_int *ldz, float *work, lapack_int
    *info)
void LAPACK_zsteqr (char *compz, lapack_int *n, double *d, double *e,
    lapack_complex_double *z, lapack_int *ldz, double *work, lapack_int
    *info)
void LAPACK_sstemr (char *jobz, char *range, lapack_int *n, float *d,
    float *e, float *vl, float *vu, lapack_int *il, lapack_int *iu,
    lapack_int *m, float *w, float *z, lapack_int *ldz, lapack_int *nzc,
    lapack_int *isuppz, lapack_logical *tryrac, float *work, lapack_int
    *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_dstemr (char *jobz, char *range, lapack_int *n, double *d,
    double *e, double *vl, double *vu, lapack_int *il, lapack_int *iu,
    lapack_int *m, double *w, double *z, lapack_int *ldz, lapack_int
    *nzc, lapack_int *isuppz, lapack_logical *tryrac, double *work,
    lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int
    *info)
void LAPACK_cstemr (char *jobz, char *range, lapack_int *n, float *d,
    float *e, float *vl, float *vu, lapack_int *il, lapack_int *iu,
    lapack_int *m, float *w, lapack_complex_float *z, lapack_int *ldz,
    lapack_int *nzc, lapack_int *isuppz, lapack_logical *tryrac, float
    *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork,
    lapack_int *info)
void LAPACK_zstemr (char *jobz, char *range, lapack_int *n, double *d,
    double *e, double *vl, double *vu, lapack_int *il, lapack_int *iu,
    lapack_int *m, double *w, lapack_complex_double *z, lapack_int *ldz,
    lapack_int *nzc, lapack_int *isuppz, lapack_logical *tryrac, double
    *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork,
    lapack_int *info)

note how steqr is literally just the four complex-precision ones here — c and z — while stemr is out here with the full s/d/c/z set. and stemr? she's thriving, look at that parameter list 😭 nzc, isuppz, tryrac, work, lwork, iwork, liwork… she brought the whole suitcase. also hi lapack_logical *tryrac, we see you bestie 💖


✨ divide & conquer era: stedc

void LAPACK_sstedc (char *compz, lapack_int *n, float *d, float *e,
    float *z, lapack_int *ldz, float *work, lapack_int *lwork,
    lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_dstedc (char *compz, lapack_int *n, double *d, double *e,
    double *z, lapack_int *ldz, double *work, lapack_int *lwork,
    lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_cstedc (char *compz, lapack_int *n, float *d, float *e,
    lapack_complex_float *z, lapack_int *ldz, lapack_complex_float
    *work, lapack_int *lwork, float *rwork, lapack_int *lrwork,
    lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_zstedc (char *compz, lapack_int *n, double *d, double *e,
    lapack_complex_double *z, lapack_int *ldz, lapack_complex_double
    *work, lapack_int *lwork, double *rwork, lapack_int *lrwork,
    lapack_int *iwork, lapack_int *liwork, lapack_int *info)

the way the real ones (s, d) only need work/lwork + iwork/liwork, but the complex ones (c, z) ALSO get rwork/lrwork on top — it's giving "extra baggage fees" 💀 iconic honestly.


🎀 the MRRR girlies: stegr

void LAPACK_sstegr (char *jobz, char *range, lapack_int *n, float *d,
    float *e, float *vl, float *vu, lapack_int *il, lapack_int *iu,
    float *abstol, lapack_int *m, float *w, float *z, lapack_int *ldz,
    lapack_int *isuppz, float *work, lapack_int *lwork, lapack_int
    *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_dstegr (char *jobz, char *range, lapack_int *n, double *d,
    double *e, double *vl, double *vu, lapack_int *il, lapack_int *iu,
    double *abstol, lapack_int *m, double *w, double *z, lapack_int
    *ldz, lapack_int *isuppz, double *work, lapack_int *lwork,
    lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_cstegr (char *jobz, char *range, lapack_int *n, float *d,
    float *e, float *vl, float *vu, lapack_int *il, lapack_int *iu,
    float *abstol, lapack_int *m, float *w, lapack_complex_float *z,
    lapack_int *ldz, lapack_int *isuppz, float *work, lapack_int *lwork,
    lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_zstegr (char *jobz, char *range, lapack_int *n, double *d,
    double *e, double *vl, double *vu, lapack_int *il, lapack_int *iu,
    double *abstol, lapack_int *m, double *w, lapack_complex_double *z,
    lapack_int *ldz, lapack_int *isuppz, double *work, lapack_int
    *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)

see the pattern? jobz, range, vl, vu, il, iu, abstol, m, w, z, ldz, isuppz, work, lwork, iwork, liwork, info. same skeleton, four outfits. slay 💅


🌸 pteqr — the positive-definite cuties

void LAPACK_spteqr (char *compz, lapack_int *n, float *d, float *e,
    float *z, lapack_int *ldz, float *work, lapack_int *info)
void LAPACK_dpteqr (char *compz, lapack_int *n, double *d, double *e,
    double *z, lapack_int *ldz, double *work, lapack_int *info)
void LAPACK_cpteqr (char *compz, lapack_int *n, float *d, float *e,
    lapack_complex_float *z, lapack_int *ldz, float *work, lapack_int
    *info)
void LAPACK_zpteqr (char *compz, lapack_int *n, double *d, double *e,
    lapack_complex_double *z, lapack_int *ldz, double *work, lapack_int
    *info)

short, sweet, minimal args — she said "I don't need a lwork, I don't need iwork, I'm low-maintenance" and honestly? respect 🫶


💜 stebz + stein + disna — the bisection clique

void LAPACK_sstebz (char *range, char *order, lapack_int *n, float *vl,
    float *vu, lapack_int *il, lapack_int *iu, float *abstol, const
    float *d, const float *e, lapack_int *m, lapack_int *nsplit, float
    *w, lapack_int *iblock, lapack_int *isplit, float *work, lapack_int
    *iwork, lapack_int *info)
void LAPACK_dstebz (char *range, char *order, lapack_int *n, double *vl,
    double *vu, lapack_int *il, lapack_int *iu, double *abstol, const
    double *d, const double *e, lapack_int *m, lapack_int *nsplit,
    double *w, lapack_int *iblock, lapack_int *isplit, double *work,
    lapack_int *iwork, lapack_int *info)
void LAPACK_sstein (lapack_int *n, const float *d, const float *e,
    lapack_int *m, const float *w, const lapack_int *iblock, const
    lapack_int *isplit, float *z, lapack_int *ldz, float *work,
    lapack_int *iwork, lapack_int *ifailv, lapack_int *info)
void LAPACK_dstein (lapack_int *n, const double *d, const double *e,
    lapack_int *m, const double *w, const lapack_int *iblock, const
    lapack_int *isplit, double *z, lapack_int *ldz, double *work,
    lapack_int *iwork, lapack_int *ifailv, lapack_int *info)
void LAPACK_cstein (lapack_int *n, const float *d, const float *e,
    lapack_int *m, const float *w, const lapack_int *iblock, const
    lapack_int *isplit, lapack_complex_float *z, lapack_int *ldz, float
    *work, lapack_int *iwork, lapack_int *ifailv, lapack_int *info)
void LAPACK_zstein (lapack_int *n, const double *d, const double *e,
    lapack_int *m, const double *w, const lapack_int *iblock, const
    lapack_int *isplit, lapack_complex_double *z, lapack_int *ldz,
    double *work, lapack_int *iwork, lapack_int *ifailv, lapack_int
    *info)
void LAPACK_sdisna (char *job, lapack_int *m, lapack_int *n, const float
    *d, float *sep, lapack_int *info)
void LAPACK_ddisna (char *job, lapack_int *m, lapack_int *n, const
    double *d, double *sep, lapack_int *info)

not the const qualifiers on d and e 👀 stebz and stein are not letting you touch their inputs, periodt. and disna is the tiny two-precision one at the end with just job, m, n, d, sep, info — she's baby, she's brief, she's valid 💖


🔥 the …gst generalized crew: sygst, hegst, spgst, hpgst, sbgst, hbgst

void LAPACK_ssygst (lapack_int *itype, char *uplo, lapack_int *n, float
    *a, lapack_int *lda, const float *b, lapack_int *ldb, lapack_int
    *info)
void LAPACK_dsygst (lapack_int *itype, char *uplo, lapack_int *n, double
    *a, lapack_int *lda, const double *b, lapack_int *ldb, lapack_int
    *info)
void LAPACK_chegst (lapack_int *itype, char *uplo, lapack_int *n,
    lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
    *b, lapack_int *ldb, lapack_int *info)
void LAPACK_zhegst (lapack_int *itype, char *uplo, lapack_int *n,
    lapack_complex_double *a, lapack_int *lda, const
    lapack_complex_double *b, lapack_int *ldb, lapack_int *info)
void LAPACK_sspgst (lapack_int *itype, char *uplo, lapack_int *n, float
    *ap, const float *bp, lapack_int *info)
void LAPACK_dspgst (lapack_int *itype, char *uplo, lapack_int *n, double
    *ap, const double *bp, lapack_int *info)
void LAPACK_chpgst (lapack_int *itype, char *uplo, lapack_int *n,
    lapack_complex_float *ap, const lapack_complex_float *bp, lapack_int
    *info)
void LAPACK_zhpgst (lapack_int *itype, char *uplo, lapack_int *n,
    lapack_complex_double *ap, const lapack_complex_double *bp,
    lapack_int *info)
void LAPACK_ssbgst (char *vect, char *uplo, lapack_int *n, lapack_int
    *ka, lapack_int *kb, float *ab, lapack_int *ldab, const float *bb,
    lapack_int *ldbb, float *x, lapack_int *ldx, float *work, lapack_int
    *info)
void LAPACK_dsbgst (char *vect, char *uplo, lapack_int *n, lapack_int
    *ka, lapack_int *kb, double *ab, lapack_int *ldab, const double *bb,
    lapack_int *ldbb, double *x, lapack_int *ldx, double *work,
    lapack_int *info)
void LAPACK_chbgst (char *vect, char *uplo, lapack_int *n, lapack_int
    *ka, lapack_int *kb, lapack_complex_float *ab, lapack_int *ldab,
    const lapack_complex_float *bb, lapack_int *ldbb,
    lapack_complex_float *x, lapack_int *ldx, lapack_complex_float
    *work, float *rwork, lapack_int *info)
void LAPACK_zhbgst (char *vect, char *uplo, lapack_int *n, lapack_int
    *ka, lapack_int *kb, lapack_complex_double *ab, lapack_int *ldab,
    const lapack_complex_double *bb, lapack_int *ldbb,
    lapack_complex_double *x, lapack_int *ldx, lapack_complex_double
    *work, double *rwork, lapack_int *info)

a whole family reunion 😭 sygst/hegst take a, lda, b, ldb; the packed spgst/hpgst swap in ap/bp and drop the ld* args entirely (packed = no leading dimension, no thoughts, head empty ✨); and the banded sbgst/hbgst show up with ka, kb, ab, ldab, bb, ldbb, x, ldx, work… and the complex ones ALSO get rwork because of course they do. and every single one has b/bp/bb marked const — do NOT touch, she's just here to be referenced 🔒


🧚 pbstf — small but mighty

void LAPACK_spbstf (char *uplo, lapack_int *n, lapack_int *kb, float
    *bb, lapack_int *ldbb, lapack_int *info)
void LAPACK_dpbstf (char *uplo, lapack_int *n, lapack_int *kb, double
    *bb, lapack_int *ldbb, lapack_int *info)
void LAPACK_cpbstf (char *uplo, lapack_int *n, lapack_int *kb,
    lapack_complex_float *bb, lapack_int *ldbb, lapack_int *info)
void LAPACK_zpbstf (char *uplo, lapack_int *n, lapack_int *kb,
    lapack_complex_double *bb, lapack_int *ldbb, lapack_int *info)

six args, four precisions, zero notes. she ate and left absolutely no crumbs 🍓


👑 Hessenberg hours: gehrd, orghr, ormhr

void LAPACK_sgehrd (lapack_int *n, lapack_int *ilo, lapack_int *ihi,
    float *a, lapack_int *lda, float *tau, float *work, lapack_int
    *lwork, lapack_int *info)
void LAPACK_dgehrd (lapack_int *n, lapack_int *ilo, lapack_int *ihi,
    double *a, lapack_int *lda, double *tau, double *work, lapack_int
    *lwork, lapack_int *info)
void LAPACK_cgehrd (lapack_int *n, lapack_int *ilo, lapack_int *ihi,
    lapack_complex_float *a, lapack_int *lda, lapack_complex_float *tau,
    lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zgehrd (lapack_int *n, lapack_int *ilo, lapack_int *ihi,
    lapack_complex_double *a, lapack_int *lda, lapack_complex_double
    *tau, lapack_complex_double *work, lapack_int *lwork, lapack_int
    *info)
void LAPACK_sorghr (lapack_int *n, lapack_int *ilo, lapack_int *ihi,
    float *a, lapack_int *lda, const float *tau, float *work, lapack_int
    *lwork, lapack_int *info)
void LAPACK_dorghr (lapack_int *n, lapack_int *ilo, lapack_int *ihi,
    double *a, lapack_int *lda, const double *tau, double *work,
    lapack_int *lwork, lapack_int *info)
void LAPACK_sormhr (char *side, char *trans, lapack_int *m, lapack_int
    *n, lapack_int *ilo, lapack_int *ihi, const float *a, lapack_int
    *lda, const float *tau, float *c, lapack_int *ldc, float *work,
    lapack_int *lwork, lapack_int *info)
void LAPACK_dormhr (char *side, char *trans, lapack_int *m, lapack_int

okay so gehrd is the one doing the actual work, then orghr swoops in and — wait, notice she takes const float *tau? yep, tau is read-only for her, she's just borrowing it 🫶. and ormhr came through with side, trans, m, n, ilo, ihi, a, lda, tau, c, ldc, work, lwork, info — dormhr is literally mid-sentence right there and then the page cuts off 😭 she's getting finished next time, hold please, don't panic, she'll be back 💀


ngl this stretch is a LOT of prototypes back to back — but every single one is doing her little job and we respect the hustle. more coming, stay tuned bestie 🌈

...and we're still deep in the SYNOPSIS hallway, bestie, don't panic 🫶. Last part we were mid-dunmhr — the signature just ✨continued✨ — so here's the tail of it, and then the complex unghr/unmhr girlies roll in right behind:

           *n, lapack_int *ilo, lapack_int *ihi, const double *a, lapack_int
           *lda, const double *tau, double *c, lapack_int *ldc, double *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_cunghr (lapack_int *n, lapack_int *ilo, lapack_int *ihi,
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *tau, lapack_complex_float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_zunghr (lapack_int *n, lapack_int *ilo, lapack_int *ihi,
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *tau, lapack_complex_double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_cunmhr (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *ilo, lapack_int *ihi, const lapack_complex_float *a,
           lapack_int *lda, const lapack_complex_float *tau,
           lapack_complex_float *c, lapack_int *ldc, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zunmhr (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *ilo, lapack_int *ihi, const lapack_complex_double
           *a, lapack_int *lda, const lapack_complex_double *tau,
           lapack_complex_double *c, lapack_int *ldc, lapack_complex_double
           *work, lapack_int *lwork, lapack_int *info)

Obsessed with how every single argument is a pointer 💅 — *n, *ilo, *ihi, even *info (the girl who reports back). And note the m/n combo on the unmhr pair: two dimension ints, side, trans, no cap 🎀.


🦋 the gebal / gebak quartet, aka the balancing girlies

Four variants, same shape: s and d take plain float/double, c and z take lapack_complex_float/lapack_complex_double — but all four hand you back a real scale array (float *scale or double *scale, never complex, iykyk 🌸).

       void LAPACK_sgebal (char *job, lapack_int *n, float *a, lapack_int *lda,
           lapack_int *ilo, lapack_int *ihi, float *scale, lapack_int *info)
       void LAPACK_dgebal (char *job, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *ilo, lapack_int *ihi, double *scale, lapack_int
           *info)
       void LAPACK_cgebal (char *job, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, lapack_int *ilo, lapack_int *ihi, float *scale,
           lapack_int *info)
       void LAPACK_zgebal (char *job, lapack_int *n, lapack_complex_double *a,
           lapack_int *lda, lapack_int *ilo, lapack_int *ihi, double *scale,
           lapack_int *info)
       void LAPACK_sgebak (char *job, char *side, lapack_int *n, lapack_int
           *ilo, lapack_int *ihi, const float *scale, lapack_int *m, float *v,
           lapack_int *ldv, lapack_int *info)
       void LAPACK_dgebak (char *job, char *side, lapack_int *n, lapack_int
           *ilo, lapack_int *ihi, const double *scale, lapack_int *m, double
           *v, lapack_int *ldv, lapack_int *info)
       void LAPACK_cgebak (char *job, char *side, lapack_int *n, lapack_int
           *ilo, lapack_int *ihi, const float *scale, lapack_int *m,
           lapack_complex_float *v, lapack_int *ldv, lapack_int *info)
       void LAPACK_zgebak (char *job, char *side, lapack_int *n, lapack_int
           *ilo, lapack_int *ihi, const double *scale, lapack_int *m,
           lapack_complex_double *v, lapack_int *ldv, lapack_int *info)

Cute detail: in the gebak girlies the scale gets a const glow-up (const float *scale, const double *scale) while the v matrix stays mutable — the way that job and side are char * (yes, char pointers, not chars, don't come for me 😭).


✨ hseqr — queen of the lwork trio

All four take job, compz, n, ilo, ihi, the h matrix with ldh, then the eigen-output, then z with ldz, then work + lwork + info. The real girlies (s/d) split their eigenvalues into two arrays: wr and wi 💖. The complex girlies (c/z) just need the one w.

       void LAPACK_shseqr (char *job, char *compz, lapack_int *n, lapack_int
           *ilo, lapack_int *ihi, float *h, lapack_int *ldh, float *wr, float
           *wi, float *z, lapack_int *ldz, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dhseqr (char *job, char *compz, lapack_int *n, lapack_int
           *ilo, lapack_int *ihi, double *h, lapack_int *ldh, double *wr,
           double *wi, double *z, lapack_int *ldz, double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_chseqr (char *job, char *compz, lapack_int *n, lapack_int
           *ilo, lapack_int *ihi, lapack_complex_float *h, lapack_int *ldh,
           lapack_complex_float *w, lapack_complex_float *z, lapack_int *ldz,
           lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zhseqr (char *job, char *compz, lapack_int *n, lapack_int
           *ilo, lapack_int *ihi, lapack_complex_double *h, lapack_int *ldh,
           lapack_complex_double *w, lapack_complex_double *z, lapack_int *ldz,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)

🎀 hsein — the long-signature icon

Ok this one ate. Look at job, eigsrc, initv, select, n, h/ldh, the eigen stuff, vl/ldvl, vr/ldvr, mm, m, work, the ifails, and info — that's a whole group chat in one function call 🌈.

Small thing but I'm noting it: the real variants (shsein, dhsein) declare lapack_logical *select without const, and the complex ones (chsein, zhsein) declare const lapack_logical *select. Also the complex girlies get an extra real rwork array (float *rwork / double *rwork) that the real ones don't have. Copy the prototype exactly, bestie, or the compiler will simply end you 💀.
       void LAPACK_shsein (char *job, char *eigsrc, char *initv, lapack_logical
           *select, lapack_int *n, const float *h, lapack_int *ldh, float *wr,
           const float *wi, float *vl, lapack_int *ldvl, float *vr, lapack_int
           *ldvr, lapack_int *mm, lapack_int *m, float *work, lapack_int
           *ifaill, lapack_int *ifailr, lapack_int *info)
       void LAPACK_dhsein (char *job, char *eigsrc, char *initv, lapack_logical
           *select, lapack_int *n, const double *h, lapack_int *ldh, double
           *wr, const double *wi, double *vl, lapack_int *ldvl, double *vr,
           lapack_int *ldvr, lapack_int *mm, lapack_int *m, double *work,
           lapack_int *ifaill, lapack_int *ifailr, lapack_int *info)
       void LAPACK_chsein (char *job, char *eigsrc, char *initv, const
           lapack_logical *select, lapack_int *n, const lapack_complex_float
           *h, lapack_int *ldh, lapack_complex_float *w, lapack_complex_float
           *vl, lapack_int *ldvl, lapack_complex_float *vr, lapack_int *ldvr,
           lapack_int *mm, lapack_int *m, lapack_complex_float *work, float
           *rwork, lapack_int *ifaill, lapack_int *ifailr, lapack_int *info)
       void LAPACK_zhsein (char *job, char *eigsrc, char *initv, const
           lapack_logical *select, lapack_int *n, const lapack_complex_double
           *h, lapack_int *ldh, lapack_complex_double *w, lapack_complex_double
           *vl, lapack_int *ldvl, lapack_complex_double *vr, lapack_int *ldvr,
           lapack_int *mm, lapack_int *m, lapack_complex_double *work, double
           *rwork, lapack_int *ifaill, lapack_int *ifailr, lapack_int *info)

Also hi, mm and m sitting right next to each other — do not mix them up, that's not a vibe check you want to fail 🙈.


🍓 trevc & trsna — the select squad

trevc takes side, howmny, select, n, the t matrix + ldt, then vl/ldvl and vr/ldvr, then mm, m, work, info. Same const situation as before: real ones are non-const lapack_logical *select, complex ones are const lapack_logical *select, and complex ones carry the extra rwork at the end 💜.

       void LAPACK_strevc (char *side, char *howmny, lapack_logical *select,
           lapack_int *n, const float *t, lapack_int *ldt, float *vl,
           lapack_int *ldvl, float *vr, lapack_int *ldvr, lapack_int *mm,
           lapack_int *m, float *work, lapack_int *info)
       void LAPACK_dtrevc (char *side, char *howmny, lapack_logical *select,
           lapack_int *n, const double *t, lapack_int *ldt, double *vl,
           lapack_int *ldvl, double *vr, lapack_int *ldvr, lapack_int *mm,
           lapack_int *m, double *work, lapack_int *info)
       void LAPACK_ctrevc (char *side, char *howmny, const lapack_logical
           *select, lapack_int *n, lapack_complex_float *t, lapack_int *ldt,
           lapack_complex_float *vl, lapack_int *ldvl, lapack_complex_float
           *vr, lapack_int *ldvr, lapack_int *mm, lapack_int *m,
           lapack_complex_float *work, float *rwork, lapack_int *info)
       void LAPACK_ztrevc (char *side, char *howmny, const lapack_logical
           *select, lapack_int *n, lapack_complex_double *t, lapack_int *ldt,
           lapack_complex_double *vl, lapack_int *ldvl, lapack_complex_double
           *vr, lapack_int *ldvr, lapack_int *mm, lapack_int *m,
           lapack_complex_double *work, double *rwork, lapack_int *info)

trsna is the one with two output real arrays — s and sep — plus work and ldwork and iwork (lapack_int *iwork). It's giving "I brought snacks for everyone" energy 🧚. Real variants: float *s, float *sep / double *s, double *sep with lapack_int *ldwork and lapack_int *iwork. Complex variants: s and sep are still real (float/double), and they get that extra rwork again.

       void LAPACK_strsna (char *job, char *howmny, const lapack_logical
           *select, lapack_int *n, const float *t, lapack_int *ldt, const float
           *vl, lapack_int *ldvl, const float *vr, lapack_int *ldvr, float *s,
           float *sep, lapack_int *mm, lapack_int *m, float *work, lapack_int
           *ldwork, lapack_int *iwork, lapack_int *info)
       void LAPACK_dtrsna (char *job, char *howmny, const lapack_logical
           *select, lapack_int *n, const double *t, lapack_int *ldt, const
           double *vl, lapack_int *ldvl, const double *vr, lapack_int *ldvr,
           double *s, double *sep, lapack_int *mm, lapack_int *m, double *work,
           lapack_int *ldwork, lapack_int *iwork, lapack_int *info)
       void LAPACK_ctrsna (char *job, char *howmny, const lapack_logical
           *select, lapack_int *n, const lapack_complex_float *t, lapack_int
           *ldt, const lapack_complex_float *vl, lapack_int *ldvl, const
           lapack_complex_float *vr, lapack_int *ldvr, float *s, float *sep,
           lapack_int *mm, lapack_int *m, lapack_complex_float *work,
           lapack_int *ldwork, float *rwork, lapack_int *info)
       void LAPACK_ztrsna (char *job, char *howmny, const lapack_logical
           *select, lapack_int *n, const lapack_complex_double *t, lapack_int
           *ldt, const lapack_complex_double *vl, lapack_int *ldvl, const
           lapack_complex_double *vr, lapack_int *ldvr, double *s, double *sep,
           lapack_int *mm, lapack_int *m, lapack_complex_double *work,
           lapack_int *ldwork, double *rwork, lapack_int *info)

(trsna's select is const in all four here, unlike trevc — the way consistency is not always the moment 😭.)


🔥 trexc, trsen, trsyl — the closing trio of this batch

trexc is refreshingly chill: compq, n, t/ldt, q/ldq, ifst, ilst, work, info. No lwork, no rwork, no drama. The complex pair even drops work entirely. Slay 💅.

       void LAPACK_strexc (char *compq, lapack_int *n, float *t, lapack_int
           *ldt, float *q, lapack_int *ldq, lapack_int *ifst, lapack_int *ilst,
           float *work, lapack_int *info)
       void LAPACK_dtrexc (char *compq, lapack_int *n, double *t, lapack_int
           *ldt, double *q, lapack_int *ldq, lapack_int *ifst, lapack_int
           *ilst, double *work, lapack_int *info)
       void LAPACK_ctrexc (char *compq, lapack_int *n, lapack_complex_float *t,
           lapack_int *ldt, lapack_complex_float *q, lapack_int *ldq,
           lapack_int *ifst, lapack_int *ilst, lapack_int *info)
       void LAPACK_ztrexc (char *compq, lapack_int *n, lapack_complex_double
           *t, lapack_int *ldt, lapack_complex_double *q, lapack_int *ldq,
           lapack_int *ifst, lapack_int *ilst, lapack_int *info)

trsen is the maximalist bestie: job, compq, select, n, t/ldt, q/ldq, then eigenvalues, then m, s, sep, work + lwork, iwork + liwork, info. The real girlies split eigenvalues into wr + wi; the complex girlies use one w and skip iwork/liwork entirely — and the complex ctrsen/ztrsen don't take lwork… wait, no, they do take lwork (lapack_int *lwork), they just skip the integer workspace pair. Look at the prototypes, not at me 🫶.

       void LAPACK_strsen (char *job, char *compq, const lapack_logical
           *select, lapack_int *n, float *t, lapack_int *ldt, float *q,
           lapack_int *ldq, float *wr, float *wi, lapack_int *m, float *s,
           float *sep, float *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *liwork, lapack_int *info)
       void LAPACK_dtrsen (char *job, char *compq, const lapack_logical
           *select, lapack_int *n, double *t, lapack_int *ldt, double *q,
           lapack_int *ldq, double *wr, double *wi, lapack_int *m, double *s,
           double *sep, double *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *liwork, lapack_int *info)
       void LAPACK_ctrsen (char *job, char *compq, const lapack_logical
           *select, lapack_int *n, lapack_complex_float *t, lapack_int *ldt,
           lapack_complex_float *q, lapack_int *ldq, lapack_complex_float *w,
           lapack_int *m, float *s, float *sep, lapack_complex_float *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_ztrsen (char *job, char *compq, const lapack_logical
           *select, lapack_int *n, lapack_complex_double *t, lapack_int *ldt,
           lapack_complex_double *q, lapack_int *ldq, lapack_complex_double *w,
           lapack_int *m, double *s, double *sep, lapack_complex_double *work,
           lapack_int *lwork, lapack_int *info)

Last up in this batch: trsyl ⭐ — trana, tranb, isgn, m, n, a/lda, b/ldb, c/ldc, scale, info. And in every single variant scale is real (float *scale / double *scale) even for ctrsyl and ztrsyl, whose a, b, c are all complex. Iconic. Also isgn is a lapack_int * in all four, no cap 🎀.

       void LAPACK_strsyl (char *trana, char *tranb, lapack_int *isgn,
           lapack_int *m, lapack_int *n, const float *a, lapack_int *lda, const
           float *b, lapack_int *ldb, float *c, lapack_int *ldc, float *scale,
           lapack_int *info)
       void LAPACK_dtrsyl (char *trana, char *tranb, lapack_int *isgn,
           lapack_int *m, lapack_int *n, const double *a, lapack_int *lda,
           const double *b, lapack_int *ldb, double *c, lapack_int *ldc, double
           *scale, lapack_int *info)
       void LAPACK_ctrsyl (char *trana, char *tranb, lapack_int *isgn,
           lapack_int *m, lapack_int *n, const lapack_complex_float *a,
           lapack_int *lda, const lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *c, lapack_int *ldc, float *scale, lapack_int
           *info)
       void LAPACK_ztrsyl (char *trana, char *tranb, lapack_int *isgn,
           lapack_int *m, lapack_int *n, const lapack_complex_double *a,
           lapack_int *lda, const lapack_complex_double *b, lapack_int *ldb,

And that's exactly where this chunk cuts off — ztrsyl mid-signature, the cliffhanger of it all 💀. Keep scrolling bestie, the prototypes literally do not stop coming 💖.

okay so we're still very much in the prototype wall, and yes it's giving phone book energy 💅 but every single line here is a real baddie so we lock in. Also bestie — we literally start mid-signature, the last few lines of the previous one, no cap:

lapack_complex_double *c, lapack_int *ldc, double *scale, lapack_int
*info)

that's it, that's the whole tail, and then we're free 🌸


The Hessenberg-triangular reduction girlies: gghrd — four of them, one per precision, same energy, compq and compz decide what happens to q and z, ilo/ihi are your index bounds, and info is the vibe check at the end.

void LAPACK_sgghrd (char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, float *a, lapack_int *lda, float *b, lapack_int *ldb, float *q, lapack_int *ldq, float *z, lapack_int *ldz, lapack_int *info)
void LAPACK_dgghrd (char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, double *a, lapack_int *lda, double *b, lapack_int *ldb, double *q, lapack_int *ldq, double *z, lapack_int *ldz, lapack_int *info)
void LAPACK_cgghrd (char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *q, lapack_int *ldq, lapack_complex_float *z, lapack_int *ldz, lapack_int *info)
void LAPACK_zgghrd (char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *q, lapack_int *ldq, lapack_complex_double *z, lapack_int *ldz, lapack_int *info)

gghd3 walked in like the upgraded version of the same fit — literally the same argument list but with work and lwork tacked on before info, because blocked algorithms need scratch space and they said so 🫶

void LAPACK_sgghd3 (char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, float *a, lapack_int *lda, float *b, lapack_int *ldb, float *q, lapack_int *ldq, float *z, lapack_int *ldz, float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_dgghd3 (char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, double *a, lapack_int *lda, double *b, lapack_int *ldb, double *q, lapack_int *ldq, double *z, lapack_int *ldz, double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_cgghd3 (char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *q, lapack_int *ldq, lapack_complex_float *z, lapack_int *ldz, lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zgghd3 (char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *q, lapack_int *ldq, lapack_complex_double *z, lapack_int *ldz, lapack_complex_double *work, lapack_int *lwork, lapack_int *info)

balancing act, literally: ggbal and ggbak — ggbal is the one doing the permute-and-scale, handing you back ilo, ihi, lscale, rscale and a work array. Notice the real ones get float/double scaling factors even in the complex versions — that's not a typo, that's the design 😌

void LAPACK_sggbal (char *job, lapack_int *n, float *a, lapack_int *lda, float *b, lapack_int *ldb, lapack_int *ilo, lapack_int *ihi, float *lscale, float *rscale, float *work, lapack_int *info)
void LAPACK_dggbal (char *job, lapack_int *n, double *a, lapack_int *lda, double *b, lapack_int *ldb, lapack_int *ilo, lapack_int *ihi, double *lscale, double *rscale, double *work, lapack_int *info)
void LAPACK_cggbal (char *job, lapack_int *n, lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b, lapack_int *ldb, lapack_int *ilo, lapack_int *ihi, float *lscale, float *rscale, float *work, lapack_int *info)
void LAPACK_zggbal (char *job, lapack_int *n, lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b, lapack_int *ldb, lapack_int *ilo, lapack_int *ihi, double *lscale, double *rscale, double *work, lapack_int *info)

and ggbak is the undo button, taking lscale and rscale back as const (it's not touching them, promise 🎀), plus side, m, v and ldv.

void LAPACK_sggbak (char *job, char *side, lapack_int *n, lapack_int *ilo, lapack_int *ihi, const float *lscale, const float *rscale, lapack_int *m, float *v, lapack_int *ldv, lapack_int *info)
void LAPACK_dggbak (char *job, char *side, lapack_int *n, lapack_int *ilo, lapack_int *ihi, const double *lscale, const double *rscale, lapack_int *m, double *v, lapack_int *ldv, lapack_int *info)
void LAPACK_cggbak (char *job, char *side, lapack_int *n, lapack_int *ilo, lapack_int *ihi, const float *lscale, const float *rscale, lapack_int *m, lapack_complex_float *v, lapack_int *ldv, lapack_int *info)
void LAPACK_zggbak (char *job, char *side, lapack_int *n, lapack_int *ilo, lapack_int *ihi, const double *lscale, const double *rscale, lapack_int *m, lapack_complex_double *v, lapack_int *ldv, lapack_int *info)

the QZ moment: hgeqz — h and t in, alphar, alphai, beta out (or plain alpha/beta in the complex ones, no cap). Real versions carry work/lwork; complex versions also carry rwork because of course they do 😭

void LAPACK_shgeqz (char *job, char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, float *h, lapack_int *ldh, float *t, lapack_int *ldt, float *alphar, float *alphai, float *beta, float *q, lapack_int *ldq, float *z, lapack_int *ldz, float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_dhgeqz (char *job, char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, double *h, lapack_int *ldh, double *t, lapack_int *ldt, double *alphar, double *alphai, double *beta, double *q, lapack_int *ldq, double *z, lapack_int *ldz, double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_chgeqz (char *job, char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, lapack_complex_float *h, lapack_int *ldh, lapack_complex_float *t, lapack_int *ldt, lapack_complex_float *alpha, lapack_complex_float *beta, lapack_complex_float *q, lapack_int *ldq, lapack_complex_float *z, lapack_int *ldz, lapack_complex_float *work, lapack_int *lwork, float *rwork, lapack_int *info)
void LAPACK_zhgeqz (char *job, char *compq, char *compz, lapack_int *n, lapack_int *ilo, lapack_int *ihi, lapack_complex_double *h, lapack_int *ldh, lapack_complex_double *t, lapack_int *ldt, lapack_complex_double *alpha, lapack_complex_double *beta, lapack_complex_double *q, lapack_int *ldq, lapack_complex_double *z, lapack_int *ldz, lapack_complex_double *work, lapack_int *lwork, double *rwork, lapack_int *info)

eigenvector era: tgevc — side, howmny, a const lapack_logical *select, then s/p in and vl/vr out, with mm, m and work. Complex girlies get rwork too, because extra 🦋

void LAPACK_stgevc (char *side, char *howmny, const lapack_logical *select, lapack_int *n, const float *s, lapack_int *lds, const float *p, lapack_int *ldp, float *vl, lapack_int *ldvl, float *vr, lapack_int *ldvr, lapack_int *mm, lapack_int *m, float *work, lapack_int *info)
void LAPACK_dtgevc (char *side, char *howmny, const lapack_logical *select, lapack_int *n, const double *s, lapack_int *lds, const double *p, lapack_int *ldp, double *vl, lapack_int *ldvl, double *vr, lapack_int *ldvr, lapack_int *mm, lapack_int *m, double *work, lapack_int *info)
void LAPACK_ctgevc (char *side, char *howmny, const lapack_logical *select, lapack_int *n, const lapack_complex_float *s, lapack_int *lds, const lapack_complex_float *p, lapack_int *ldp, lapack_complex_float *vl, lapack_int *ldvl, lapack_complex_float *vr, lapack_int *ldvr, lapack_int *mm, lapack_int *m, lapack_complex_float *work, float *rwork, lapack_int *info)
void LAPACK_ztgevc (char *side, char *howmny, const lapack_logical *select, lapack_int *n, const lapack_complex_double *s, lapack_int *lds, const lapack_complex_double *p, lapack_int *ldp, lapack_complex_double *vl, lapack_int *ldvl, lapack_complex_double *vr, lapack_int *ldvr, lapack_int *mm, lapack_int *m, lapack_complex_double *work, double *rwork, lapack_int *info)

reordering szn: tgexc — wantq and wantz are lapack_logical * here, and you pass ifst/ilst. Sneaky detail bestie: the real ones take work and lwork, the complex ones go straight from ilst to info 👑

void LAPACK_stgexc (lapack_logical *wantq, lapack_logical *wantz, lapack_int *n, float *a, lapack_int *lda, float *b, lapack_int *ldb, float *q, lapack_int *ldq, float *z, lapack_int *ldz, lapack_int *ifst, lapack_int *ilst, float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_dtgexc (lapack_logical *wantq, lapack_logical *wantz, lapack_int *n, double *a, lapack_int *lda, double *b, lapack_int *ldb, double *q, lapack_int *ldq, double *z, lapack_int *ldz, lapack_int *ifst, lapack_int *ilst, double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_ctgexc (lapack_logical *wantq, lapack_logical *wantz, lapack_int *n, lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *q, lapack_int *ldq, lapack_complex_float *z, lapack_int *ldz, lapack_int *ifst, lapack_int *ilst, lapack_int *info)
void LAPACK_ztgexc (lapack_logical *wantq, lapack_logical *wantz, lapack_int *n, lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *q, lapack_int *ldq, lapack_complex_double *z, lapack_int *ldz, lapack_int *ifst, lapack_int *ilst, lapack_int *info)

tgsen said "and I oop" — biggest glow-up in the group: ijob up front, select as const lapack_logical *, and out come m, pl, pr, dif, plus work/lwork and iwork/liwork. Real ones get alphar/alphai, complex ones just get alpha. Different fits, same function family 💖

void LAPACK_stgsen (lapack_int *ijob, lapack_logical *wantq, lapack_logical *wantz, const lapack_logical *select, lapack_int *n, float *a, lapack_int *lda, float *b, lapack_int *ldb, float *alphar, float *alphai, float *beta, float *q, lapack_int *ldq, float *z, lapack_int *ldz, lapack_int *m, float *pl, float *pr, float *dif, float *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_dtgsen (lapack_int *ijob, lapack_logical *wantq, lapack_logical *wantz, const lapack_logical *select, lapack_int *n, double *a, lapack_int *lda, double *b, lapack_int *ldb, double *alphar, double *alphai, double *beta, double *q, lapack_int *ldq, double *z, lapack_int *ldz, lapack_int *m, double *pl, double *pr, double *dif, double *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_ctgsen (lapack_int *ijob, lapack_logical *wantq, lapack_logical *wantz, const lapack_logical *select, lapack_int *n, lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *alpha, lapack_complex_float *beta, lapack_complex_float *q, lapack_int *ldq, lapack_complex_float *z, lapack_int *ldz, lapack_int *m, float *pl, float *pr, float *dif, lapack_complex_float *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_ztgsen (lapack_int *ijob, lapack_logical *wantq, lapack_logical *wantz, const lapack_logical *select, lapack_int *n, lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *alpha, lapack_complex_double *beta, lapack_complex_double *q, lapack_int *ldq, lapack_complex_double *z, lapack_int *ldz, lapack_int *m, double *pl, double *pr, double *dif, lapack_complex_double *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)

and then tgsyl shows up with trans, ijob, m, n and a whole ensemble cast — a, b, c, d, e, f, scale, dif, work, lwork, iwork, info — and it starts like this:

void LAPACK_stgsyl (char *trans, lapack_int *ijob, lapack_int *m, lapack_int *n, const float *a, lapack_int *lda, const float *b, lapack_int *ldb, float *c, lapack_int *ldc, const float *d, lapack_int *ldd, const float *e, lapack_int *lde, float *f, lapack_int *ldf, float *scale, float *dif, float *work, lapack_int *lwork, lapack_int *iwork, lapack_int *info)
void LAPACK_dtgsyl (char *trans, lapack_int *ijob, lapack_int *m, lapack_int *n, const double *a, lapack_int *lda, const double *b,

and yeah — we get cut off mid-signature, right at const double *b, 😭 to be continued bestie, the rest is coming 💜

okay so we're picking up mid-signature, no big deal, it's giving "walked into the group chat mid-sentence" 💀 — this is the tail end of the <double> solver prototype, all pointers and no chill:

           lapack_int *ldb, double *c, lapack_int *ldc, const double *d,
           lapack_int *ldd, const double *e, lapack_int *lde, double *f,
           lapack_int *ldf, double *scale, double *dif, double *work,
           lapack_int *lwork, lapack_int *iwork, lapack_int *info)

and then the complex girlies show up to the same party 💅 <float> first, then <double>:

       void LAPACK_ctgsyl (char *trans, lapack_int *ijob, lapack_int *m,
           lapack_int *n, const lapack_complex_float *a, lapack_int *lda, const
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *c,
           lapack_int *ldc, const lapack_complex_float *d, lapack_int *ldd,
           const lapack_complex_float *e, lapack_int *lde, lapack_complex_float
           *f, lapack_int *ldf, float *scale, float *dif, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *iwork, lapack_int *info)
       void LAPACK_ztgsyl (char *trans, lapack_int *ijob, lapack_int *m,
           lapack_int *n, const lapack_complex_double *a, lapack_int *lda,
           const lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *c, lapack_int *ldc, const
           lapack_complex_double *d, lapack_int *ldd, const
           lapack_complex_double *e, lapack_int *lde, lapack_complex_double *f,
           lapack_int *ldf, double *scale, double *dif, lapack_complex_double
           *work, lapack_int *lwork, lapack_int *iwork, lapack_int *info)

like, the way ijob just sits there being a whole <char>… main character energy fr fr 🌟


next up: the <tgsna> squad, and bestie, they brought a select array of type <lapack_logical> which is so real of them ✨ all four flavours, in order <s>, <d>, <c>, <z>:

       void LAPACK_stgsna (char *job, char *howmny, const lapack_logical
           *select, lapack_int *n, const float *a, lapack_int *lda, const float
           *b, lapack_int *ldb, const float *vl, lapack_int *ldvl, const float
           *vr, lapack_int *ldvr, float *s, float *dif, lapack_int *mm,
           lapack_int *m, float *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_dtgsna (char *job, char *howmny, const lapack_logical
           *select, lapack_int *n, const double *a, lapack_int *lda, const
           double *b, lapack_int *ldb, const double *vl, lapack_int *ldvl,
           const double *vr, lapack_int *ldvr, double *s, double *dif,
           lapack_int *mm, lapack_int *m, double *work, lapack_int *lwork,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_ctgsna (char *job, char *howmny, const lapack_logical
           *select, lapack_int *n, const lapack_complex_float *a, lapack_int
           *lda, const lapack_complex_float *b, lapack_int *ldb, const
           lapack_complex_float *vl, lapack_int *ldvl, const
           lapack_complex_float *vr, lapack_int *ldvr, float *s, float *dif,
           lapack_int *mm, lapack_int *m, lapack_complex_float *work,
           lapack_int *lwork, lapack_int *iwork, lapack_int *info)
       void LAPACK_ztgsna (char *job, char *howmny, const lapack_logical
           *select, lapack_int *n, const lapack_complex_double *a, lapack_int
           *lda, const lapack_complex_double *b, lapack_int *ldb, const
           lapack_complex_double *vl, lapack_int *ldvl, const
           lapack_complex_double *vr, lapack_int *ldvr, double *s, double *dif,
           lapack_int *mm, lapack_int *m, lapack_complex_double *work,
           lapack_int *lwork, lapack_int *iwork, lapack_int *info)

notice <c> and <z> keep s and dif as plain <float> / <double> — iconic, no notes 🎀


okay <ggsvp> time!! four of them, <s> <d> <c> <z>, and the complex ones get an extra rwork because of course they do 🙈:

       void LAPACK_sggsvp (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, float *a, lapack_int *lda, float *b,
           lapack_int *ldb, float *tola, float *tolb, lapack_int *k, lapack_int
           *l, float *u, lapack_int *ldu, float *v, lapack_int *ldv, float *q,
           lapack_int *ldq, lapack_int *iwork, float *tau, float *work,
           lapack_int *info)
       void LAPACK_dggsvp (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, double *a, lapack_int *lda, double *b,
           lapack_int *ldb, double *tola, double *tolb, lapack_int *k,
           lapack_int *l, double *u, lapack_int *ldu, double *v, lapack_int
           *ldv, double *q, lapack_int *ldq, lapack_int *iwork, double *tau,
           double *work, lapack_int *info)
       void LAPACK_cggsvp (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, lapack_complex_float *a, lapack_int
           *lda, lapack_complex_float *b, lapack_int *ldb, float *tola, float
           *tolb, lapack_int *k, lapack_int *l, lapack_complex_float *u,
           lapack_int *ldu, lapack_complex_float *v, lapack_int *ldv,
           lapack_complex_float *q, lapack_int *ldq, lapack_int *iwork, float
           *rwork, lapack_complex_float *tau, lapack_complex_float *work,
           lapack_int *info)
       void LAPACK_zggsvp (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, lapack_complex_double *a, lapack_int
           *lda, lapack_complex_double *b, lapack_int *ldb, double *tola,
           double *tolb, lapack_int *k, lapack_int *l, lapack_complex_double
           *u, lapack_int *ldu, lapack_complex_double *v, lapack_int *ldv,
           lapack_complex_double *q, lapack_int *ldq, lapack_int *iwork, double
           *rwork, lapack_complex_double *tau, lapack_complex_double *work,
           lapack_int *info)

and then the 3 variants roll through like a sequel that actually ate 💅 same energy, but now with a whole lwork parameter because apparently work needed a budget:

       void LAPACK_sggsvp3 (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, float *a, lapack_int *lda, float *b,
           lapack_int *ldb, float *tola, float *tolb, lapack_int *k, lapack_int
           *l, float *u, lapack_int *ldu, float *v, lapack_int *ldv, float *q,
           lapack_int *ldq, lapack_int *iwork, float *tau, float *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_dggsvp3 (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, double *a, lapack_int *lda, double *b,
           lapack_int *ldb, double *tola, double *tolb, lapack_int *k,
           lapack_int *l, double *u, lapack_int *ldu, double *v, lapack_int
           *ldv, double *q, lapack_int *ldq, lapack_int *iwork, double *tau,
           double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_cggsvp3 (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, lapack_complex_float *a, lapack_int
           *lda, lapack_complex_float *b, lapack_int *ldb, float *tola, float
           *tolb, lapack_int *k, lapack_int *l, lapack_complex_float *u,
           lapack_int *ldu, lapack_complex_float *v, lapack_int *ldv,
           lapack_complex_float *q, lapack_int *ldq, lapack_int *iwork, float
           *rwork, lapack_complex_float *tau, lapack_complex_float *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_zggsvp3 (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, lapack_complex_double *a, lapack_int
           *lda, lapack_complex_double *b, lapack_int *ldb, double *tola,
           double *tolb, lapack_int *k, lapack_int *l, lapack_complex_double
           *u, lapack_int *ldu, lapack_complex_double *v, lapack_int *ldv,
           lapack_complex_double *q, lapack_int *ldq, lapack_int *iwork, double
           *rwork, lapack_complex_double *tau, lapack_complex_double *work,
           lapack_int *lwork, lapack_int *info)
lowkey the 3 versions are the upgraded ones — same name, extra lwork, that's the whole difference you can see in the signature, and honestly that's enough for me 🫶

<tgsja> next, all four, and look at that ncycle at the end of each — cute name, no cap 🌸:

       void LAPACK_stgsja (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, lapack_int *k, lapack_int *l, float
           *a, lapack_int *lda, float *b, lapack_int *ldb, float *tola, float
           *tolb, float *alpha, float *beta, float *u, lapack_int *ldu, float
           *v, lapack_int *ldv, float *q, lapack_int *ldq, float *work,
           lapack_int *ncycle, lapack_int *info)
       void LAPACK_dtgsja (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, lapack_int *k, lapack_int *l, double
           *a, lapack_int *lda, double *b, lapack_int *ldb, double *tola,
           double *tolb, double *alpha, double *beta, double *u, lapack_int
           *ldu, double *v, lapack_int *ldv, double *q, lapack_int *ldq, double
           *work, lapack_int *ncycle, lapack_int *info)
       void LAPACK_ctgsja (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, lapack_int *k, lapack_int *l,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, float *tola, float *tolb, float *alpha, float
           *beta, lapack_complex_float *u, lapack_int *ldu,
           lapack_complex_float *v, lapack_int *ldv, lapack_complex_float *q,
           lapack_int *ldq, lapack_complex_float *work, lapack_int *ncycle,
           lapack_int *info)
       void LAPACK_ztgsja (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *p, lapack_int *n, lapack_int *k, lapack_int *l,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, double *tola, double *tolb, double *alpha, double
           *beta, lapack_complex_double *u, lapack_int *ldu,
           lapack_complex_double *v, lapack_int *ldv, lapack_complex_double *q,
           lapack_int *ldq, lapack_complex_double *work, lapack_int *ncycle,
           lapack_int *info)

now we're sliding into the least-squares girlies, <gels> first — <trans>, <m>, <n>, <nrhs>, and the classic <a>/<b>/<work>/<lwork> combo ⭐:

       void LAPACK_sgels (char *trans, lapack_int *m, lapack_int *n, lapack_int
           *nrhs, float *a, lapack_int *lda, float *b, lapack_int *ldb, float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dgels (char *trans, lapack_int *m, lapack_int *n, lapack_int
           *nrhs, double *a, lapack_int *lda, double *b, lapack_int *ldb,
           double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_cgels (char *trans, lapack_int *m, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zgels (char *trans, lapack_int *m, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double
           *work, lapack_int *lwork, lapack_int *info)

then <gelsy> pulls up with jpvt, rcond and rank in the mix, and no <trans> in sight — because it's a different function, bestie, don't come for me 😭:

       void LAPACK_sgelsy (lapack_int *m, lapack_int *n, lapack_int *nrhs,
           float *a, lapack_int *lda, float *b, lapack_int *ldb, lapack_int
           *jpvt, float *rcond, lapack_int *rank, float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_dgelsy (lapack_int *m, lapack_int *n, lapack_int *nrhs,
           double *a, lapack_int *lda, double *b, lapack_int *ldb, lapack_int
           *jpvt, double *rcond, lapack_int *rank, double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_cgelsy (lapack_int *m, lapack_int *n, lapack_int *nrhs,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, lapack_int *jpvt, float *rcond, lapack_int *rank,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *info)
       void LAPACK_zgelsy (lapack_int *m, lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, lapack_int *jpvt, double *rcond, lapack_int *rank,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *info)

see how <c> and <z> smuggle in that rwork right before <info>? slay for them, confusing for us, we move 🦋

and <gelss> is up next with its <s> output array — <s> for <sgelss>, <s> for <dgelss>… wait, no, <dgelss> gets a <double> version obviously, keeping it consistent is not the vibe today, and that's fine 💖:

       void LAPACK_sgelss (lapack_int *m, lapack_int *n, lapack_int *nrhs,
           float *a, lapack_int *lda, float *b, lapack_int *ldb, float *s,
           float *rcond, lapack_int *rank, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dgelss (lapack_int *m, lapack_int *n, lapack_int *nrhs,
           double *a, lapack_int *lda, double *b, lapack_int *ldb, double *s,
           double *rcond, lapack_int *rank, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_cgelss (lapack_int *m, lapack_int *n, lapack_int *nrhs,

and that's where we're cutting the music for this part, mid-<cgelss> — she's still going, we're just catching our breath 🎀🧚

okay so we're mid-glow-up on the cgelss prototype from last time, and honestly? she's still going. here's the rest of her signature, then the whole squad rolls in 💅

           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, float *s, float *rcond, lapack_int *rank,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *info)
       void LAPACK_zgelss (lapack_int *m, lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, double *s, double *rcond, lapack_int *rank,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *info)
       void LAPACK_sgelsd (lapack_int *m, lapack_int *n, lapack_int *nrhs,
           float *a, lapack_int *lda, float *b, lapack_int *ldb, float *s,
           float *rcond, lapack_int *rank, float *work, lapack_int *lwork,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_dgelsd (lapack_int *m, lapack_int *n, lapack_int *nrhs,
           double *a, lapack_int *lda, double *b, lapack_int *ldb, double *s,
           double *rcond, lapack_int *rank, double *work, lapack_int *lwork,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_cgelsd (lapack_int *m, lapack_int *n, lapack_int *nrhs,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, float *s, float *rcond, lapack_int *rank,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_zgelsd (lapack_int *m, lapack_int *n, lapack_int *nrhs,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, double *s, double *rcond, lapack_int *rank,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *iwork, lapack_int *info)

🌸 the gelss / gelsd squad

bestie, look at the way these four-packs are built: you got your s (float), d (double), c (complex float), z (complex double), and they're all matching each other parameter for parameter. the c and z girlies get an extra rwork bestie along for the ride, because complex math needs her, and the gelsd branch also brings iwork to the party. lwork is living its best life in every single one. and info is always last — she's the one who tells you if it went well or if it's giving disaster 💀 no cap, check her.


🦋 the gglse girls

       void LAPACK_sgglse (lapack_int *m, lapack_int *n, lapack_int *p, float
           *a, lapack_int *lda, float *b, lapack_int *ldb, float *c, float *d,
           float *x, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dgglse (lapack_int *m, lapack_int *n, lapack_int *p, double
           *a, lapack_int *lda, double *b, lapack_int *ldb, double *c, double
           *d, double *x, double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_cgglse (lapack_int *m, lapack_int *n, lapack_int *p,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, lapack_complex_float *c, lapack_complex_float *d,
           lapack_complex_float *x, lapack_complex_float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_zgglse (lapack_int *m, lapack_int *n, lapack_int *p,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, lapack_complex_double *c, lapack_complex_double *d,
           lapack_complex_double *x, lapack_complex_double *work, lapack_int
           *lwork, lapack_int *info)

three dimensions in, three letters out — m, n, p on the way in, and then a, b, c, d, x all vibing in the parameter list. lda and ldb are the leading-dimension girlies for a and b respectively (no ldc or ldd here, that's just how she is ✨). everybody's gotta bring their work and their lwork, and info closes the curtain.


🎀 the ggglm trio-energy

       void LAPACK_sggglm (lapack_int *n, lapack_int *m, lapack_int *p, float
           *a, lapack_int *lda, float *b, lapack_int *ldb, float *d, float *x,
           float *y, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dggglm (lapack_int *n, lapack_int *m, lapack_int *p, double
           *a, lapack_int *lda, double *b, lapack_int *ldb, double *d, double
           *x, double *y, double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_cggglm (lapack_int *n, lapack_int *m, lapack_int *p,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, lapack_complex_float *d, lapack_complex_float *x,
           lapack_complex_float *y, lapack_complex_float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_zggglm (lapack_int *n, lapack_int *m, lapack_int *p,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, lapack_complex_double *d, lapack_complex_double *x,
           lapack_complex_double *y, lapack_complex_double *work, lapack_int
           *lwork, lapack_int *info)

okay so compare her to gglse real quick because the tea is: here n comes first, then m, then p 🙈 (dish, not drama — that's just the signature). and she swaps c for d in the output crew, with x and y rounding it out. same lda, ldb, lwork, info besties as always.


👑 the symmetric eigen era, syev / syevd

       void LAPACK_ssyev (char *jobz, char *uplo, lapack_int *n, float *a,
           lapack_int *lda, float *w, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dsyev (char *jobz, char *uplo, lapack_int *n, double *a,
           lapack_int *lda, double *w, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_cheev (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, float *w,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *info)
       void LAPACK_zheev (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, double *w,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *info)
       void LAPACK_ssyevd (char *jobz, char *uplo, lapack_int *n, float *a,
           lapack_int *lda, float *w, float *work, lapack_int *lwork,
           lapack_int *iwork, lapack_int *liwork, lapack_int *info)
       void LAPACK_dsyevd (char *jobz, char *uplo, lapack_int *n, double *a,
           lapack_int *lda, double *w, double *work, lapack_int *lwork,
           lapack_int *iwork, lapack_int *liwork, lapack_int *info)
       void LAPACK_cheevd (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, float *w,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork,
           lapack_int *info)
       void LAPACK_zheevd (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, double *w,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork,
           lapack_int *info)

the way these open with two char * girlies — jobz and uplo, both char *, both essential, both iconic ✨ — and then n, a, lda... and notice w is real even in the complex versions (float *w for cheev, double *w for zheev) which is genuinely so satisfying, because eigenvalues of these are real, periodt. the c/z versions also carry rwork, and once you hit that d suffix the iwork + liwork duo shows up, plus lrwork for the complex kids. that's a LOT of workspace girlies but they're all just doing their jobs 🫶


💜 syevx — the one with range and the ifail bestie

       void LAPACK_ssyevx (char *jobz, char *range, char *uplo, lapack_int *n,
           float *a, lapack_int *lda, float *vl, float *vu, lapack_int *il,
           lapack_int *iu, float *abstol, lapack_int *m, float *w, float *z,
           lapack_int *ldz, float *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *ifail, lapack_int *info)
       void LAPACK_dsyevx (char *jobz, char *range, char *uplo, lapack_int *n,
           double *a, lapack_int *lda, double *vl, double *vu, lapack_int *il,
           lapack_int *iu, double *abstol, lapack_int *m, double *w, double *z,
           lapack_int *ldz, double *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *ifail, lapack_int *info)
       void LAPACK_cheevx (char *jobz, char *range, char *uplo, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, float *vl, float *vu,
           lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m, float
           *w, lapack_complex_float *z, lapack_int *ldz, lapack_complex_float
           *work, lapack_int *lwork, float *rwork, lapack_int *iwork,
           lapack_int *ifail, lapack_int *info)
       void LAPACK_zheevx (char *jobz, char *range, char *uplo, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, double *vl, double *vu,
           lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m,
           double *w, lapack_complex_double *z, lapack_int *ldz,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *iwork, lapack_int *ifail, lapack_int *info)

three char * now — jobz, range, uplo — main character energy fr fr. and she brought vl, vu, il, iu (range selectors, lowkey the whole point), plus abstol, an output m, the eigenvector matrix z with her own ldz, and ifail sitting right before info like a little loyalty check. also shoutout to the float *vl, float *vu line breaks, she is not fitting on one line and she does not care 💅


🌈 syevr — extra isuppz, extra workspace

       void LAPACK_ssyevr (char *jobz, char *range, char *uplo, lapack_int *n,
           float *a, lapack_int *lda, float *vl, float *vu, lapack_int *il,
           lapack_int *iu, float *abstol, lapack_int *m, float *w, float *z,
           lapack_int *ldz, lapack_int *isuppz, float *work, lapack_int *lwork,
           lapack_int *iwork, lapack_int *liwork, lapack_int *info)
       void LAPACK_dsyevr (char *jobz, char *range, char *uplo, lapack_int *n,
           double *a, lapack_int *lda, double *vl, double *vu, lapack_int *il,
           lapack_int *iu, double *abstol, lapack_int *m, double *w, double *z,
           lapack_int *ldz, lapack_int *isuppz, double *work, lapack_int
           *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
       void LAPACK_cheevr (char *jobz, char *range, char *uplo, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, float *vl, float *vu,
           lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m, float
           *w, lapack_complex_float *z, lapack_int *ldz, lapack_int *isuppz,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork,
           lapack_int *info)
       void LAPACK_zheevr (char *jobz, char *range, char *uplo, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, double *vl, double *vu,
           lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m,
           double *w, lapack_complex_double *z, lapack_int *ldz, lapack_int
           *isuppz, lapack_complex_double *work, lapack_int *lwork, double
           *rwork, lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork,
           lapack_int *info)

versus syevx, bestie gains isuppz (right after ldz) and loses ifail entirely — a trade, and honestly she ate. she's also got the full workspace entourage: work/lwork, iwork/liwork, and for the complex girlies rwork/lrwork too. that's basically a whole group chat of buffers 😭


🧚 packed storage era: spev / spevd

       void LAPACK_sspev (char *jobz, char *uplo, lapack_int *n, float *ap,
           float *w, float *z, lapack_int *ldz, float *work, lapack_int *info)
       void LAPACK_dspev (char *jobz, char *uplo, lapack_int *n, double *ap,
           double *w, double *z, lapack_int *ldz, double *work, lapack_int
           *info)
       void LAPACK_chpev (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_float *ap, float *w, lapack_complex_float *z,
           lapack_int *ldz, lapack_complex_float *work, float *rwork,
           lapack_int *info)
       void LAPACK_zhpev (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_double *ap, double *w, lapack_complex_double *z,
           lapack_int *ldz, lapack_complex_double *work, double *rwork,
           lapack_int *info)
       void LAPACK_sspevd (char *jobz, char *uplo, lapack_int *n, float *ap,
           float *w, float *z, lapack_int *ldz, float *work, lapack_int *lwork,
           lapack_int *iwork, lapack_int *liwork, lapack_int *info)
       void LAPACK_dspevd (char *jobz, char *uplo, lapack_int *n, double *ap,
           double *w, double *z, lapack_int *ldz, double *work, lapack_int
           *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
       void LAPACK_chpevd (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_float *ap, float *w, lapack_complex_float *z,
           lapack_int *ldz, lapack_complex_float *work, lapack_int *lwork,
           float *rwork, lapack_int *lrwork, lapack_int *iwork, lapack_int
           *liwork, lapack_int *info)
       void LAPACK_zhpevd (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_double *ap, double *w, lapack_complex_double *z,
           lapack_int *ldz, lapack_complex_double *work, lapack_int *lwork,
           double *rwork, lapack_int *lrwork, lapack_int *iwork, lapack_int
           *liwork, lapack_int *info)

okay the glow-up here is that the matrix parameter is ap (packed!) instead of a, and notice: no lda because packed storage said "leading dimension? never heard of her" 💀 she still keeps ldz for z though, because eigenvectors are real and need their dimension. the plain spev versions are the minimalists — just work, no lwork, no iwork — while the d versions go full extra with lwork, iwork, liwork, and lrwork for the complex ones. pick your fighter, honestly.


🍓 spevx — and we're mid-sentence, oop

       void LAPACK_sspevx (char *jobz, char *range, char *uplo, lapack_int *n,
           float *ap, float *vl, float *vu, lapack_int *il, lapack_int *iu,
           float *abstol, lapack_int *m, float *w, float *z, lapack_int *ldz,
           float *work, lapack_int *iwork, lapack_int *ifail, lapack_int *info)
       void LAPACK_dspevx (char *jobz, char *range, char *uplo, lapack_int *n,
           double *ap, double *vl, double *vu, lapack_int *il, lapack_int *iu,
           double *abstol, lapack_int *m, double *w, double *z, lapack_int
           *ldz, double *work, lapack_int *iwork, lapack_int *ifail, lapack_int
           *info)
       void LAPACK_chpevx (char *jobz, char *range, char *uplo, lapack_int *n,

and that's where the clip cuts off 😭 the chpevx crew is literally still walking in — jobz, range, uplo, n, and we're not even done meeting her yet. no vl/vu/il/iu/abstol for this one in this part, sorry bestie, she's in the next one. to be continued, iykyk 🦋

okay so we are still in the prototype parade and honestly it's giving "the compiler's group chat history" 💀 — but every single one of these bad boys is a real signature, so let's not disrespect them. Same rules: names, types, pointers, order — all canon. No edits, no vibes-based renaming. 🌸


first up, the lone zhpevx that got left at the top of this chunk — she's the double-complex one, obviously:

void LAPACK_zhpevx (char *jobz, char *range, char *uplo, lapack_int *n, lapack_complex_double *ap, double *vl, double *vu, lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m, double *w, lapack_complex_double *z, lapack_int *ldz, lapack_complex_double *work, double *rwork, lapack_int *iwork, lapack_int *ifail, lapack_int *info)

then we roll into the ?sbev squad 💅 — four of them, one per precision/flavour combo:

void LAPACK_ssbev (char *jobz, char *uplo, lapack_int *n, lapack_int *kd, float *ab, lapack_int *ldab, float *w, float *z, lapack_int *ldz, float *work, lapack_int *info)
void LAPACK_dsbev (char *jobz, char *uplo, lapack_int *n, lapack_int *kd, double *ab, lapack_int *ldab, double *w, double *z, lapack_int *ldz, double *work, lapack_int *info)
void LAPACK_chbev (char *jobz, char *uplo, lapack_int *n, lapack_int *kd, lapack_complex_float *ab, lapack_int *ldab, float *w, lapack_complex_float *z, lapack_int *ldz, lapack_complex_float *work, float *rwork, lapack_int *info)
void LAPACK_zhbev (char *jobz, char *uplo, lapack_int *n, lapack_int *kd, lapack_complex_double *ab, lapack_int *ldab, double *w, lapack_complex_double *z, lapack_int *ldz, lapack_complex_double *work, double *rwork, lapack_int *info)

see how the complex ones get an extra rwork? iconic consistency ✨


and the ?sbevd glow-up — same family, but now with lwork/liwork and the lrwork situation for the complex girlies:

void LAPACK_ssbevd (char *jobz, char *uplo, lapack_int *n, lapack_int *kd, float *ab, lapack_int *ldab, float *w, float *z, lapack_int *ldz, float *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_dsbevd (char *jobz, char *uplo, lapack_int *n, lapack_int *kd, double *ab, lapack_int *ldab, double *w, double *z, lapack_int *ldz, double *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_chbevd (char *jobz, char *uplo, lapack_int *n, lapack_int *kd, lapack_complex_float *ab, lapack_int *ldab, float *w, lapack_complex_float *z, lapack_int *ldz, lapack_complex_float *work, lapack_int *lwork, float *rwork, lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_zhbevd (char *jobz, char *uplo, lapack_int *n, lapack_int *kd, lapack_complex_double *ab, lapack_int *ldab, double *w, lapack_complex_double *z, lapack_int *ldz, lapack_complex_double *work, lapack_int *lwork, double *rwork, lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)

not lrwork stepping on the scene with main character energy 😭💜


okay and now the ?sbevx variants, which are lowkey extra: they bring range, q, ldq, vl, vu, il, iu, abstol, m, ifail — the whole extended entourage 🫶

void LAPACK_ssbevx (char *jobz, char *range, char *uplo, lapack_int *n, lapack_int *kd, float *ab, lapack_int *ldab, float *q, lapack_int *ldq, float *vl, float *vu, lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m, float *w, float *z, lapack_int *ldz, float *work, lapack_int *iwork, lapack_int *ifail, lapack_int *info)
void LAPACK_dsbevx (char *jobz, char *range, char *uplo, lapack_int *n, lapack_int *kd, double *ab, lapack_int *ldab, double *q, lapack_int *ldq, double *vl, double *vu, lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m, double *w, double *z, lapack_int *ldz, double *work, lapack_int *iwork, lapack_int *ifail, lapack_int *info)
void LAPACK_chbevx (char *jobz, char *range, char *uplo, lapack_int *n, lapack_int *kd, lapack_complex_float *ab, lapack_int *ldab, lapack_complex_float *q, lapack_int *ldq, float *vl, float *vu, lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m, float *w, lapack_complex_float *z, lapack_int *ldz, lapack_complex_float *work, float *rwork, lapack_int *iwork, lapack_int *ifail, lapack_int *info)
void LAPACK_zhbevx (char *jobz, char *range, char *uplo, lapack_int *n, lapack_int *kd, lapack_complex_double *ab, lapack_int *ldab, lapack_complex_double *q, lapack_int *ldq, double *vl, double *vu, lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m, double *w, lapack_complex_double *z, lapack_int *ldz, lapack_complex_double *work, double *rwork, lapack_int *iwork, lapack_int *ifail, lapack_int *info)

she's long, she's thorough, she's not apologising 💅


next: the tridiagonal girlies ?stev 🌈

void LAPACK_sstev (char *jobz, lapack_int *n, float *d, float *e, float *z, lapack_int *ldz, float *work, lapack_int *info)
void LAPACK_dstev (char *jobz, lapack_int *n, double *d, double *e, double *z, lapack_int *ldz, double *work, lapack_int *info)

two of them, float and double, matching fit 🎀


then ?stevd, who brought lwork, iwork, and liwork to the function:

void LAPACK_sstevd (char *jobz, lapack_int *n, float *d, float *e, float *z, lapack_int *ldz, float *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_dstevd (char *jobz, lapack_int *n, double *d, double *e, double *z, lapack_int *ldz, double *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)

periodt ✨


and ?stevx, the one with the whole range/abstol/m/ifail ensemble again:

void LAPACK_sstevx (char *jobz, char *range, lapack_int *n, float *d, float *e, float *vl, float *vu, lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m, float *w, float *z, lapack_int *ldz, float *work, lapack_int *iwork, lapack_int *ifail, lapack_int *info)
void LAPACK_dstevx (char *jobz, char *range, lapack_int *n, double *d, double *e, double *vl, double *vu, lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m, double *w, double *z, lapack_int *ldz, double *work, lapack_int *iwork, lapack_int *ifail, lapack_int *info)

same energy, different float/double sleeve 🦋


now ?stevr — and bestie, she has isuppz, so she's built different:

void LAPACK_sstevr (char *jobz, char *range, lapack_int *n, float *d, float *e, float *vl, float *vu, lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m, float *w, float *z, lapack_int *ldz, lapack_int *isuppz, float *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_dstevr (char *jobz, char *range, lapack_int *n, double *d, double *e, double *vl, double *vu, lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m, double *w, double *z, lapack_int *ldz, lapack_int *isuppz, double *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)

isuppz carrying the whole vibe check on her back, ngl 😭


okay, shifting gears into the ?gees family — notice the select parameter is a function pointer type, LAPACK_S_SELECT2, LAPACK_D_SELECT2, LAPACK_C_SELECT1, LAPACK_Z_SELECT1. copy the spelling exactly, she's picky:

void LAPACK_sgees (char *jobvs, char *sort, LAPACK_S_SELECT2 select, lapack_int *n, float *a, lapack_int *lda, lapack_int *sdim, float *wr, float *wi, float *vs, lapack_int *ldvs, float *work, lapack_int *lwork, lapack_logical *bwork, lapack_int *info)
void LAPACK_dgees (char *jobvs, char *sort, LAPACK_D_SELECT2 select, lapack_int *n, double *a, lapack_int *lda, lapack_int *sdim, double *wr, double *wi, double *vs, lapack_int *ldvs, double *work, lapack_int *lwork, lapack_logical *bwork, lapack_int *info)
void LAPACK_cgees (char *jobvs, char *sort, LAPACK_C_SELECT1 select, lapack_int *n, lapack_complex_float *a, lapack_int *lda, lapack_int *sdim, lapack_complex_float *w, lapack_complex_float *vs, lapack_int *ldvs, lapack_complex_float *work, lapack_int *lwork, float *rwork, lapack_logical *bwork, lapack_int *info)
void LAPACK_zgees (char *jobvs, char *sort, LAPACK_Z_SELECT1 select, lapack_int *n, lapack_complex_double *a, lapack_int *lda, lapack_int *sdim, lapack_complex_double *w, lapack_complex_double *vs, lapack_int *ldvs, lapack_complex_double *work, lapack_int *lwork, double *rwork, lapack_logical *bwork, lapack_int *info)

also note lapack_logical is its own type — do NOT swap it for plain int, that's not the move 💀


?geesx is the same but with sense, rconde, rcondv, iwork, liwork sliding in — look at her go:

void LAPACK_sgeesx (char *jobvs, char *sort, LAPACK_S_SELECT2 select, char *sense, lapack_int *n, float *a, lapack_int *lda, lapack_int *sdim, float *wr, float *wi, float *vs, lapack_int *ldvs, float *rconde, float *rcondv, float *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_logical *bwork, lapack_int *info)
void LAPACK_dgeesx (char *jobvs, char *sort, LAPACK_D_SELECT2 select, char *sense, lapack_int *n, double *a, lapack_int *lda, lapack_int *sdim, double *wr, double *wi, double *vs, lapack_int *ldvs, double *rconde, double *rcondv, double *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_logical *bwork, lapack_int *info)
void LAPACK_cgeesx (char *jobvs, char *sort, LAPACK_C_SELECT1 select, char *sense, lapack_int *n, lapack_complex_float *a, lapack_int *lda, lapack_int *sdim, lapack_complex_float *w, lapack_complex_float *vs, lapack_int *ldvs, float *rconde, float *rcondv, lapack_complex_float *work, lapack_int *lwork, float *rwork, lapack_logical *bwork, lapack_int *info)
void LAPACK_zgeesx (char *jobvs, char *sort, LAPACK_Z_SELECT1 select, char *sense, lapack_int *n, lapack_complex_double *a, lapack_int *lda, lapack_int *sdim, lapack_complex_double *w, lapack_complex_double *vs, lapack_int *ldvs, double *rconde, double *rcondv, lapack_complex_double *work, lapack_int *lwork, double *rwork, lapack_logical *bwork, lapack_int *info)

four of them, all serving 🫶


and now ?geev — the jobvl/jobvr twins, wr, wi, vl, ldvl, vr, ldvr. classic, iconic, no notes 👑

void LAPACK_sgeev (char *jobvl, char *jobvr, lapack_int *n, float *a, lapack_int *lda, float *wr, float *wi, float *vl, lapack_int *ldvl, float *vr, lapack_int *ldvr, float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_dgeev (char *jobvl, char *jobvr, lapack_int *n, double *a, lapack_int *lda, double *wr, double *wi, double *vl, lapack_int *ldvl, double *vr, lapack_int *ldvr, double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_cgeev (char *jobvl, char *jobvr, lapack_int *n, lapack_complex_float *a, lapack_int *lda, lapack_complex_float *w, lapack_complex_float *vl, lapack_int *ldvl, lapack_complex_float *vr, lapack_int *ldvr, lapack_complex_float *work, lapack_int *lwork, float *rwork, lapack_int *info)
void LAPACK_zgeev (char *jobvl, char *jobvr, lapack_int *n, lapack_complex_double *a, lapack_int *lda, lapack_complex_double *w, lapack_complex_double *vl, lapack_int *ldvl, lapack_complex_double *vr, lapack_int *ldvr, lapack_complex_double *work, lapack_int *lwork, double *rwork, lapack_int *info)

the complex ones collapse wr/wi into a single w, and that is correct, don't @ me 💅


lastly, ?geevx walks in with balanc, sense, ilo, ihi, scale, abnrm, plus the condition-number crew:

void LAPACK_sgeevx (char *balanc, char *jobvl, char *jobvr, char *sense, lapack_int *n, float *a, lapack_int *lda, float *wr, float *wi, float *vl, lapack_int *ldvl, float *vr, lapack_int *ldvr, lapack_int *ilo, lapack_int *ihi, float *scale, float *abnrm, float *rconde, float *rcondv, float *work, lapack_int *lwork, lapack_int *iwork, lapack_int *info)
void LAPACK_dgeevx (char *balanc, char *jobvl, char *jobvr, char *sense, lapack_int *n, double *a, lapack_int *lda, double *wr, double *wi, double *vl, lapack_int *ldvl, double *vr, lapack_int *ldvr, lapack_int *ilo, lapack_int *ihi, double *scale, double *abnrm, double *rconde, double *rcondv, double *work, lapack_int *lwork, lapack_int *iwork, lapack_int *info)
void LAPACK_cgeevx (char *balanc, char *jobvl, char *jobvr, char *sense, lapack_int *n, lapack_complex_float *a, lapack_int *lda,

and yeah, cgeevx is mid-sentence right there — the prototype literally trails off at this boundary, so we carry it exactly as written and pick her back up in the next chunk 😭💜 no cap, this section is long, but we are not skipping a single pointer.

...aaaaand we're picking up mid-signature, bestie, don't panic — this is just where the previous part cut off. The tail end of the LAPACK_cgeevx argument list, then her double-precision sister:

           lapack_complex_float *w, lapack_complex_float *vl, lapack_int *ldvl,
           lapack_complex_float *vr, lapack_int *ldvr, lapack_int *ilo,
           lapack_int *ihi, float *scale, float *abnrm, float *rconde, float
           *rcondv, lapack_complex_float *work, lapack_int *lwork, float
           *rwork, lapack_int *info)
       void LAPACK_zgeevx (char *balanc, char *jobvl, char *jobvr, char *sense,
           lapack_int *n, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *w, lapack_complex_double *vl, lapack_int
           *ldvl, lapack_complex_double *vr, lapack_int *ldvr, lapack_int *ilo,
           lapack_int *ihi, double *scale, double *abnrm, double *rconde,
           double *rcondv, lapack_complex_double *work, lapack_int *lwork,
           double *rwork, lapack_int *info)

okay so front to back: LAPACK_sgesvd through LAPACK_zgesvd — the whole jobu/jobvt quartet, serving real single, real double, complex single, complex double 💅. Notice the c and z ones lowkey get an extra rwork pointer and a real-valued s array, because eigenvalues of complex matrices are just Like That:

       void LAPACK_sgesvd (char *jobu, char *jobvt, lapack_int *m, lapack_int
           *n, float *a, lapack_int *lda, float *s, float *u, lapack_int *ldu,
           float *vt, lapack_int *ldvt, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dgesvd (char *jobu, char *jobvt, lapack_int *m, lapack_int
           *n, double *a, lapack_int *lda, double *s, double *u, lapack_int
           *ldu, double *vt, lapack_int *ldvt, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_cgesvd (char *jobu, char *jobvt, lapack_int *m, lapack_int
           *n, lapack_complex_float *a, lapack_int *lda, float *s,
           lapack_complex_float *u, lapack_int *ldu, lapack_complex_float *vt,
           lapack_int *ldvt, lapack_complex_float *work, lapack_int *lwork,
           float *rwork, lapack_int *info)
       void LAPACK_zgesvd (char *jobu, char *jobvt, lapack_int *m, lapack_int
           *n, lapack_complex_double *a, lapack_int *lda, double *s,
           lapack_complex_double *u, lapack_int *ldu, lapack_complex_double
           *vt, lapack_int *ldvt, lapack_complex_double *work, lapack_int
           *lwork, double *rwork, lapack_int *info)

✨ next up: gesvdx — the x at the end is giving "I have range options" energy, and you can literally see it in the signature. Extra args unlocked: range, vl, vu, il, iu, ns, plus an iwork pointer. Four flavours, as always 🍓:

       void LAPACK_sgesvdx (char *jobu, char *jobvt, char *range, lapack_int
           *m, lapack_int *n, float *a, lapack_int *lda, float *vl, float *vu,
           lapack_int *il, lapack_int *iu, lapack_int *ns, float *s, float *u,
           lapack_int *ldu, float *vt, lapack_int *ldvt, float *work,
           lapack_int *lwork, lapack_int *iwork, lapack_int *info)
       void LAPACK_dgesvdx (char *jobu, char *jobvt, char *range, lapack_int
           *m, lapack_int *n, double *a, lapack_int *lda, double *vl, double
           *vu, lapack_int *il, lapack_int *iu, lapack_int *ns, double *s,
           double *u, lapack_int *ldu, double *vt, lapack_int *ldvt, double
           *work, lapack_int *lwork, lapack_int *iwork, lapack_int *info)
       void LAPACK_cgesvdx (char *jobu, char *jobvt, char *range, lapack_int
           *m, lapack_int *n, lapack_complex_float *a, lapack_int *lda, float
           *vl, float *vu, lapack_int *il, lapack_int *iu, lapack_int *ns,
           float *s, lapack_complex_float *u, lapack_int *ldu,
           lapack_complex_float *vt, lapack_int *ldvt, lapack_complex_float
           *work, lapack_int *lwork, float *rwork, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_zgesvdx (char *jobu, char *jobvt, char *range, lapack_int
           *m, lapack_int *n, lapack_complex_double *a, lapack_int *lda, double
           *vl, double *vu, lapack_int *il, lapack_int *iu, lapack_int *ns,
           double *s, lapack_complex_double *u, lapack_int *ldu,
           lapack_complex_double *vt, lapack_int *ldvt, lapack_complex_double
           *work, lapack_int *lwork, double *rwork, lapack_int *iwork,
           lapack_int *info)

then gesdd shows up with a single jobz instead of the jobu/jobvt duo — one character arg, icon behaviour 👑 (also taking iwork and, for the complex girlies, rwork):

       void LAPACK_sgesdd (char *jobz, lapack_int *m, lapack_int *n, float *a,
           lapack_int *lda, float *s, float *u, lapack_int *ldu, float *vt,
           lapack_int *ldvt, float *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_dgesdd (char *jobz, lapack_int *m, lapack_int *n, double *a,
           lapack_int *lda, double *s, double *u, lapack_int *ldu, double *vt,
           lapack_int *ldvt, double *work, lapack_int *lwork, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_cgesdd (char *jobz, lapack_int *m, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, float *s,
           lapack_complex_float *u, lapack_int *ldu, lapack_complex_float *vt,
           lapack_int *ldvt, lapack_complex_float *work, lapack_int *lwork,
           float *rwork, lapack_int *iwork, lapack_int *info)
       void LAPACK_zgesdd (char *jobz, lapack_int *m, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, double *s,
           lapack_complex_double *u, lapack_int *ldu, lapack_complex_double
           *vt, lapack_int *ldvt, lapack_complex_double *work, lapack_int
           *lwork, double *rwork, lapack_int *iwork, lapack_int *info)

and then gejsv pulls up with a whole row of char args — joba, jobu, jobv, jobr, jobt, jobp — six of them, she's highkey the main character of "options" 🌈. Peep that sva name too, and that the complex versions carry cwork, lwork, work, lrwork, plus iwork:

       void LAPACK_dgejsv (char *joba, char *jobu, char *jobv, char *jobr, char
           *jobt, char *jobp, lapack_int *m, lapack_int *n, double *a,
           lapack_int *lda, double *sva, double *u, lapack_int *ldu, double *v,
           lapack_int *ldv, double *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_sgejsv (char *joba, char *jobu, char *jobv, char *jobr, char
           *jobt, char *jobp, lapack_int *m, lapack_int *n, float *a,
           lapack_int *lda, float *sva, float *u, lapack_int *ldu, float *v,
           lapack_int *ldv, float *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_cgejsv (char *joba, char *jobu, char *jobv, char *jobr, char
           *jobt, char *jobp, lapack_int *m, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, float *sva,
           lapack_complex_float *u, lapack_int *ldu, lapack_complex_float *v,
           lapack_int *ldv, lapack_complex_float *cwork, lapack_int *lwork,
           float *work, lapack_int *lrwork, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_zgejsv (char *joba, char *jobu, char *jobv, char *jobr, char
           *jobt, char *jobp, lapack_int *m, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, double *sva,
           lapack_complex_double *u, lapack_int *ldu, lapack_complex_double *v,
           lapack_int *ldv, lapack_complex_double *cwork, lapack_int *lwork,
           double *work, lapack_int *lrwork, lapack_int *iwork, lapack_int
           *info)

gesvj next — shorter char list (joba, jobu, jobv), but she traded that for an mv pointer, and the complex ones again bring cwork + rwork + lrwork along 🧚:

       void LAPACK_dgesvj (char *joba, char *jobu, char *jobv, lapack_int *m,
           lapack_int *n, double *a, lapack_int *lda, double *sva, lapack_int
           *mv, double *v, lapack_int *ldv, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_sgesvj (char *joba, char *jobu, char *jobv, lapack_int *m,
           lapack_int *n, float *a, lapack_int *lda, float *sva, lapack_int
           *mv, float *v, lapack_int *ldv, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_cgesvj (char *joba, char *jobu, char *jobv, lapack_int *m,
           lapack_int *n, lapack_complex_float *a, lapack_int *lda, float *sva,
           lapack_int *mv, lapack_complex_float *v, lapack_int *ldv,
           lapack_complex_float *cwork, lapack_int *lwork, float *rwork,
           lapack_int *lrwork, lapack_int *info)
       void LAPACK_zgesvj (char *joba, char *jobu, char *jobv, lapack_int *m,
           lapack_int *n, lapack_complex_double *a, lapack_int *lda, double
           *sva, lapack_int *mv, lapack_complex_double *v, lapack_int *ldv,
           lapack_complex_double *cwork, lapack_int *lwork, double *rwork,
           lapack_int *lrwork, lapack_int *info)

okay and here's the ggsvd gang — jobu, jobv, jobq, plus m, n, p, k, l (yes, both k and l, they're a package deal 💀), alpha and beta output arrays, and u, v, q with their ldu, ldv, ldq. No lwork in this one, bestie — note it takes iwork straight up. The complex pair keeps rwork in the mix 🌸:

       void LAPACK_sggsvd (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *n, lapack_int *p, lapack_int *k, lapack_int *l, float
           *a, lapack_int *lda, float *b, lapack_int *ldb, float *alpha, float
           *beta, float *u, lapack_int *ldu, float *v, lapack_int *ldv, float
           *q, lapack_int *ldq, float *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_dggsvd (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *n, lapack_int *p, lapack_int *k, lapack_int *l, double
           *a, lapack_int *lda, double *b, lapack_int *ldb, double *alpha,
           double *beta, double *u, lapack_int *ldu, double *v, lapack_int
           *ldv, double *q, lapack_int *ldq, double *work, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_cggsvd (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *n, lapack_int *p, lapack_int *k, lapack_int *l,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, float *alpha, float *beta, lapack_complex_float *u,
           lapack_int *ldu, lapack_complex_float *v, lapack_int *ldv,
           lapack_complex_float *q, lapack_int *ldq, lapack_complex_float
           *work, float *rwork, lapack_int *iwork, lapack_int *info)
       void LAPACK_zggsvd (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *n, lapack_int *p, lapack_int *k, lapack_int *l,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, double *alpha, double *beta, lapack_complex_double
           *u, lapack_int *ldu, lapack_complex_double *v, lapack_int *ldv,
           lapack_complex_double *q, lapack_int *ldq, lapack_complex_double
           *work, double *rwork, lapack_int *iwork, lapack_int *info)

and ggsvd3 is the same squad but with lwork added to the party — the 3 said "we're doing workspace explicitly now" 💅:

       void LAPACK_sggsvd3 (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *n, lapack_int *p, lapack_int *k, lapack_int *l, float
           *a, lapack_int *lda, float *b, lapack_int *ldb, float *alpha, float
           *beta, float *u, lapack_int *ldu, float *v, lapack_int *ldv, float
           *q, lapack_int *ldq, float *work, lapack_int *lwork, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_dggsvd3 (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *n, lapack_int *p, lapack_int *k, lapack_int *l, double
           *a, lapack_int *lda, double *b, lapack_int *ldb, double *alpha,
           double *beta, double *u, lapack_int *ldu, double *v, lapack_int
           *ldv, double *q, lapack_int *ldq, double *work, lapack_int *lwork,
           lapack_int *iwork, lapack_int *info)
       void LAPACK_cggsvd3 (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *n, lapack_int *p, lapack_int *k, lapack_int *l,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, float *alpha, float *beta, lapack_complex_float *u,
           lapack_int *ldu, lapack_complex_float *v, lapack_int *ldv,
           lapack_complex_float *q, lapack_int *ldq, lapack_complex_float
           *work, lapack_int *lwork, float *rwork, lapack_int *iwork,
           lapack_int *info)
       void LAPACK_zggsvd3 (char *jobu, char *jobv, char *jobq, lapack_int *m,
           lapack_int *n, lapack_int *p, lapack_int *k, lapack_int *l,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, double *alpha, double *beta, lapack_complex_double
           *u, lapack_int *ldu, lapack_complex_double *v, lapack_int *ldv,
           lapack_complex_double *q, lapack_int *ldq, lapack_complex_double
           *work, lapack_int *lwork, double *rwork, lapack_int *iwork,
           lapack_int *info)

and we're rounding out this part with a new family: sygv — starting with itype as the very first arg (she leads, periodt), then jobz, uplo, n, the a/lda and b/ldb pairs, w, work, lwork, info:

       void LAPACK_ssygv (lapack_int *itype, char *jobz, char *uplo, lapack_int
           *n, float *a, lapack_int *lda, float *b, lapack_int *ldb, float *w,
           float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dsygv (lapack_int *itype, char *jobz, char *uplo, lapack_int
and yeah — we're stopping mid-signature again 😭 that's just how the manpage pagination ate. LAPACK_dsygv picks up in the next part, same bat-time, same bat-place 🦋

Yo so we're still deep in the prototype zone, bestie — this stretch is the generalized symmetric / Hermitian eigenvalue fam, and honestly? It's giving ✨main character energy✨ for anyone doing vibration analysis or quantum stuff. Same deal as before: every one of these is void, every arg is a pointer (yes, even n, even info, LAPACK does not care about your feelings), and info is always the last one. Buckle up 💅


🫶 the gv girlies — generalized eigenproblems (dense, classic)

void LAPACK_ssygv (lapack_int *itype, char *jobz, char *uplo, lapack_int *n, float *a,
    lapack_int *lda, float *b, lapack_int *ldb, float *w, float *work,
    lapack_int *lwork, lapack_int *info)
void LAPACK_dsygv (lapack_int *itype, char *jobz, char *uplo, lapack_int *n, double *a,
    lapack_int *lda, double *b, lapack_int *ldb, double *w, double *work,
    lapack_int *lwork, lapack_int *info)
void LAPACK_chegv (lapack_int *itype, char *jobz, char *uplo, lapack_int *n,
    lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b, lapack_int *ldb,
    float *w, lapack_complex_float *work, lapack_int *lwork, float *rwork,
    lapack_int *info)
void LAPACK_zhegv (lapack_int *itype, char *jobz, char *uplo, lapack_int *n,
    lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b, lapack_int *ldb,
    double *w, lapack_complex_double *work, lapack_int *lwork, double *rwork,
    lapack_int *info)

Not the c/z versions catching an extra rwork at the end like "and don't forget my little float friend" 😭 that's just how complex numbers roll, babes.

🌸 the gvd icons — divide & conquer edition

void LAPACK_ssygvd (lapack_int *itype, char *jobz, char *uplo, lapack_int *n, float *a,
    lapack_int *lda, float *b, lapack_int *ldb, float *w, float *work, lapack_int *lwork,
    lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_dsygvd (lapack_int *itype, char *jobz, char *uplo, lapack_int *n, double *a,
    lapack_int *lda, double *b, lapack_int *ldb, double *w, double *work, lapack_int *lwork,
    lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_chegvd (lapack_int *itype, char *jobz, char *uplo, lapack_int *n,
    lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b, lapack_int *ldb,
    float *w, lapack_complex_float *work, lapack_int *lwork, float *rwork,
    lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_zhegvd (lapack_int *itype, char *jobz, char *uplo, lapack_int *n,
    lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b, lapack_int *ldb,
    double *w, lapack_complex_double *work, lapack_int *lwork, double *rwork,
    lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)

See how the d versions suddenly want iwork and liwork? And the complex ones want rwork and lrwork on top of that? That's the divide-and-conquer tax, bestie 💸 you're paying in workspace for the speed. Worth it, no cap.

🔥 the gvx baddies — expert drivers, they take everything

void LAPACK_ssygvx (lapack_int *itype, char *jobz, char *range, char *uplo, lapack_int *n,
    float *a, lapack_int *lda, float *b, lapack_int *ldb, float *vl, float *vu,
    lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m, float *w, float *z,
    lapack_int *ldz, float *work, lapack_int *lwork, lapack_int *iwork, lapack_int *ifail,
    lapack_int *info)
void LAPACK_dsygvx (lapack_int *itype, char *jobz, char *range, char *uplo, lapack_int *n,
    double *a, lapack_int *lda, double *b, lapack_int *ldb, double *vl, double *vu,
    lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m, double *w, double *z,
    lapack_int *ldz, double *work, lapack_int *lwork, lapack_int *iwork, lapack_int *ifail,
    lapack_int *info)
void LAPACK_chegvx (lapack_int *itype, char *jobz, char *range, char *uplo, lapack_int *n,
    lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b, lapack_int *ldb,
    float *vl, float *vu, lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m,
    float *w, lapack_complex_float *z, lapack_int *ldz, lapack_complex_float *work,
    lapack_int *lwork, float *rwork, lapack_int *iwork, lapack_int *ifail, lapack_int *info)
void LAPACK_zhegvx (lapack_int *itype, char *jobz, char *range, char *uplo, lapack_int *n,
    lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b, lapack_int *ldb,
    double *vl, double *vu, lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m,
    double *w, lapack_complex_double *z, lapack_int *ldz, lapack_complex_double *work,
    lapack_int *lwork, double *rwork, lapack_int *iwork, lapack_int *ifail, lapack_int *info)

Ok these are long. range, vl, vu, il, iu, abstol, m, z, ldz, ifail… it's giving "I have 22 arguments and I'm not sorry." If you're calling one of these bad boys, please for the love of 🦋 count your pointers twice.


🎀 now the packed ones — spgv crew, living their most compact life

void LAPACK_sspgv (lapack_int *itype, char *jobz, char *uplo, lapack_int *n, float *ap,
    float *bp, float *w, float *z, lapack_int *ldz, float *work, lapack_int *info)
void LAPACK_dspgv (lapack_int *itype, char *jobz, char *uplo, lapack_int *n, double *ap,
    double *bp, double *w, double *z, lapack_int *ldz, double *work, lapack_int *info)
void LAPACK_chpgv (lapack_int *itype, char *jobz, char *uplo, lapack_int *n,
    lapack_complex_float *ap, lapack_complex_float *bp, float *w, lapack_complex_float *z,
    lapack_int *ldz, lapack_complex_float *work, float *rwork, lapack_int *info)
void LAPACK_zhpgv (lapack_int *itype, char *jobz, char *uplo, lapack_int *n,
    lapack_complex_double *ap, lapack_complex_double *bp, double *w,
    lapack_complex_double *z, lapack_int *ldz, lapack_complex_double *work, double *rwork,
    lapack_int *info)

Notice there's no lda/ldb here?? That's the whole point of packed storage — ap and bp are just vibing in a 1-D array, one triangle only, no leading dimension needed. Slay, minimalism 💅

💜 spgvd — packed and divide & conquer

void LAPACK_sspgvd (lapack_int *itype, char *jobz, char *uplo, lapack_int *n, float *ap,
    float *bp, float *w, float *z, lapack_int *ldz, float *work, lapack_int *lwork,
    lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_dspgvd (lapack_int *itype, char *jobz, char *uplo, lapack_int *n, double *ap,
    double *bp, double *w, double *z, lapack_int *ldz, double *work, lapack_int *lwork,
    lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_chpgvd (lapack_int *itype, char *jobz, char *uplo, lapack_int *n,
    lapack_complex_float *ap, lapack_complex_float *bp, float *w, lapack_complex_float *z,
    lapack_int *ldz, lapack_complex_float *work, lapack_int *lwork, float *rwork,
    lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork, lapack_int *info)
void LAPACK_zhpgvd (lapack_int *itype, char *jobz, char *uplo, lapack_int *n,
    lapack_complex_double *ap, lapack_complex_double *bp, double *w,
    lapack_complex_double *z, lapack_int *ldz, lapack_complex_double *work, lapack_int *lwork,
    double *rwork, lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork,
    lapack_int *info)

⭐ spgvx — packed expert mode, because of course

void LAPACK_sspgvx (lapack_int *itype, char *jobz, char *range, char *uplo, lapack_int *n,
    float *ap, float *bp, float *vl, float *vu, lapack_int *il, lapack_int *iu,
    float *abstol, lapack_int *m, float *w, float *z, lapack_int *ldz, float *work,
    lapack_int *iwork, lapack_int *ifail, lapack_int *info)
void LAPACK_dspgvx (lapack_int *itype, char *jobz, char *range, char *uplo, lapack_int *n,
    double *ap, double *bp, double *vl, double *vu, lapack_int *il, lapack_int *iu,
    double *abstol, lapack_int *m, double *w, double *z, lapack_int *ldz, double *work,
    lapack_int *iwork, lapack_int *ifail, lapack_int *info)
void LAPACK_chpgvx (lapack_int *itype, char *jobz, char *range, char *uplo, lapack_int *n,
    lapack_complex_float *ap, lapack_complex_float *bp, float *vl, float *vu,
    lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m, float *w,
    lapack_complex_float *z, lapack_int *ldz, lapack_complex_float *work, float *rwork,
    lapack_int *iwork, lapack_int *ifail, lapack_int *info)
void LAPACK_zhpgvx (lapack_int *itype, char *jobz, char *range, char *uplo, lapack_int *n,
    lapack_complex_double *ap, lapack_complex_double *bp, double *vl, double *vu,
    lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m, double *w,
    lapack_complex_double *z, lapack_int *ldz, lapack_complex_double *work, double *rwork,
    lapack_int *iwork, lapack_int *ifail, lapack_int *info)

🧚 band storage time — sbgv and friends, the ka/kb girlies

Ok so these swap out the square matrix for a banded one. That's why you're seeing ka and kb (upper bandwidth of A and of B respectively), plus ab/bb and their leading dims ldab/ldbb. It's giving "I only care about the diagonal-ish part" 🙈

void LAPACK_ssbgv (char *jobz, char *uplo, lapack_int *n, lapack_int *ka, lapack_int *kb,
    float *ab, lapack_int *ldab, float *bb, lapack_int *ldbb, float *w, float *z,
    lapack_int *ldz, float *work, lapack_int *info)
void LAPACK_dsbgv (char *jobz, char *uplo, lapack_int *n, lapack_int *ka, lapack_int *kb,
    double *ab, lapack_int *ldab, double *bb, lapack_int *ldbb, double *w, double *z,
    lapack_int *ldz, double *work, lapack_int *info)
void LAPACK_chbgv (char *jobz, char *uplo, lapack_int *n, lapack_int *ka, lapack_int *kb,
    lapack_complex_float *ab, lapack_int *ldab, lapack_complex_float *bb, lapack_int *ldbb,
    float *w, lapack_complex_float *z, lapack_int *ldz, lapack_complex_float *work,
    float *rwork, lapack_int *info)
void LAPACK_zhbgv (char *jobz, char *uplo, lapack_int *n, lapack_int *ka, lapack_int *kb,
    lapack_complex_double *ab, lapack_int *ldab, lapack_complex_double *bb,
    lapack_int *ldbb, double *w, lapack_complex_double *z, lapack_int *ldz,
    lapack_complex_double *work, double *rwork, lapack_int *info)

Heads up: no itype here! Banded versions just do the standard A x = λ B x situation, no generalized-itype menu 😌

🌈 sbgvd — banded + divide & conquer (the workspace-heavy era)

void LAPACK_ssbgvd (char *jobz, char *uplo, lapack_int *n, lapack_int *ka, lapack_int *kb,
    float *ab, lapack_int *ldab, float *bb, lapack_int *ldbb, float *w, float *z,
    lapack_int *ldz, float *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork,
    lapack_int *info)
void LAPACK_dsbgvd (char *jobz, char *uplo, lapack_int *n, lapack_int *ka, lapack_int *kb,
    double *ab, lapack_int *ldab, double *bb, lapack_int *ldbb, double *w, double *z,
    lapack_int *ldz, double *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork,
    lapack_int *info)
void LAPACK_chbgvd (char *jobz, char *uplo, lapack_int *n, lapack_int *ka, lapack_int *kb,
    lapack_complex_float *ab, lapack_int *ldab, lapack_complex_float *bb, lapack_int *ldbb,
    float *w, lapack_complex_float *z, lapack_int *ldz, lapack_complex_float *work,
    lapack_int *lwork, float *rwork, lapack_int *lrwork, lapack_int *iwork,
    lapack_int *liwork, lapack_int *info)
void LAPACK_zhbgvd (char *jobz, char *uplo, lapack_int *n, lapack_int *ka, lapack_int *kb,
    lapack_complex_double *ab, lapack_int *ldab, lapack_complex_double *bb,
    lapack_int *ldbb, double *w, lapack_complex_double *z, lapack_int *ldz,
    lapack_complex_double *work, lapack_int *lwork, double *rwork, lapack_int *lrwork,
    lapack_int *iwork, lapack_int *liwork, lapack_int *info)

👑 sbgvx — banded expert, and yes it brought a q matrix

void LAPACK_ssbgvx (char *jobz, char *range, char *uplo, lapack_int *n, lapack_int *ka,
    lapack_int *kb, float *ab, lapack_int *ldab, float *bb, lapack_int *ldbb, float *q,
    lapack_int *ldq, float *vl, float *vu, lapack_int *il, lapack_int *iu, float *abstol,
    lapack_int *m, float *w, float *z, lapack_int *ldz, float *work, lapack_int *iwork,
    lapack_int *ifail, lapack_int *info)
void LAPACK_dsbgvx (char *jobz, char *range, char *uplo, lapack_int *n, lapack_int *ka,
    lapack_int *kb, double *ab, lapack_int *ldab, double *bb, lapack_int *ldbb, double *q,
    lapack_int *ldq, double *vl, double *vu, lapack_int *il, lapack_int *iu, double *abstol,
    lapack_int *m, double *w, double *z, lapack_int *ldz, double *work, lapack_int *iwork,
    lapack_int *ifail, lapack_int *info)
void LAPACK_chbgvx (char *jobz, char *range, char *uplo, lapack_int *n, lapack_int *ka,
    lapack_int *kb, lapack_complex_float *ab, lapack_int *ldab, lapack_complex_float *bb,
    lapack_int *ldbb, lapack_complex_float *q, lapack_int *ldq, float *vl, float *vu,
    lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m, float *w,
    lapack_complex_float *z, lapack_int *ldz, lapack_complex_float *work, float *rwork,
    lapack_int *iwork, lapack_int *ifail, lapack_int *info)

See that q? That's the bulge-chasing representation of the band reduction — you only touch it if you're deep in the implementation weeds, so don't stress if it looks scary, bestie. It's in the family for a reason 🫶


That's the whole symmetric/Hermitian generalized protag lineup for this chunk — dense, packed, and banded, all cozy in their void-and-pointers era. More prototypes coming, don't you worry 💖

okay bestie we're still deep in the SYNOPSIS function era — this next batch is the generalized eigenvalue / Schur crowd, plus one little hbgvx straggler that wandered in. eyes on the signatures, they're literal 💅

       void LAPACK_zhbgvx (char *jobz, char *range, char *uplo, lapack_int *n,
           lapack_int *ka, lapack_int *kb, lapack_complex_double *ab,
           lapack_int *ldab, lapack_complex_double *bb, lapack_int *ldbb,
           lapack_complex_double *q, lapack_int *ldq, double *vl, double *vu,
           lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m,
           double *w, lapack_complex_double *z, lapack_int *ldz,
           lapack_complex_double *work, double *rwork, lapack_int *iwork,
           lapack_int *ifail, lapack_int *info)

she's the complex-double banded generalized eigen-solver with eigenvectors, aka the whole buffet 🍓 — range, vl/vu, il/iu, abstol, m, w, ifail, all of it, no crumbs left behind.


🦋 the generalized Schur decomposition girlies

these four are the OG gges set — deflating the pencil (A, B) and handing you alpha/beta (or alphar/alphai/beta in real land) plus the left and right Schur vectors. the split is giving very real-vs-complex:

       void LAPACK_sgges (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_S_SELECT3 selctg, lapack_int *n, float *a, lapack_int *lda,
           float *b, lapack_int *ldb, lapack_int *sdim, float *alphar, float
           *alphai, float *beta, float *vsl, lapack_int *ldvsl, float *vsr,
           lapack_int *ldvsr, float *work, lapack_int *lwork, lapack_logical
           *bwork, lapack_int *info)
       void LAPACK_dgges (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_D_SELECT3 selctg, lapack_int *n, double *a, lapack_int *lda,
           double *b, lapack_int *ldb, lapack_int *sdim, double *alphar, double
           *alphai, double *beta, double *vsl, lapack_int *ldvsl, double *vsr,
           lapack_int *ldvsr, double *work, lapack_int *lwork, lapack_logical
           *bwork, lapack_int *info)
       void LAPACK_cgges (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_C_SELECT2 selctg, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, lapack_complex_float *b, lapack_int *ldb,
           lapack_int *sdim, lapack_complex_float *alpha, lapack_complex_float
           *beta, lapack_complex_float *vsl, lapack_int *ldvsl,
           lapack_complex_float *vsr, lapack_int *ldvsr, lapack_complex_float
           *work, lapack_int *lwork, float *rwork, lapack_logical *bwork,
           lapack_int *info)
       void LAPACK_zgges (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_Z_SELECT2 selctg, lapack_int *n, lapack_complex_double *a,
           lapack_int *lda, lapack_complex_double *b, lapack_int *ldb,
           lapack_int *sdim, lapack_complex_double *alpha,
           lapack_complex_double *beta, lapack_complex_double *vsl, lapack_int
           *ldvsl, lapack_complex_double *vsr, lapack_int *ldvsr,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_logical *bwork, lapack_int *info)

not the *3 versions sneaking in next — same vibes, same args, just the newer-shinier algorithmic glow-up ✨:

       void LAPACK_sgges3 (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_S_SELECT3 selctg, lapack_int *n, float *a, lapack_int *lda,
           float *b, lapack_int *ldb, lapack_int *sdim, float *alphar, float
           *alphai, float *beta, float *vsl, lapack_int *ldvsl, float *vsr,
           lapack_int *ldvsr, float *work, lapack_int *lwork, lapack_logical
           *bwork, lapack_int *info)
       void LAPACK_dgges3 (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_D_SELECT3 selctg, lapack_int *n, double *a, lapack_int *lda,
           double *b, lapack_int *ldb, lapack_int *sdim, double *alphar, double
           *alphai, double *beta, double *vsl, lapack_int *ldvsl, double *vsr,
           lapack_int *ldvsr, double *work, lapack_int *lwork, lapack_logical
           *bwork, lapack_int *info)
       void LAPACK_cgges3 (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_C_SELECT2 selctg, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, lapack_complex_float *b, lapack_int *ldb,
           lapack_int *sdim, lapack_complex_float *alpha, lapack_complex_float
           *beta, lapack_complex_float *vsl, lapack_int *ldvsl,
           lapack_complex_float *vsr, lapack_int *ldvsr, lapack_complex_float
           *work, lapack_int *lwork, float *rwork, lapack_logical *bwork,
           lapack_int *info)
       void LAPACK_zgges3 (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_Z_SELECT2 selctg, lapack_int *n, lapack_complex_double *a,
           lapack_int *lda, lapack_complex_double *b, lapack_int *ldb,
           lapack_int *sdim, lapack_complex_double *alpha,
           lapack_complex_double *beta, lapack_complex_double *vsl, lapack_int
           *ldvsl, lapack_complex_double *vsr, lapack_int *ldvsr,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_logical *bwork, lapack_int *info)

🎀 ggesx — the with-reciprocal-condition-numbers edition

bestie, these are gges but extra — you get a sense flag and rconde/rcondv, plus iwork/liwork for the real ones (complex ones still carry rwork). highkey the overachiever of the family 👑

       void LAPACK_sggesx (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_S_SELECT3 selctg, char *sense, lapack_int *n, float *a,
           lapack_int *lda, float *b, lapack_int *ldb, lapack_int *sdim, float
           *alphar, float *alphai, float *beta, float *vsl, lapack_int *ldvsl,
           float *vsr, lapack_int *ldvsr, float *rconde, float *rcondv, float
           *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork,
           lapack_logical *bwork, lapack_int *info)
       void LAPACK_dggesx (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_D_SELECT3 selctg, char *sense, lapack_int *n, double *a,
           lapack_int *lda, double *b, lapack_int *ldb, lapack_int *sdim,
           double *alphar, double *alphai, double *beta, double *vsl,
           lapack_int *ldvsl, double *vsr, lapack_int *ldvsr, double *rconde,
           double *rcondv, double *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *liwork, lapack_logical *bwork, lapack_int *info)
       void LAPACK_cggesx (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_C_SELECT2 selctg, char *sense, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, lapack_int *sdim, lapack_complex_float *alpha,
           lapack_complex_float *beta, lapack_complex_float *vsl, lapack_int
           *ldvsl, lapack_complex_float *vsr, lapack_int *ldvsr, float *rconde,
           float *rcondv, lapack_complex_float *work, lapack_int *lwork, float
           *rwork, lapack_int *iwork, lapack_int *liwork, lapack_logical
           *bwork, lapack_int *info)
       void LAPACK_zggesx (char *jobvsl, char *jobvsr, char *sort,
           LAPACK_Z_SELECT2 selctg, char *sense, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, lapack_int *sdim, lapack_complex_double *alpha,
           lapack_complex_double *beta, lapack_complex_double *vsl, lapack_int
           *ldvsl, lapack_complex_double *vsr, lapack_int *ldvsr, double
           *rconde, double *rcondv, lapack_complex_double *work, lapack_int
           *lwork, double *rwork, lapack_int *iwork, lapack_int *liwork,
           lapack_logical *bwork, lapack_int *info)

🌈 generalized eigenvalue problem, the ggev era

jobvl/jobvr girlies rise up — no sort here, no selctg, just pure pencil-solving energy. real ones give you alphar + alphai + beta; complex ones give you alpha + beta. periodt 💅

       void LAPACK_sggev (char *jobvl, char *jobvr, lapack_int *n, float *a,
           lapack_int *lda, float *b, lapack_int *ldb, float *alphar, float
           *alphai, float *beta, float *vl, lapack_int *ldvl, float *vr,
           lapack_int *ldvr, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dggev (char *jobvl, char *jobvr, lapack_int *n, double *a,
           lapack_int *lda, double *b, lapack_int *ldb, double *alphar, double
           *alphai, double *beta, double *vl, lapack_int *ldvl, double *vr,
           lapack_int *ldvr, double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_cggev (char *jobvl, char *jobvr, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, lapack_complex_float *alpha, lapack_complex_float
           *beta, lapack_complex_float *vl, lapack_int *ldvl,
           lapack_complex_float *vr, lapack_int *ldvr, lapack_complex_float
           *work, lapack_int *lwork, float *rwork, lapack_int *info)
       void LAPACK_zggev (char *jobvl, char *jobvr, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, lapack_complex_double *alpha, lapack_complex_double
           *beta, lapack_complex_double *vl, lapack_int *ldvl,
           lapack_complex_double *vr, lapack_int *ldvr, lapack_complex_double
           *work, lapack_int *lwork, double *rwork, lapack_int *info)

and the 3 glow-up again, same signatures, updated internals 🌸:

       void LAPACK_sggev3 (char *jobvl, char *jobvr, lapack_int *n, float *a,
           lapack_int *lda, float *b, lapack_int *ldb, float *alphar, float
           *alphai, float *beta, float *vl, lapack_int *ldvl, float *vr,
           lapack_int *ldvr, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dggev3 (char *jobvl, char *jobvr, lapack_int *n, double *a,
           lapack_int *lda, double *b, lapack_int *ldb, double *alphar, double
           *alphai, double *beta, double *vl, lapack_int *ldvl, double *vr,
           lapack_int *ldvr, double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_cggev3 (char *jobvl, char *jobvr, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
           lapack_int *ldb, lapack_complex_float *alpha, lapack_complex_float
           *beta, lapack_complex_float *vl, lapack_int *ldvl,
           lapack_complex_float *vr, lapack_int *ldvr, lapack_complex_float
           *work, lapack_int *lwork, float *rwork, lapack_int *info)
       void LAPACK_zggev3 (char *jobvl, char *jobvr, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
           lapack_int *ldb, lapack_complex_double *alpha, lapack_complex_double
           *beta, lapack_complex_double *vl, lapack_int *ldvl,
           lapack_complex_double *vr, lapack_int *ldvr, lapack_complex_double
           *work, lapack_int *lwork, double *rwork, lapack_int *info)

🫶 ggevx — balanc + sense, the maximalist icon

flop era? no bestie this is the EVERYTHING era — balanc, jobvl, jobvr, sense, plus ilo/ihi, lscale/rscale, abnrm/bbnrm, rconde/rcondv AND iwork/bwork. it's giving "I brought my whole backpack" 🎒

       void LAPACK_sggevx (char *balanc, char *jobvl, char *jobvr, char *sense,
           lapack_int *n, float *a, lapack_int *lda, float *b, lapack_int *ldb,
           float *alphar, float *alphai, float *beta, float *vl, lapack_int
           *ldvl, float *vr, lapack_int *ldvr, lapack_int *ilo, lapack_int
           *ihi, float *lscale, float *rscale, float *abnrm, float *bbnrm,
           float *rconde, float *rcondv, float *work, lapack_int *lwork,
           lapack_int *iwork, lapack_logical *bwork, lapack_int *info)
       void LAPACK_dggevx (char *balanc, char *jobvl, char *jobvr, char *sense,
           lapack_int *n, double *a, lapack_int *lda, double *b, lapack_int
           *ldb, double *alphar, double *alphai, double *beta, double *vl,
           lapack_int *ldvl, double *vr, lapack_int *ldvr, lapack_int *ilo,
           lapack_int *ihi, double *lscale, double *rscale, double *abnrm,
           double *bbnrm, double *rconde, double *rcondv, double *work,
           lapack_int *lwork, lapack_int *iwork, lapack_logical *bwork,
           lapack_int *info)
       void LAPACK_cggevx (char *balanc, char *jobvl, char *jobvr, char *sense,
           lapack_int *n, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
           *alpha, lapack_complex_float *beta, lapack_complex_float *vl,
           lapack_int *ldvl, lapack_complex_float *vr, lapack_int *ldvr,
           lapack_int *ilo, lapack_int *ihi, float *lscale, float *rscale,
           float *abnrm, float *bbnrm, float *rconde, float *rcondv,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *iwork, lapack_logical *bwork, lapack_int *info)

and zggevx is mid-sentence — still rolling, bestie 🌀

       void LAPACK_zggevx (char *balanc, char *jobvl, char *jobvr, char *sense,
           lapack_int *n, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double
           *alpha, lapack_complex_double *beta, lapack_complex_double *vl,
           lapack_int *ldvl, lapack_complex_double *vr, lapack_int *ldvr,
           lapack_int *ilo, lapack_int *ihi, double *lscale, double *rscale,
           double *abnrm, double *bbnrm, double *rconde, double *rcondv,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,

yep, she got cut off at *rwork — the rest of the params are chilling in the next chunk 💀 don't @ me, that's just where the page broke.

...and we're literally still mid-declaration, bestie 😭 the argument list from the previous entry just keeps going. Do not panic, this is normal, we're picking it up right where we left off:

lapack_int *iwork, lapack_logical *bwork, lapack_int *info)
void LAPACK_dsfrk (char *transr, char *uplo, char *trans, lapack_int *n,
    lapack_int *k, double *alpha, const double *a, lapack_int *lda,
    double *beta, double *c)
void LAPACK_ssfrk (char *transr, char *uplo, char *trans, lapack_int *n,
    lapack_int *k, float *alpha, const float *a, lapack_int *lda, float
    *beta, float *c)
void LAPACK_zhfrk (char *transr, char *uplo, char *trans, lapack_int *n,
    lapack_int *k, double *alpha, const lapack_complex_double *a,
    lapack_int *lda, double *beta, lapack_complex_double *c)
void LAPACK_chfrk (char *transr, char *uplo, char *trans, lapack_int *n,
    lapack_int *k, float *alpha, const lapack_complex_float *a,
    lapack_int *lda, float *beta, lapack_complex_float *c)

Okay so that's the sfrk / hfrk block, and the vibe check here is that every single one of them is a *frk — <purple>transr</purple>, uplo, trans, then n and k as the two size arguments, then alpha, a, lda, beta, c. Look at the *hfrk ones though — the data is complex but alpha and beta are double * / float * 🎀 that's not a typo, that's just what the signature says, and the signature is the whole personality. s l a y. 💅


Next up, tfsm, and she brought all four flavors:

void LAPACK_dtfsm (char *transr, char *side, char *uplo, char *trans,
    char *diag, lapack_int *m, lapack_int *n, double *alpha, const
    double *a, double *b, lapack_int *ldb)
void LAPACK_stfsm (char *transr, char *side, char *uplo, char *trans,
    char *diag, lapack_int *m, lapack_int *n, float *alpha, const float
    *a, float *b, lapack_int *ldb)
void LAPACK_ztfsm (char *transr, char *side, char *uplo, char *trans,
    char *diag, lapack_int *m, lapack_int *n, lapack_complex_double
    *alpha, const lapack_complex_double *a, lapack_complex_double *b,
    lapack_int *ldb)
void LAPACK_ctfsm (char *transr, char *side, char *uplo, char *trans,
    char *diag, lapack_int *m, lapack_int *n, lapack_complex_float
    *alpha, const lapack_complex_float *a, lapack_complex_float *b,
    lapack_int *ldb)

Five char pointers in a row before you even get to a number — transr, side, uplo, trans, diag — which is honestly giving character select screen energy 🎮 note that this one passes m and n and ldb but no info, a and b are both writable-ish pointers in different ways (a is const, b is not, alpha is not). Read the signature, bestie, she is not hiding anything 🙈


And now, the format-shuffle girlies. Six whole families of them, all doing the t-thing:

void LAPACK_dtfttp (char *transr, char *uplo, lapack_int *n, const
    double *arf, double *ap, lapack_int *info)
void LAPACK_stfttp (char *transr, char *uplo, lapack_int *n, const float
    *arf, float *ap, lapack_int *info)
void LAPACK_ztfttp (char *transr, char *uplo, lapack_int *n, const
    lapack_complex_double *arf, lapack_complex_double *ap, lapack_int
    *info)
void LAPACK_ctfttp (char *transr, char *uplo, lapack_int *n, const
    lapack_complex_float *arf, lapack_complex_float *ap, lapack_int
    *info)
void LAPACK_dtfttr (char *transr, char *uplo, lapack_int *n, const
    double *arf, double *a, lapack_int *lda, lapack_int *info)
void LAPACK_stfttr (char *transr, char *uplo, lapack_int *n, const float
    *arf, float *a, lapack_int *lda, lapack_int *info)
void LAPACK_ztfttr (char *transr, char *uplo, lapack_int *n, const
    lapack_complex_double *arf, lapack_complex_double *a, lapack_int
    *lda, lapack_int *info)
void LAPACK_ctfttr (char *transr, char *uplo, lapack_int *n, const
    lapack_complex_float *arf, lapack_complex_float *a, lapack_int *lda,
    lapack_int *info)
void LAPACK_dtpttf (char *transr, char *uplo, lapack_int *n, const
    double *ap, double *arf, lapack_int *info)
void LAPACK_stpttf (char *transr, char *uplo, lapack_int *n, const float
    *ap, float *arf, lapack_int *info)
void LAPACK_ztpttf (char *transr, char *uplo, lapack_int *n, const
    lapack_complex_double *ap, lapack_complex_double *arf, lapack_int
    *info)
void LAPACK_ctpttf (char *transr, char *uplo, lapack_int *n, const
    lapack_complex_float *ap, lapack_complex_float *arf, lapack_int
    *info)
void LAPACK_dtpttr (char *uplo, lapack_int *n, const double *ap, double
    *a, lapack_int *lda, lapack_int *info)
void LAPACK_stpttr (char *uplo, lapack_int *n, const float *ap, float
    *a, lapack_int *lda, lapack_int *info)
void LAPACK_ztpttr (char *uplo, lapack_int *n, const
    lapack_complex_double *ap, lapack_complex_double *a, lapack_int
    *lda, lapack_int *info)
void LAPACK_ctpttr (char *uplo, lapack_int *n, const
    lapack_complex_float *ap, lapack_complex_float *a, lapack_int *lda,
    lapack_int *info)
void LAPACK_dtrttf (char *transr, char *uplo, lapack_int *n, const
    double *a, lapack_int *lda, double *arf, lapack_int *info)
void LAPACK_strttf (char *transr, char *uplo, lapack_int *n, const float
    *a, lapack_int *lda, float *arf, lapack_int *info)
void LAPACK_ztrttf (char *transr, char *uplo, lapack_int *n, const
    lapack_complex_double *a, lapack_int *lda, lapack_complex_double
    *arf, lapack_int *info)
void LAPACK_ctrttf (char *transr, char *uplo, lapack_int *n, const
    lapack_complex_float *a, lapack_int *lda, lapack_complex_float *arf,
    lapack_int *info)
void LAPACK_dtrttp (char *uplo, lapack_int *n, const double *a,
    lapack_int *lda, double *ap, lapack_int *info)
void LAPACK_strttp (char *uplo, lapack_int *n, const float *a,
    lapack_int *lda, float *ap, lapack_int *info)
void LAPACK_ztrttp (char *uplo, lapack_int *n, const
    lapack_complex_double *a, lapack_int *lda, lapack_complex_double
    *ap, lapack_int *info)
void LAPACK_ctrttp (char *uplo, lapack_int *n, const
    lapack_complex_float *a, lapack_int *lda, lapack_complex_float *ap,
    lapack_int *info)

Okay so the trick to reading these: the last chunk of letters tells you which pointer is going where 👀 ...tfttp switches from arf to ap, ...tpttf switches from ap to arf, ...tfttr goes arf → a, ...trttf goes a → arf, ...tpttr goes ap → a, ...trttp goes a → ap. Iconic, honestly. Also notice the tiny detail that's easy to miss: the ...tpttr and ...trttp ones have no transr argument at all while the others all do, and ...tpttr / ...trttp take exactly uplo, n, source, lda, dest, info. info shows up in every single one here. 💖


Then we get the QR-besties and the helper crew:

void LAPACK_sgeqrfp (lapack_int *m, lapack_int *n, float *a, lapack_int
    *lda, float *tau, float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_dgeqrfp (lapack_int *m, lapack_int *n, double *a, lapack_int
    *lda, double *tau, double *work, lapack_int *lwork, lapack_int
    *info)
void LAPACK_cgeqrfp (lapack_int *m, lapack_int *n, lapack_complex_float
    *a, lapack_int *lda, lapack_complex_float *tau, lapack_complex_float
    *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zgeqrfp (lapack_int *m, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, lapack_complex_double *tau,
    lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_clacgv (lapack_int *n, lapack_complex_float *x, lapack_int
    *incx)
void LAPACK_zlacgv (lapack_int *n, lapack_complex_double *x, lapack_int
    *incx)
void LAPACK_slarnv (lapack_int *idist, lapack_int *iseed, lapack_int *n,
    float *x)
void LAPACK_dlarnv (lapack_int *idist, lapack_int *iseed, lapack_int *n,
    double *x)
void LAPACK_clarnv (lapack_int *idist, lapack_int *iseed, lapack_int *n,
    lapack_complex_float *x)
void LAPACK_zlarnv (lapack_int *idist, lapack_int *iseed, lapack_int *n,
    lapack_complex_double *x)
void LAPACK_sgeqr2 (lapack_int *m, lapack_int *n, float *a, lapack_int
    *lda, float *tau, float *work, lapack_int *info)
void LAPACK_dgeqr2 (lapack_int *m, lapack_int *n, double *a, lapack_int
    *lda, double *tau, double *work, lapack_int *info)
void LAPACK_cgeqr2 (lapack_int *m, lapack_int *n, lapack_complex_float
    *a, lapack_int *lda, lapack_complex_float *tau, lapack_complex_float
    *work, lapack_int *info)
void LAPACK_zgeqr2 (lapack_int *m, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, lapack_complex_double *tau,
    lapack_complex_double *work, lapack_int *info)

geqrfp takes m, n, a, lda, tau, work, lwork, info — and her little sister geqr2 is the exact same list minus lwork. Catch that. 🦋 Meanwhile lacgv is just n, x, incx (and only the complex ones exist, clacgv and zlacgv, no s/d version — don't go looking, it's not here) and larnv is idist, iseed, n, x in all four flavors. Short and sweet, we love her. ✨


void LAPACK_slacn2 (lapack_int *n, float *v, float *x, lapack_int *isgn,
    float *est, lapack_int *kase, lapack_int *isave)
void LAPACK_dlacn2 (lapack_int *n, double *v, double *x, lapack_int
    *isgn, double *est, lapack_int *kase, lapack_int *isave)
void LAPACK_clacn2 (lapack_int *n, lapack_complex_float *v,
    lapack_complex_float *x, float *est, lapack_int *kase, lapack_int
    *isave)
void LAPACK_zlacn2 (lapack_int *n, lapack_complex_double *v,
    lapack_complex_double *x, double *est, lapack_int *kase, lapack_int
    *isave)
void LAPACK_slacpy (char *uplo, lapack_int *m, lapack_int *n, const
    float *a, lapack_int *lda, float *b, lapack_int *ldb)
void LAPACK_dlacpy (char *uplo, lapack_int *m, lapack_int *n, const
    double *a, lapack_int *lda, double *b, lapack_int *ldb)
void LAPACK_clacpy (char *uplo, lapack_int *m, lapack_int *n, const
    lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
    lapack_int *ldb)
void LAPACK_zlacpy (char *uplo, lapack_int *m, lapack_int *n, const
    lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
    lapack_int *ldb)
void LAPACK_clacp2 (char *uplo, lapack_int *m, lapack_int *n, const
    float *a, lapack_int *lda, lapack_complex_float *b, lapack_int *ldb)
void LAPACK_zlacp2 (char *uplo, lapack_int *m, lapack_int *n, const
    double *a, lapack_int *lda, lapack_complex_double *b, lapack_int
    *ldb)
void LAPACK_sgetf2 (lapack_int *m, lapack_int *n, float *a, lapack_int
    *lda, lapack_int *ipiv, lapack_int *info)
void LAPACK_dgetf2 (lapack_int *m, lapack_int *n, double *a, lapack_int
    *lda, lapack_int *ipiv, lapack_int *info)
void LAPACK_cgetf2 (lapack_int *m, lapack_int *n, lapack_complex_float
    *a, lapack_int *lda, lapack_int *ipiv, lapack_int *info)
void LAPACK_zgetf2 (lapack_int *m, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, lapack_int *ipiv, lapack_int *info)
void LAPACK_slaswp (lapack_int *n, float *a, lapack_int *lda, lapack_int
    *k1, lapack_int *k2, const lapack_int *ipiv, lapack_int *incx)
void LAPACK_dlaswp (lapack_int *n, double *a, lapack_int *lda,
    lapack_int *k1, lapack_int *k2, const lapack_int *ipiv, lapack_int
    *incx)
void LAPACK_claswp (lapack_int *n, lapack_complex_float *a, lapack_int
    *lda, lapack_int *k1, lapack_int *k2, const lapack_int *ipiv,
    lapack_int *incx)
void LAPACK_zlaswp (lapack_int *n, lapack_complex_double *a, lapack_int
    *lda, lapack_int *k1, lapack_int *k2, const lapack_int *ipiv,
    lapack_int *incx)

Quick tour: lacn2 is the long one with isgn, est, kase and isave (and note the s/d versions take a real isgn, while the c/z ones drop isgn entirely and keep est real — it's right there in the signatures 👑). lacpy is the four-flavor uplo, m, n, a, lda, b, ldb copy party. lacp2 only exists for c and z, and look — a is float */double * but b is complex 🎀 getf2 brings ipiv to the function and info along with it. And laswp is n, a, lda, k1, k2, ipiv, incx with ipiv marked const for all four. Consistency is her love language. 💜


And last stretch for this part — the norm girlies and the multiply girlies:

float LAPACK_slange (char *norm, lapack_int *m, lapack_int *n, const
    float *a, lapack_int *lda, float *work)
double LAPACK_dlange (char *norm, lapack_int *m, lapack_int *n, const
    double *a, lapack_int *lda, double *work)
float LAPACK_clange (char *norm, lapack_int *m, lapack_int *n, const
    lapack_complex_float *a, lapack_int *lda, float *work)
double LAPACK_zlange (char *norm, lapack_int *m, lapack_int *n, const
    lapack_complex_double *a, lapack_int *lda, double *work)
float LAPACK_clanhe (char *norm, char *uplo, lapack_int *n, const
    lapack_complex_float *a, lapack_int *lda, float *work)
double LAPACK_zlanhe (char *norm, char *uplo, lapack_int *n, const
    lapack_complex_double *a, lapack_int *lda, double *work)
void LAPACK_clarcm (lapack_int *m, lapack_int *n, const float *a,
    lapack_int *lda, const lapack_complex_float *b, lapack_int *ldb,
    lapack_complex_float *c, lapack_int *ldc, float *work)
void LAPACK_zlarcm (lapack_int *m, lapack_int *n, const double *a,
    lapack_int *lda, const lapack_complex_double *b, lapack_int *ldb,
    lapack_complex_double *c, lapack_int *ldc, double *work)
void LAPACK_clacrm (lapack_int *m, lapack_int *n, const
    lapack_complex_float *a, lapack_int *lda, const float *b, lapack_int
    *ldb, lapack_complex_float *c, lapack_int *ldc, float *work)
void LAPACK_zlacrm (lapack_int *m, lapack_int *n, const
    lapack_complex_double *a, lapack_int *lda, const double *b,

Okay the lange / lanhe ones are the only entries on this whole stretch that actually return something (float / double, no void) — everyone else here is a void. And lanhe only has c and z versions, no s/d, because hermitian needs complex data, bestie 💀

Then larcm vs lacrm: same four letters, different order, different types. larcm = real a × complex b → complex c, lacrm = complex a × real b → complex c. Both have m, n, lda, ldb, ldc, work, both mark a and b const, both hand you back a writable c. Fr fr do not mix them up 😭 and that's exactly where LAPACK_zlacrm is cut off — mid-signature, const double *b, and then the page moves on in the next part 🫶

...and that lonely leftover line up top, lapack_int *ldb, lapack_complex_double *c, lapack_int *ldc, double *work) — yeah bestie, that's just the tail end of the prototype from the last chunk, she's fine, she's just finishing her sentence 💅


matrix normies 🌸

Okay so these are the "how big is this thing actually" girlies. Four precisions each, and they all take pointers to everything, even the poor little scalar return values, because LAPACK does not believe in passing anything by value, ever, periodt:

       float LAPACK_slansy (char *norm, char *uplo, lapack_int *n, const float
           *a, lapack_int *lda, float *work)
       double LAPACK_dlansy (char *norm, char *uplo, lapack_int *n, const
           double *a, lapack_int *lda, double *work)
       float LAPACK_clansy (char *norm, char *uplo, lapack_int *n, const
           lapack_complex_float *a, lapack_int *lda, float *work)
       double LAPACK_zlansy (char *norm, char *uplo, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, double *work)
       float LAPACK_slantr (char *norm, char *uplo, char *diag, lapack_int *m,
           lapack_int *n, const float *a, lapack_int *lda, float *work)
       double LAPACK_dlantr (char *norm, char *uplo, char *diag, lapack_int *m,
           lapack_int *n, const double *a, lapack_int *lda, double *work)
       float LAPACK_clantr (char *norm, char *uplo, char *diag, lapack_int *m,
           lapack_int *n, const lapack_complex_float *a, lapack_int *lda, float
           *work)
       double LAPACK_zlantr (char *norm, char *uplo, char *diag, lapack_int *m,
           lapack_int *n, const lapack_complex_double *a, lapack_int *lda,
           double *work)
       float LAPACK_slamch (char *cmach)
       double LAPACK_dlamch (char *cmach)

Notice slantr and friends get an extra char *diag because triangles are special like that ✨ and lansy/lantr take char *norm and char *uplo as pointers to chars, which is giving "I learned C in 1988 and I'm thriving" energy. And then slamch/dlamch are just... vibing with a single char *cmach, no matrix at all — the s and d girlies only, no complex version, that's the whole list, don't come for me 🫶


the factorization-adjacent besties 🎀

       void LAPACK_sgelq2 (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, float *tau, float *work, lapack_int *info)
       void LAPACK_dgelq2 (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, double *tau, double *work, lapack_int *info)
       void LAPACK_cgelq2 (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_complex_float *tau, lapack_complex_float
           *work, lapack_int *info)
       void LAPACK_zgelq2 (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_complex_double *tau,
           lapack_complex_double *work, lapack_int *info)
       void LAPACK_slarfb (char *side, char *trans, char *direct, char *storev,
           lapack_int *m, lapack_int *n, lapack_int *k, const float *v,
           lapack_int *ldv, const float *t, lapack_int *ldt, float *c,
           lapack_int *ldc, float *work, lapack_int *ldwork)
       void LAPACK_dlarfb (char *side, char *trans, char *direct, char *storev,
           lapack_int *m, lapack_int *n, lapack_int *k, const double *v,
           lapack_int *ldv, const double *t, lapack_int *ldt, double *c,
           lapack_int *ldc, double *work, lapack_int *ldwork)
       void LAPACK_clarfb (char *side, char *trans, char *direct, char *storev,
           lapack_int *m, lapack_int *n, lapack_int *k, const
           lapack_complex_float *v, lapack_int *ldv, const lapack_complex_float
           *t, lapack_int *ldt, lapack_complex_float *c, lapack_int *ldc,
           lapack_complex_float *work, lapack_int *ldwork)
       void LAPACK_zlarfb (char *side, char *trans, char *direct, char *storev,
           lapack_int *m, lapack_int *n, lapack_int *k, const
           lapack_complex_double *v, lapack_int *ldv, const
           lapack_complex_double *t, lapack_int *ldt, lapack_complex_double *c,
           lapack_int *ldc, lapack_complex_double *work, lapack_int *ldwork)

larfb said "I'm gonna need four char * flags before we even get to the numbers" and honestly? Iconic. side, trans, direct, storev — a whole little personality quiz before any math happens 🌈 Also lowkey obsessed with the fact that sgelq2 and dgelq2 hand you an info for the tea, but the work array and tau get top billing first. Order matters, bestie.


the tiny workhorses 🔥

       void LAPACK_slarfg (lapack_int *n, float *alpha, float *x, lapack_int
           *incx, float *tau)
       void LAPACK_dlarfg (lapack_int *n, double *alpha, double *x, lapack_int
           *incx, double *tau)
       void LAPACK_clarfg (lapack_int *n, lapack_complex_float *alpha,
           lapack_complex_float *x, lapack_int *incx, lapack_complex_float
           *tau)
       void LAPACK_zlarfg (lapack_int *n, lapack_complex_double *alpha,
           lapack_complex_double *x, lapack_int *incx, lapack_complex_double
           *tau)
       void LAPACK_slassq (lapack_int *n, float *x, lapack_int *incx, float
           *scale, float *sumsq)
       void LAPACK_dlassq (lapack_int *n, double *x, lapack_int *incx, double
           *scale, double *sumsq)
       void LAPACK_classq (lapack_int *n, lapack_complex_float *x, lapack_int
           *incx, float *scale, float *sumsq)
       void LAPACK_zlassq (lapack_int *n, lapack_complex_double *x, lapack_int
           *incx, double *scale, double *sumsq)

larfg girlies: no info, no work, just n, alpha, x, incx, tau and vibes. lassq is the same deal but with scale and sumsq instead — and yes, the complex versions still take real float/double scale and sumsq scalars, look at it, it's right there 💀


more factorization scaffolding 🦋

       void LAPACK_slarft (char *direct, char *storev, lapack_int *n,
           lapack_int *k, const float *v, lapack_int *ldv, const float *tau,
           float *t, lapack_int *ldt)
       void LAPACK_dlarft (char *direct, char *storev, lapack_int *n,
           lapack_int *k, const double *v, lapack_int *ldv, const double *tau,
           double *t, lapack_int *ldt)
       void LAPACK_clarft (char *direct, char *storev, lapack_int *n,
           lapack_int *k, const lapack_complex_float *v, lapack_int *ldv, const
           lapack_complex_float *tau, lapack_complex_float *t, lapack_int *ldt)
       void LAPACK_zlarft (char *direct, char *storev, lapack_int *n,
           lapack_int *k, const lapack_complex_double *v, lapack_int *ldv,
           const lapack_complex_double *tau, lapack_complex_double *t,
           lapack_int *ldt)
       void LAPACK_slarfx (char *side, lapack_int *m, lapack_int *n, const
           float *v, float *tau, float *c, lapack_int *ldc, float *work)
       void LAPACK_dlarfx (char *side, lapack_int *m, lapack_int *n, const
           double *v, double *tau, double *c, lapack_int *ldc, double *work)
       void LAPACK_clarfx (char *side, lapack_int *m, lapack_int *n, const
           lapack_complex_float *v, lapack_complex_float *tau,
           lapack_complex_float *c, lapack_int *ldc, lapack_complex_float
           *work)
       void LAPACK_zlarfx (char *side, lapack_int *m, lapack_int *n, const
           lapack_complex_double *v, lapack_complex_double *tau,
           lapack_complex_double *c, lapack_int *ldc, lapack_complex_double
           *work)

Note the difference bestie — larft has const on v and tau but not on t, while larfx has const on v only, and tau and c are wide open for business. Const-correctness is a spectrum and LAPACK is on it 🙈 Neither of these has an info, so if something goes sideways, that's between you and your god.


the matrix generator era 👑

       void LAPACK_slatms (lapack_int *m, lapack_int *n, char *dist, lapack_int
           *iseed, char *sym, float *d, lapack_int *mode, float *cond, float
           *dmax, lapack_int *kl, lapack_int *ku, char *pack, float *a,
           lapack_int *lda, float *work, lapack_int *info)
       void LAPACK_dlatms (lapack_int *m, lapack_int *n, char *dist, lapack_int
           *iseed, char *sym, double *d, lapack_int *mode, double *cond, double
           *dmax, lapack_int *kl, lapack_int *ku, char *pack, double *a,
           lapack_int *lda, double *work, lapack_int *info)
       void LAPACK_clatms (lapack_int *m, lapack_int *n, char *dist, lapack_int
           *iseed, char *sym, float *d, lapack_int *mode, float *cond, float
           *dmax, lapack_int *kl, lapack_int *ku, char *pack,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float
           *work, lapack_int *info)
       void LAPACK_zlatms (lapack_int *m, lapack_int *n, char *dist, lapack_int
           *iseed, char *sym, double *d, lapack_int *mode, double *cond, double
           *dmax, lapack_int *kl, lapack_int *ku, char *pack,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double
           *work, lapack_int *info)

Sixteen arguments. Sixteen. dist, iseed, sym, mode, cond, dmax, kl, ku, pack — she's got the whole alphabet in there and she's not sorry. Also peep that clatms/zlatms take a real d, cond and dmax even though the matrix is complex, because consistency is for other people 💅 And yes, info is back, we love a return-to-form.


precision glow-ups ✨

       void LAPACK_slag2d (lapack_int *m, lapack_int *n, const float *sa,
           lapack_int *ldsa, double *a, lapack_int *lda, lapack_int *info)
       void LAPACK_dlag2s (lapack_int *m, lapack_int *n, const double *a,
           lapack_int *lda, float *sa, lapack_int *ldsa, lapack_int *info)
       void LAPACK_clag2z (lapack_int *m, lapack_int *n, const
           lapack_complex_float *sa, lapack_int *ldsa, lapack_complex_double
           *a, lapack_int *lda, lapack_int *info)
       void LAPACK_zlag2c (lapack_int *m, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, lapack_complex_float *sa,
           lapack_int *ldsa, lapack_int *info)

Okay so watch the naming, this is the cute part: slag2d and clag2z go little → big (sa → a, ldsa → lda), while dlag2s and zlag2c go big → little (a → sa, lda → ldsa). The single/double pair flip the argument order to match, and the complex pair do too. Iykyk — read the type, not the vibe check 🫶 The input is const, the output is not, and info rides along on all four.

       void LAPACK_slauum (char *uplo, lapack_int *n, float *a, lapack_int
           *lda, lapack_int *info)
       void LAPACK_dlauum (char *uplo, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *info)
       void LAPACK_clauum (char *uplo, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, lapack_int *info)
       void LAPACK_zlauum (char *uplo, lapack_int *n, lapack_complex_double *a,
           lapack_int *lda, lapack_int *info)

Short, sweet, uplo, n, a, lda, info, done. Honestly refreshing after the sixteen-argument situation up there 😭


fill it, scale it, sort it 🌸

       void LAPACK_slagge (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const float *d, float *a, lapack_int *lda,
           lapack_int *iseed, float *work, lapack_int *info)
       void LAPACK_dlagge (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const double *d, double *a, lapack_int *lda,
           lapack_int *iseed, double *work, lapack_int *info)
       void LAPACK_clagge (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const float *d, lapack_complex_float *a, lapack_int
           *lda, lapack_int *iseed, lapack_complex_float *work, lapack_int
           *info)
       void LAPACK_zlagge (lapack_int *m, lapack_int *n, lapack_int *kl,
           lapack_int *ku, const double *d, lapack_complex_double *a,
           lapack_int *lda, lapack_int *iseed, lapack_complex_double *work,
           lapack_int *info)

lagge girlies get kl and ku (yes, both, always, even when they're irrelevant — not my business, that's just the signature, don't shoot the messenger 💀) plus a const d and a mutable iseed. Complex versions again take real float/double d. The pattern is pattern-ing.

       void LAPACK_slascl (char *type, lapack_int *kl, lapack_int *ku, float
           *cfrom, float *cto, lapack_int *m, lapack_int *n, float *a,
           lapack_int *lda, lapack_int *info)
       void LAPACK_dlascl (char *type, lapack_int *kl, lapack_int *ku, double
           *cfrom, double *cto, lapack_int *m, lapack_int *n, double *a,
           lapack_int *lda, lapack_int *info)
       void LAPACK_clascl (char *type, lapack_int *kl, lapack_int *ku, float
           *cfrom, float *cto, lapack_int *m, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, lapack_int *info)
       void LAPACK_zlascl (char *type, lapack_int *kl, lapack_int *ku, double
           *cfrom, double *cto, lapack_int *m, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, lapack_int *info)

cfrom and cto are not const on the complex ones — nope, plain float/double pointers for all four. That's just how she's written, bestie, write it down 🎀

       void LAPACK_slaset (char *uplo, lapack_int *m, lapack_int *n, float
           *alpha, float *beta, float *a, lapack_int *lda)
       void LAPACK_dlaset (char *uplo, lapack_int *m, lapack_int *n, double
           *alpha, double *beta, double *a, lapack_int *lda)
       void LAPACK_claset (char *uplo, lapack_int *m, lapack_int *n,
           lapack_complex_float *alpha, lapack_complex_float *beta,
           lapack_complex_float *a, lapack_int *lda)
       void LAPACK_zlaset (char *uplo, lapack_int *m, lapack_int *n,
           lapack_complex_double *alpha, lapack_complex_double *beta,
           lapack_complex_double *a, lapack_int *lda)
       void LAPACK_slasrt (char *id, lapack_int *n, float *d, lapack_int *info)
       void LAPACK_dlasrt (char *id, lapack_int *n, double *d, lapack_int
           *info)

laset has no info (she's confident, she doesn't need the validation) and lasrt only exists in s and d — no clasrt, no zlasrt, that's the entire roster, don't @ me 😭


the symmetric/hermitian generators 🧚

       void LAPACK_claghe (lapack_int *n, lapack_int *k, const float *d,
           lapack_complex_float *a, lapack_int *lda, lapack_int *iseed,
           lapack_complex_float *work, lapack_int *info)
       void LAPACK_zlaghe (lapack_int *n, lapack_int *k, const double *d,
           lapack_complex_double *a, lapack_int *lda, lapack_int *iseed,
           lapack_complex_double *work, lapack_int *info)
       void LAPACK_slagsy (lapack_int *n, lapack_int *k, const float *d, float
           *a, lapack_int *lda, lapack_int *iseed, float *work, lapack_int
           *info)
       void LAPACK_dlagsy (lapack_int *n, lapack_int *k, const double *d,
           double *a, lapack_int *lda, lapack_int *iseed, double *work,
           lapack_int *info)
       void LAPACK_clagsy (lapack_int *n, lapack_int *k, const float *d,
           lapack_complex_float *a, lapack_int *lda, lapack_int *iseed,
           lapack_complex_float *work, lapack_int *info)
       void LAPACK_zlagsy (lapack_int *n, lapack_int *k, const double *d,
           lapack_complex_double *a, lapack_int *lda, lapack_int *iseed,

And we're cutting off mid-zlagsy — that lapack_int *iseed, is just hanging there like a text message that got sent too early 💀 Hold that thought, bestie, we pick it up in the next chunk...

…and we're picking up right in the middle of a signature, bestie, don't panic — that's just how the function listings in this header roll 💅

           lapack_complex_double *work, lapack_int *info)

Okay so now we hit the permutation girlies — the lapmr/lapmt quartet, which come in all four flavors (that's s/d/c/z for float / double / complex float / complex double, iykyk):

       void LAPACK_slapmr (lapack_logical *forwrd, lapack_int *m, lapack_int
           *n, float *x, lapack_int *ldx, lapack_int *k)
       void LAPACK_dlapmr (lapack_logical *forwrd, lapack_int *m, lapack_int
           *n, double *x, lapack_int *ldx, lapack_int *k)
       void LAPACK_clapmr (lapack_logical *forwrd, lapack_int *m, lapack_int
           *n, lapack_complex_float *x, lapack_int *ldx, lapack_int *k)
       void LAPACK_zlapmr (lapack_logical *forwrd, lapack_int *m, lapack_int
           *n, lapack_complex_double *x, lapack_int *ldx, lapack_int *k)
       void LAPACK_slapmt (lapack_logical *forwrd, lapack_int *m, lapack_int
           *n, float *x, lapack_int *ldx, lapack_int *k)
       void LAPACK_dlapmt (lapack_logical *forwrd, lapack_int *m, lapack_int
           *n, double *x, lapack_int *ldx, lapack_int *k)
       void LAPACK_clapmt (lapack_logical *forwrd, lapack_int *m, lapack_int
           *n, lapack_complex_float *x, lapack_int *ldx, lapack_int *k)
       void LAPACK_zlapmt (lapack_logical *forwrd, lapack_int *m, lapack_int
           *n, lapack_complex_double *x, lapack_int *ldx, lapack_int *k)

Notice <pink>**lapmr**</pink> and <pink>**lapmt**</pink> have literally identical argument lists — forwrd, m, n, x, ldx, k — so yes, they're twins, that's not a typo, keep scrolling 🫶


🌸 the tiny math helpers (they're little but they ate)

Next up: <purple>**lapy2**</purple> and <purple>**lapy3**</purple> — and bestie, look at the return types, they're the only ones in this whole stretch returning a value instead of being void:

       float LAPACK_slapy2 (float *x, float *y)
       double LAPACK_dlapy2 (double *x, double *y)
       float LAPACK_slapy3 (float *x, float *y, float *z)
       double LAPACK_dlapy3 (double *x, double *y, double *z)

Only s and d for these two, no complex versions — that's not me gatekeeping, that's literally the list 😌


🎀 lartgp & lartgs — the plane-rotation girlies

       void LAPACK_slartgp (float *f, float *g, float *cs, float *sn, float *r)
       void LAPACK_dlartgp (double *f, double *g, double *cs, double *sn,
           double *r)
       void LAPACK_slartgs (float *x, float *y, float *sigma, float *cs, float
           *sn)
       void LAPACK_dlartgs (double *x, double *y, double *sigma, double *cs,
           double *sn)

lartgp takes f, g, cs, sn, r. lartgs takes x, y, sigma, cs, sn. Both hand you back cs and sn — the classic cosine/sine pair — and again, <italic>s</italic> and <italic>d</italic> only, no complex siblings fr fr 💖


💅 the complex-only club: bbcsd + the he/ sy family

Brace yourself, <hotpink>**LAPACK_cbbcsd**</hotpink> is that girl with the long signature — twenty-something arguments, and she has a rwork/lrwork pair at the end (that's the real-array work space, so even the complex version needs the real girlies to help out):

       void LAPACK_cbbcsd (char *jobu1, char *jobu2, char *jobv1t, char
           *jobv2t, char *trans, lapack_int *m, lapack_int *p, lapack_int *q,
           float *theta, float *phi, lapack_complex_float *u1, lapack_int
           *ldu1, lapack_complex_float *u2, lapack_int *ldu2,
           lapack_complex_float *v1t, lapack_int *ldv1t, lapack_complex_float
           *v2t, lapack_int *ldv2t, float *b11d, float *b11e, float *b12d,
           float *b12e, float *b21d, float *b21e, float *b22d, float *b22e,
           float *rwork, lapack_int *lrwork, lapack_int *info)

Then the Hermitian he crew — swap, triangular inverse (two versions!), and solve:

       void LAPACK_cheswapr (char *uplo, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_int *i1, lapack_int *i2)
       void LAPACK_chetri2 (char *uplo, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, const lapack_int *ipiv, lapack_complex_float *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_chetri2x (char *uplo, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, const lapack_int *ipiv, lapack_complex_float
           *work, lapack_int *nb, lapack_int *info)
       void LAPACK_chetrs2 (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, const lapack_int *ipiv,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
           *work, lapack_int *info)
real talk: cheswapr has no info and no work — she just swaps and leaves, iconic. The others all report back through *info. Also peep the const on ipiv — she does not get modified, respect her boundaries 💀

🦋 the complex symmetric sy family (yes it's a different family, keep up)

       void LAPACK_csyconv (char *uplo, char *way, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, const lapack_int *ipiv,
           lapack_complex_float *e, lapack_int *info)
       void LAPACK_csyswapr (char *uplo, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_int *i1, lapack_int *i2)
       void LAPACK_csytri2 (char *uplo, lapack_int *n, lapack_complex_float *a,
           lapack_int *lda, const lapack_int *ipiv, lapack_complex_float *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_csytri2x (char *uplo, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, const lapack_int *ipiv, lapack_complex_float
           *work, lapack_int *nb, lapack_int *info)
       void LAPACK_csytrs2 (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, const lapack_int *ipiv,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
           *work, lapack_int *info)

csyconv is the extra-special one here — she's got the way argument and an e output that the tri2/trs2 girlies don't have. Not me noticing the details, I just did ✨


👑 the CS decomposition trilogy: unbdb, uncsd, uncsd2by1

These are the big ones — <rainbow>**cunbdb**</rainbow>, <rainbow>**cuncsd**</rainbow>, <rainbow>**cuncsd2by1**</rainbow>. They take the four-block layout (x11, x12, x21, x22 with their ldx buddies), plus theta (and phi where she's invited):

       void LAPACK_cunbdb (char *trans, char *signs, lapack_int *m, lapack_int
           *p, lapack_int *q, lapack_complex_float *x11, lapack_int *ldx11,
           lapack_complex_float *x12, lapack_int *ldx12, lapack_complex_float
           *x21, lapack_int *ldx21, lapack_complex_float *x22, lapack_int
           *ldx22, float *theta, float *phi, lapack_complex_float *taup1,
           lapack_complex_float *taup2, lapack_complex_float *tauq1,
           lapack_complex_float *tauq2, lapack_complex_float *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_cuncsd (char *jobu1, char *jobu2, char *jobv1t, char
           *jobv2t, char *trans, char *signs, lapack_int *m, lapack_int *p,
           lapack_int *q, lapack_complex_float *x11, lapack_int *ldx11,
           lapack_complex_float *x12, lapack_int *ldx12, lapack_complex_float
           *x21, lapack_int *ldx21, lapack_complex_float *x22, lapack_int
           *ldx22, float *theta, lapack_complex_float *u1, lapack_int *ldu1,
           lapack_complex_float *u2, lapack_int *ldu2, lapack_complex_float
           *v1t, lapack_int *ldv1t, lapack_complex_float *v2t, lapack_int
           *ldv2t, lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *lrwork, lapack_int *iwork, lapack_int *info)
       void LAPACK_cuncsd2by1 (char *jobu1, char *jobu2, char *jobv1t,
           lapack_int *m, lapack_int *p, lapack_int *q, lapack_complex_float
           *x11, lapack_int *ldx11, lapack_complex_float *x21, lapack_int
           *ldx21, float *theta, lapack_complex_float *u1, lapack_int *ldu1,
           lapack_complex_float *u2, lapack_int *ldu2, lapack_complex_float
           *v1t, lapack_int *ldv1t, lapack_complex_float *work, lapack_int
           *lwork, float *rwork, lapack_int *lrwork, lapack_int *iwork,
           lapack_int *info)

the way <hotpink>**cunbdb**</hotpink> is the only one without jobu1/jobu2/jobv1t/jobv2t… she doesn't need job flags, she is the job 😤 and <hotpink>**cuncsd2by1**</hotpink> drops the x12/x22 blocks and their ldx friends entirely — two-by-one, get it? the name ate 💅


🌈 double precision time: dbbcsd, dorbdb, dorcsd, dorcsd2by1

Same shapes, <blue>double` everywhere, no complex types in sight:

       void LAPACK_dbbcsd (char *jobu1, char *jobu2, char *jobv1t, char
           *jobv2t, char *trans, lapack_int *m, lapack_int *p, lapack_int *q,
           double *theta, double *phi, double *u1, lapack_int *ldu1, double
           *u2, lapack_int *ldu2, double *v1t, lapack_int *ldv1t, double *v2t,
           lapack_int *ldv2t, double *b11d, double *b11e, double *b12d, double
           *b12e, double *b21d, double *b21e, double *b22d, double *b22e,
           double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dorbdb (char *trans, char *signs, lapack_int *m, lapack_int
           *p, lapack_int *q, double *x11, lapack_int *ldx11, double *x12,
           lapack_int *ldx12, double *x21, lapack_int *ldx21, double *x22,
           lapack_int *ldx22, double *theta, double *phi, double *taup1, double
           *taup2, double *tauq1, double *tauq2, double *work, lapack_int
           *lwork, lapack_int *info)
       void LAPACK_dorcsd (char *jobu1, char *jobu2, char *jobv1t, char
           *jobv2t, char *trans, char *signs, lapack_int *m, lapack_int *p,
           lapack_int *q, double *x11, lapack_int *ldx11, double *x12,
           lapack_int *ldx12, double *x21, lapack_int *ldx21, double *x22,
           lapack_int *ldx22, double *theta, double *u1, lapack_int *ldu1,
           double *u2, lapack_int *ldu2, double *v1t, lapack_int *ldv1t, double
           *v2t, lapack_int *ldv2t, double *work, lapack_int *lwork, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_dorcsd2by1 (char *jobu1, char *jobu2, char *jobv1t,
           lapack_int *m, lapack_int *p, lapack_int *q, double *x11, lapack_int
           *ldx11, double *x21, lapack_int *ldx21, double *theta, double *u1,
           lapack_int *ldu1, double *u2, lapack_int *ldu2, double *v1t,
           lapack_int *ldv1t, double *work, lapack_int *lwork, lapack_int
           *iwork, lapack_int *info)

small detail that matters: <green>**dbbcsd**</green> has work/lwork, but <green>**dorbdb**</green> has no iwork while <green>**dorcsd**</green> and <green>**dorcsd2by1**</green> do. Copy the signature, don't freehand it, please 🫶


🍓 dsyconv / dsyswapr / dsytri2 / dsytri2x / dsytrs2

       void LAPACK_dsyconv (char *uplo, char *way, lapack_int *n, double *a,
           lapack_int *lda, const lapack_int *ipiv, double *e, lapack_int
           *info)
       void LAPACK_dsyswapr (char *uplo, lapack_int *n, double *a, lapack_int
           *lda, lapack_int *i1, lapack_int *i2)
       void LAPACK_dsytri2 (char *uplo, lapack_int *n, double *a, lapack_int
           *lda, const lapack_int *ipiv, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dsytri2x (char *uplo, lapack_int *n, double *a, lapack_int
           *lda, const lapack_int *ipiv, double *work, lapack_int *nb,
           lapack_int *info)
       void LAPACK_dsytrs2 (char *uplo, lapack_int *n, lapack_int *nrhs, const
           double *a, lapack_int *lda, const lapack_int *ipiv, double *b,
           lapack_int *ldb, double *work, lapack_int *info)

dsyconv → has way + e. dsyswapr → has i1 + i2, no ipiv, no info. dsytri2 → lwork. dsytri2x → nb. dsytrs2 → the nrhs/b/ldb solve trio. every girl has her own little accessory, it's giving accessories haul 🎀


⭐ single precision era: sbbcsd, sorbdb, sorcsd, sorcsd2by1

       void LAPACK_sbbcsd (char *jobu1, char *jobu2, char *jobv1t, char
           *jobv2t, char *trans, lapack_int *m, lapack_int *p, lapack_int *q,
           float *theta, float *phi, float *u1, lapack_int *ldu1, float *u2,
           lapack_int *ldu2, float *v1t, lapack_int *ldv1t, float *v2t,
           lapack_int *ldv2t, float *b11d, float *b11e, float *b12d, float
           *b12e, float *b21d, float *b21e, float *b22d, float *b22e, float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_sorbdb (char *trans, char *signs, lapack_int *m, lapack_int
           *p, lapack_int *q, float *x11, lapack_int *ldx11, float *x12,
           lapack_int *ldx12, float *x21, lapack_int *ldx21, float *x22,
           lapack_int *ldx22, float *theta, float *phi, float *taup1, float
           *taup2, float *tauq1, float *tauq2, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_sorcsd (char *jobu1, char *jobu2, char *jobv1t, char
           *jobv2t, char *trans, char *signs, lapack_int *m, lapack_int *p,
           lapack_int *q, float *x11, lapack_int *ldx11, float *x12, lapack_int
           *ldx12, float *x21, lapack_int *ldx21, float *x22, lapack_int
           *ldx22, float *theta, float *u1, lapack_int *ldu1, float *u2,
           lapack_int *ldu2, float *v1t, lapack_int *ldv1t, float *v2t,
           lapack_int *ldv2t, float *work, lapack_int *lwork, lapack_int
           *iwork, lapack_int *info)
       void LAPACK_sorcsd2by1 (char *jobu1, char *jobu2, char *jobv1t,
           lapack_int *m, lapack_int *p, lapack_int *q, float *x11, lapack_int
           *ldx11, float *x21, lapack_int *ldx21, float *theta, float *u1,
           lapack_int *ldu1, float *u2, lapack_int *ldu2, float *v1t,
           lapack_int *ldv1t, float *work, lapack_int *lwork, lapack_int
           *iwork, lapack_int *info)

literally the <blue>dversions but**float**</mint> — same argument names, same order, same everything. once you learn one you learn them all, that's the beauty of the LAPACKE naming thing 💜


🧚 ssyconv / ssyswapr / ssytri2 / ssytri2x / ssytrs2

       void LAPACK_ssyconv (char *uplo, char *way, lapack_int *n, float *a,
           lapack_int *lda, const lapack_int *ipiv, float *e, lapack_int *info)
       void LAPACK_ssyswapr (char *uplo, lapack_int *n, float *a, lapack_int
           *lda, lapack_int *i1, lapack_int *i2)
       void LAPACK_ssytri2 (char *uplo, lapack_int *n, float *a, lapack_int
           *lda, const lapack_int *ipiv, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_ssytri2x (char *uplo, lapack_int *n, float *a, lapack_int
           *lda, const lapack_int *ipiv, float *work, lapack_int *nb,
           lapack_int *info)
       void LAPACK_ssytrs2 (char *uplo, lapack_int *n, lapack_int *nrhs, const
           float *a, lapack_int *lda, const lapack_int *ipiv, float *b,
           lapack_int *ldb, float *work, lapack_int *info)

ssyconv fits on one tidy line because <mint>float` is short — queen of efficiency honestly 🌸


🙈 and now… the z era begins

<purple>**LAPACK_zbbcsd**</purple> is the complex-double bbcsd, and she's cut off mid-signature in this part — do not come for me, the page continues in the next chunk, we literally end on lapack_complex_double with no closing paren, it's a cliffhanger bestie 😭

       void LAPACK_zbbcsd (char *jobu1, char *jobu2, char *jobv1t, char
           *jobv2t, char *trans, lapack_int *m, lapack_int *p, lapack_int *q,
           double *theta, double *phi, lapack_complex_double *u1, lapack_int
           *ldu1, lapack_complex_double *u2, lapack_int *ldu2,
           lapack_complex_double *v1t, lapack_int *ldv1t, lapack_complex_double
note how theta and phi are still plain <blue>doubleeven thoughu1, u2, v1tare**lapack_complex_double**</purple> — mixed types, mixed vibes, that's just how she is. the rest of her arguments (the v2t/ldv2t, the b11d…b22e block, work, lwork, info) are waiting for us on the other side ✨

stay tuned, the <purple>z` girlies are just getting started 💅

...and we're right back in the thick of it, mid-prototype, no warning, no apology. The tail end of the one from before goes like this 🫶

*v2t, lapack_int *ldv2t, double *b11d, double *b11e, double *b12d,
double *b12e, double *b21d, double *b21e, double *b22d, double *b22e,
double *rwork, lapack_int *lrwork, lapack_int *info)

cool cool cool. that's a whole lot of bs and a v2t and we are simply going to move on 💅

Next up it's the zhes / zsy block. Nine of them. Every single one takes lapack_complex_double, and every single parameter is a pointer — yes, n, yes uplo, yes info, all of it, no exceptions. The const crew is the input squad and the bare pointers are the ones getting written to, and honestly that's the whole vibe check right there ✨

void LAPACK_zheswapr (char *uplo, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, lapack_int *i1, lapack_int *i2)
void LAPACK_zhetri2 (char *uplo, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, const lapack_int *ipiv, lapack_complex_double
    *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zhetri2x (char *uplo, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, const lapack_int *ipiv, lapack_complex_double
    *work, lapack_int *nb, lapack_int *info)
void LAPACK_zhetrs2 (char *uplo, lapack_int *n, lapack_int *nrhs, const
    lapack_complex_double *a, lapack_int *lda, const lapack_int *ipiv,
    lapack_complex_double *b, lapack_int *ldb, lapack_complex_double
    *work, lapack_int *info)
void LAPACK_zsyconv (char *uplo, char *way, lapack_int *n,
    lapack_complex_double *a, lapack_int *lda, const lapack_int *ipiv,
    lapack_complex_double *e, lapack_int *info)
void LAPACK_zsyswapr (char *uplo, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, lapack_int *i1, lapack_int *i2)
void LAPACK_zsytri2 (char *uplo, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, const lapack_int *ipiv, lapack_complex_double
    *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zsytri2x (char *uplo, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, const lapack_int *ipiv, lapack_complex_double
    *work, lapack_int *nb, lapack_int *info)
void LAPACK_zsytrs2 (char *uplo, lapack_int *n, lapack_int *nrhs, const
    lapack_complex_double *a, lapack_int *lda, const lapack_int *ipiv,
    lapack_complex_double *b, lapack_int *ldb, lapack_complex_double
    *work, lapack_int *info)

Not me noticing that zheswapr and zsyswapr are twinsies — same exact argument list, uplo, n, a, lda, i1, i2, zero info, zero work. Iconic minimalism. Meanwhile the tri2/tri2x girlies are collecting ipiv and work and nb like Pokémon cards 🎀


Then the big two-width-theta-phi energy section, plus the 2by1 redux. Look at all these x11, x12, x21, x22 and the matching ldx lineup — it's giving grid realness:

void LAPACK_zunbdb (char *trans, char *signs, lapack_int *m, lapack_int
    *p, lapack_int *q, lapack_complex_double *x11, lapack_int *ldx11,
    lapack_complex_double *x12, lapack_int *ldx12, lapack_complex_double
    *x21, lapack_int *ldx21, lapack_complex_double *x22, lapack_int
    *ldx22, double *theta, double *phi, lapack_complex_double *taup1,
    lapack_complex_double *taup2, lapack_complex_double *tauq1,
    lapack_complex_double *tauq2, lapack_complex_double *work,
    lapack_int *lwork, lapack_int *info)
void LAPACK_zuncsd (char *jobu1, char *jobu2, char *jobv1t, char
    *jobv2t, char *trans, char *signs, lapack_int *m, lapack_int *p,
    lapack_int *q, lapack_complex_double *x11, lapack_int *ldx11,
    lapack_complex_double *x12, lapack_int *ldx12, lapack_complex_double
    *x21, lapack_int *ldx21, lapack_complex_double *x22, lapack_int
    *ldx22, double *theta, lapack_complex_double *u1, lapack_int *ldu1,
    lapack_complex_double *u2, lapack_int *ldu2, lapack_complex_double
    *v1t, lapack_int *ldv1t, lapack_complex_double *v2t, lapack_int
    *ldv2t, lapack_complex_double *work, lapack_int *lwork, double
    *rwork, lapack_int *lrwork, lapack_int *iwork, lapack_int *info)
void LAPACK_zuncsd2by1 (char *jobu1, char *jobu2, char *jobv1t,
    lapack_int *m, lapack_int *p, lapack_int *q, lapack_complex_double
    *x11, lapack_int *ldx11, lapack_complex_double *x21, lapack_int
    *ldx21, double *theta, lapack_complex_double *u1, lapack_int *ldu1,
    lapack_complex_double *u2, lapack_int *ldu2, lapack_complex_double
    *v1t, lapack_int *ldv1t, lapack_complex_double *work, lapack_int
    *lwork, double *rwork, lapack_int *lrwork, lapack_int *iwork,
    lapack_int *info)

okay but zuncsd is THAT girl — she's hauling around theta AND rwork AND lrwork AND iwork on top of every single x and u and v1t and v2t and their ld partners. The 2by1 version is the same energy but with the x12/x22 half of the grid left at home and no jobv2t/trans/signs in the club. Obsessed. 🦋


Now the gemqrt quartet, and this is where the s / d / c / z pattern really starts showing off: four functions, same skeleton, only the scalar type swaps. float for s, double for d, lapack_complex_float for c, lapack_complex_double for z. Slay, consistency 💜

void LAPACK_sgemqrt (char *side, char *trans, lapack_int *m, lapack_int
    *n, lapack_int *k, lapack_int *nb, const float *v, lapack_int *ldv,
    const float *t, lapack_int *ldt, float *c, lapack_int *ldc, float
    *work, lapack_int *info)
void LAPACK_dgemqrt (char *side, char *trans, lapack_int *m, lapack_int
    *n, lapack_int *k, lapack_int *nb, const double *v, lapack_int *ldv,
    const double *t, lapack_int *ldt, double *c, lapack_int *ldc, double
    *work, lapack_int *info)
void LAPACK_cgemqrt (char *side, char *trans, lapack_int *m, lapack_int
    *n, lapack_int *k, lapack_int *nb, const lapack_complex_float *v,
    lapack_int *ldv, const lapack_complex_float *t, lapack_int *ldt,
    lapack_complex_float *c, lapack_int *ldc, lapack_complex_float
    *work, lapack_int *info)
void LAPACK_zgemqrt (char *side, char *trans, lapack_int *m, lapack_int
    *n, lapack_int *k, lapack_int *nb, const lapack_complex_double *v,
    lapack_int *ldv, const lapack_complex_double *t, lapack_int *ldt,
    lapack_complex_double *c, lapack_int *ldc, lapack_complex_double
    *work, lapack_int *info)

And then the twelve-function gauntlet: geqrt, geqrt2, geqrt3, times four flavours each. No side, no trans, just m, n, nb (or no nb at all for the 2 and 3 variants) and a t and a work and an info. Note that geqrt2 and geqrt3 drop the nb and the work entirely — they said less is more. Periodt.

void LAPACK_sgeqrt (lapack_int *m, lapack_int *n, lapack_int *nb, float
    *a, lapack_int *lda, float *t, lapack_int *ldt, float *work,
    lapack_int *info)
void LAPACK_dgeqrt (lapack_int *m, lapack_int *n, lapack_int *nb, double
    *a, lapack_int *lda, double *t, lapack_int *ldt, double *work,
    lapack_int *info)
void LAPACK_cgeqrt (lapack_int *m, lapack_int *n, lapack_int *nb,
    lapack_complex_float *a, lapack_int *lda, lapack_complex_float *t,
    lapack_int *ldt, lapack_complex_float *work, lapack_int *info)
void LAPACK_zgeqrt (lapack_int *m, lapack_int *n, lapack_int *nb,
    lapack_complex_double *a, lapack_int *lda, lapack_complex_double *t,
    lapack_int *ldt, lapack_complex_double *work, lapack_int *info)
void LAPACK_sgeqrt2 (lapack_int *m, lapack_int *n, float *a, lapack_int
    *lda, float *t, lapack_int *ldt, lapack_int *info)
void LAPACK_dgeqrt2 (lapack_int *m, lapack_int *n, double *a, lapack_int
    *lda, double *t, lapack_int *ldt, lapack_int *info)
void LAPACK_cgeqrt2 (lapack_int *m, lapack_int *n, lapack_complex_float
    *a, lapack_int *lda, lapack_complex_float *t, lapack_int *ldt,
    lapack_int *info)
void LAPACK_zgeqrt2 (lapack_int *m, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, lapack_complex_double *t, lapack_int *ldt,
    lapack_int *info)
void LAPACK_sgeqrt3 (lapack_int *m, lapack_int *n, float *a, lapack_int
    *lda, float *t, lapack_int *ldt, lapack_int *info)
void LAPACK_dgeqrt3 (lapack_int *m, lapack_int *n, double *a, lapack_int
    *lda, double *t, lapack_int *ldt, lapack_int *info)
void LAPACK_cgeqrt3 (lapack_int *m, lapack_int *n, lapack_complex_float
    *a, lapack_int *lda, lapack_complex_float *t, lapack_int *ldt,
    lapack_int *info)
void LAPACK_zgeqrt3 (lapack_int *m, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, lapack_complex_double *t, lapack_int *ldt,
    lapack_int *info)

tpmqrt time 💀 — side, trans, m, n, k, and l, and nb, then v/ldv, t/ldt, a/lda, b/ldb, work, info. That's a full itinerary. The way this argument list just keeps going, honestly main character energy 🌈

void LAPACK_stpmqrt (char *side, char *trans, lapack_int *m, lapack_int
    *n, lapack_int *k, lapack_int *l, lapack_int *nb, const float *v,
    lapack_int *ldv, const float *t, lapack_int *ldt, float *a,
    lapack_int *lda, float *b, lapack_int *ldb, float *work, lapack_int
    *info)
void LAPACK_dtpmqrt (char *side, char *trans, lapack_int *m, lapack_int
    *n, lapack_int *k, lapack_int *l, lapack_int *nb, const double *v,
    lapack_int *ldv, const double *t, lapack_int *ldt, double *a,
    lapack_int *lda, double *b, lapack_int *ldb, double *work,
    lapack_int *info)
void LAPACK_ctpmqrt (char *side, char *trans, lapack_int *m, lapack_int
    *n, lapack_int *k, lapack_int *l, lapack_int *nb, const
    lapack_complex_float *v, lapack_int *ldv, const lapack_complex_float
    *t, lapack_int *ldt, lapack_complex_float *a, lapack_int *lda,
    lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
    *work, lapack_int *info)
void LAPACK_ztpmqrt (char *side, char *trans, lapack_int *m, lapack_int
    *n, lapack_int *k, lapack_int *l, lapack_int *nb, const
    lapack_complex_double *v, lapack_int *ldv, const
    lapack_complex_double *t, lapack_int *ldt, lapack_complex_double *a,
    lapack_int *lda, lapack_complex_double *b, lapack_int *ldb,
    lapack_complex_double *work, lapack_int *info)

Then tpqrt, which is the same recipe minus the side/trans seasoning:

void LAPACK_stpqrt (lapack_int *m, lapack_int *n, lapack_int *l,
    lapack_int *nb, float *a, lapack_int *lda, float *b, lapack_int
    *ldb, float *t, lapack_int *ldt, float *work, lapack_int *info)
void LAPACK_dtpqrt (lapack_int *m, lapack_int *n, lapack_int *l,
    lapack_int *nb, double *a, lapack_int *lda, double *b, lapack_int
    *ldb, double *t, lapack_int *ldt, double *work, lapack_int *info)
void LAPACK_ctpqrt (lapack_int *m, lapack_int *n, lapack_int *l,
    lapack_int *nb, lapack_complex_float *a, lapack_int *lda,
    lapack_complex_float *b, lapack_int *ldb, lapack_complex_float *t,
    lapack_int *ldt, lapack_complex_float *work, lapack_int *info)
void LAPACK_ztpqrt (lapack_int *m, lapack_int *n, lapack_int *l,
    lapack_int *nb, lapack_complex_double *a, lapack_int *lda,
    lapack_complex_double *b, lapack_int *ldb, lapack_complex_double *t,
    lapack_int *ldt, lapack_complex_double *work, lapack_int *info)

And tpqrt2, where nb and work have left the chat — same as what happened with geqrt2:

void LAPACK_stpqrt2 (lapack_int *m, lapack_int *n, lapack_int *l, float
    *a, lapack_int *lda, float *b, lapack_int *ldb, float *t, lapack_int
    *ldt, lapack_int *info)
void LAPACK_dtpqrt2 (lapack_int *m, lapack_int *n, lapack_int *l, double
    *a, lapack_int *lda, double *b, lapack_int *ldb, double *t,
    lapack_int *ldt, lapack_int *info)
void LAPACK_ctpqrt2 (lapack_int *m, lapack_int *n, lapack_int *l,
    lapack_complex_float *a, lapack_int *lda, lapack_complex_float *b,
    lapack_int *ldb, lapack_complex_float *t, lapack_int *ldt,
    lapack_int *info)
void LAPACK_ztpqrt2 (lapack_int *m, lapack_int *n, lapack_int *l,
    lapack_complex_double *a, lapack_int *lda, lapack_complex_double *b,
    lapack_int *ldb, lapack_complex_double *t, lapack_int *ldt,
    lapack_int *info)

okay and finally the tprfb squad, and bestie you need to look closely at these because 👏 they 👏 are 👏 different 👏. They've got side, trans, direct, and storev up front, then m, n, k, l, then v/ldv, t/ldt, a/lda, b/ldb, and then — get this — const float *work, lapack_int *ldwork. That's a const work and a *ldwork and no info anywhere. Not a single one. 🙈

void LAPACK_stprfb (char *side, char *trans, char *direct, char *storev,
    lapack_int *m, lapack_int *n, lapack_int *k, lapack_int *l, const
    float *v, lapack_int *ldv, const float *t, lapack_int *ldt, float
    *a, lapack_int *lda, float *b, lapack_int *ldb, const float *work,
    lapack_int *ldwork)
void LAPACK_dtprfb (char *side, char *trans, char *direct, char *storev,
    lapack_int *m, lapack_int *n, lapack_int *k, lapack_int *l, const
    double *v, lapack_int *ldv, const double *t, lapack_int *ldt, double
    *a, lapack_int *lda, double *b, lapack_int *ldb, const double *work,
    lapack_int *ldwork)
void LAPACK_ctprfb (char *side, char *trans, char *direct, char *storev,
    lapack_int *m, lapack_int *n, lapack_int *k, lapack_int *l, const
    lapack_complex_float *v, lapack_int *ldv, const lapack_complex_float
    *t, lapack_int *ldt, lapack_complex_float *a, lapack_int *lda,
    lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
    *work, lapack_int *ldwork)
void LAPACK_ztprfb (char *side, char *trans, char *direct, char *storev,

and yes, that's exactly where the page cuts us off — mid-signature, mid-storev, mid-everything. ztprfb is out here teasing us. We'll get the rest of her next time 💀✨

…and it just keeps going, bestie 😭 this is the part where the SYNOPSIS list becomes a whole personality. We're still mid-arg-list from before, so here's the tail end of that one — don't panic, it's not a new function, it's the leftovers:

lapack_int *m, lapack_int *n, lapack_int *k, lapack_int *l, const
lapack_complex_double *v, lapack_int *ldv, const
lapack_complex_double *t, lapack_int *ldt, lapack_complex_double *a,
lapack_int *lda, lapack_complex_double *b, lapack_int *ldb,
lapack_complex_double *work, lapack_int *ldwork)

🎀 the _rook era (yes, all of them)

Okay so first up: a whole squad of routines rocking the _rook suffix. They come in the classic four-flavour lineup — s (float), d (double), c (lapack_complex_float), z (lapack_complex_double) — and sy vs he is the split you'll notice immediately. Here's the entire roll call, no skips, no "and so on" 🙅‍♀️

void LAPACK_ssysv_rook (char *uplo, lapack_int *n, lapack_int *nrhs,
    float *a, lapack_int *lda, lapack_int *ipiv, float *b, lapack_int
    *ldb, float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_ssytrf_rook (char *uplo, lapack_int *n, float *a, lapack_int
    *lda, lapack_int *ipiv, float *work, lapack_int *lwork, lapack_int
    *info)
void LAPACK_dsysv_rook (char *uplo, lapack_int *n, lapack_int *nrhs,
    double *a, lapack_int *lda, lapack_int *ipiv, double *b, lapack_int
    *ldb, double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_dsytrf_rook (char *uplo, lapack_int *n, double *a,
    lapack_int *lda, lapack_int *ipiv, double *work, lapack_int *lwork,
    lapack_int *info)
void LAPACK_csysv_rook (char *uplo, lapack_int *n, lapack_int *nrhs,
    lapack_complex_float *a, lapack_int *lda, lapack_int *ipiv,
    lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
    *work, lapack_int *lwork, lapack_int *info)
void LAPACK_csytrf_rook (char *uplo, lapack_int *n, lapack_complex_float
    *a, lapack_int *lda, lapack_int *ipiv, lapack_complex_float *work,
    lapack_int *lwork, lapack_int *info)
void LAPACK_zsysv_rook (char *uplo, lapack_int *n, lapack_int *nrhs,
    lapack_complex_double *a, lapack_int *lda, lapack_int *ipiv,
    lapack_complex_double *b, lapack_int *ldb, lapack_complex_double
    *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zsytrf_rook (char *uplo, lapack_int *n,
    lapack_complex_double *a, lapack_int *lda, lapack_int *ipiv,
    lapack_complex_double *work, lapack_int *lwork, lapack_int *info)

And the trs trio-plus-one that goes with them 👇

void LAPACK_ssytrs_rook (char *uplo, lapack_int *n, lapack_int *nrhs,
    const float *a, lapack_int *lda, const lapack_int *ipiv, float *b,
    lapack_int *ldb, lapack_int *info)
void LAPACK_dsytrs_rook (char *uplo, lapack_int *n, lapack_int *nrhs,
    const double *a, lapack_int *lda, const lapack_int *ipiv, double *b,
    lapack_int *ldb, lapack_int *info)
void LAPACK_csytrs_rook (char *uplo, lapack_int *n, lapack_int *nrhs,
    const lapack_complex_float *a, lapack_int *lda, const lapack_int
    *ipiv, lapack_complex_float *b, lapack_int *ldb, lapack_int *info)
void LAPACK_zsytrs_rook (char *uplo, lapack_int *n, lapack_int *nrhs,
    const lapack_complex_double *a, lapack_int *lda, const lapack_int
    *ipiv, lapack_complex_double *b, lapack_int *ldb, lapack_int *info)

Then the he girlies show up and honestly they ate:

void LAPACK_chetrf_rook (char *uplo, lapack_int *n, lapack_complex_float
    *a, lapack_int *lda, lapack_int *ipiv, lapack_complex_float *work,
    lapack_int *lwork, lapack_int *info)
void LAPACK_zhetrf_rook (char *uplo, lapack_int *n,
    lapack_complex_double *a, lapack_int *lda, lapack_int *ipiv,
    lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_chetrs_rook (char *uplo, lapack_int *n, lapack_int *nrhs,
    const lapack_complex_float *a, lapack_int *lda, const lapack_int
    *ipiv, lapack_complex_float *b, lapack_int *ldb, lapack_int *info)
void LAPACK_zhetrs_rook (char *uplo, lapack_int *n, lapack_int *nrhs,
    const lapack_complex_double *a, lapack_int *lda, const lapack_int
    *ipiv, lapack_complex_double *b, lapack_int *ldb, lapack_int *info)
💅 notice how every trs version has const on a and ipiv but a naked b? That's not a typo, bestie, that's just how the page lists them. Copy the exact prototypes, don't get creative.

🦋 the random little guys

Two lone syr routines (no s/d version here, just complex, and that's iconic of them) plus ilaver, which is the only one in this whole stretch that isn't packing an uplo:

void LAPACK_csyr (char *uplo, lapack_int *n, lapack_complex_float
    *alpha, const lapack_complex_float *x, lapack_int *incx,
    lapack_complex_float *a, lapack_int *lda)
void LAPACK_zsyr (char *uplo, lapack_int *n, lapack_complex_double
    *alpha, const lapack_complex_double *x, lapack_int *incx,
    lapack_complex_double *a, lapack_int *lda)
void LAPACK_ilaver (const lapack_int *vers_major, const lapack_int
    *vers_minor, const lapack_int *vers_patch)

ilaver taking vers_major, vers_minor, vers_patch is it giving version-number energy? Yes. Is it subtle? Absolutely not. ⭐


✨ the _aa family ✨

Now the suffix changes and the whole cast comes back out. Same argument shapes as before, different letters on the end — this is the part where you go "wait, didn't I just read this?" and the answer is yes, but the name is different so it counts 🙈

Solve-ish ones first:

void LAPACK_ssysv_aa (char *uplo, lapack_int *n, lapack_int *nrhs, float
    *a, lapack_int *lda, lapack_int *ipiv, float *b, lapack_int *ldb,
    float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_dsysv_aa (char *uplo, lapack_int *n, lapack_int *nrhs,
    double *a, lapack_int *lda, lapack_int *ipiv, double *b, lapack_int
    *ldb, double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_csysv_aa (char *uplo, lapack_int *n, lapack_int *nrhs,
    lapack_complex_float *a, lapack_int *lda, lapack_int *ipiv,
    lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
    *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zsysv_aa (char *uplo, lapack_int *n, lapack_int *nrhs,
    lapack_complex_double *a, lapack_int *lda, lapack_int *ipiv,
    lapack_complex_double *b, lapack_int *ldb, lapack_complex_double
    *work, lapack_int *lwork, lapack_int *info)
void LAPACK_chesv_aa (char *uplo, lapack_int *n, lapack_int *nrhs,
    lapack_complex_float *a, lapack_int *lda, lapack_int *ipiv,
    lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
    *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zhesv_aa (char *uplo, lapack_int *n, lapack_int *nrhs,
    lapack_complex_double *a, lapack_int *lda, lapack_int *ipiv,
    lapack_complex_double *b, lapack_int *ldb, lapack_complex_double
    *work, lapack_int *lwork, lapack_int *info)

Factor-y ones, note there's no nrhs and no b here, so the list is shorter — enjoy it while it lasts 🍓

void LAPACK_ssytrf_aa (char *uplo, lapack_int *n, float *a, lapack_int
    *lda, lapack_int *ipiv, float *work, lapack_int *lwork, lapack_int
    *info)
void LAPACK_dsytrf_aa (char *uplo, lapack_int *n, double *a, lapack_int
    *lda, lapack_int *ipiv, double *work, lapack_int *lwork, lapack_int
    *info)
void LAPACK_csytrf_aa (char *uplo, lapack_int *n, lapack_complex_float
    *a, lapack_int *lda, lapack_int *ipiv, lapack_complex_float *work,
    lapack_int *lwork, lapack_int *info)
void LAPACK_zsytrf_aa (char *uplo, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, lapack_int *ipiv, lapack_complex_double *work,
    lapack_int *lwork, lapack_int *info)
void LAPACK_chetrf_aa (char *uplo, lapack_int *n, lapack_complex_float
    *a, lapack_int *lda, lapack_int *ipiv, lapack_complex_float *work,
    lapack_int *lwork, lapack_int *info)
void LAPACK_zhetrf_aa (char *uplo, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, lapack_int *ipiv, lapack_complex_double *work,
    lapack_int *lwork, lapack_int *info)

And the trs six, which are the only _aa ones with both work and b in the mix — highkey the most extra of the group:

void LAPACK_ssytrs_aa (char *uplo, lapack_int *n, lapack_int *nrhs,
    const float *a, lapack_int *lda, const lapack_int *ipiv, float *b,
    lapack_int *ldb, float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_dsytrs_aa (char *uplo, lapack_int *n, lapack_int *nrhs,
    const double *a, lapack_int *lda, const lapack_int *ipiv, double *b,
    lapack_int *ldb, double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_csytrs_aa (char *uplo, lapack_int *n, lapack_int *nrhs,
    const lapack_complex_float *a, lapack_int *lda, const lapack_int
    *ipiv, lapack_complex_float *b, lapack_int *ldb,
    lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zsytrs_aa (char *uplo, lapack_int *n, lapack_int *nrhs,
    const lapack_complex_double *a, lapack_int *lda, const lapack_int
    *ipiv, lapack_complex_double *b, lapack_int *ldb,
    lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_chetrs_aa (char *uplo, lapack_int *n, lapack_int *nrhs,
    const lapack_complex_float *a, lapack_int *lda, const lapack_int
    *ipiv, lapack_complex_float *b, lapack_int *ldb,
    lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zhetrs_aa (char *uplo, lapack_int *n, lapack_int *nrhs,
    const lapack_complex_double *a, lapack_int *lda, const lapack_int
    *ipiv, lapack_complex_double *b, lapack_int *ldb,
    lapack_complex_double *work, lapack_int *lwork, lapack_int *info)

🧚 the _rk girlies (new character alert: e)

Okay so the _rk crew is basically the _aa crew but with an extra e pointer dropped in right after lda in the factor/solve ones. That's the whole vibe shift. The sysv_rk / hesv_rk lineup:

void LAPACK_ssysv_rk (char *uplo, lapack_int *n, lapack_int *nrhs, float
    *a, lapack_int *lda, float *e, lapack_int *ipiv, float *b,
    lapack_int *ldb, float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_dsysv_rk (char *uplo, lapack_int *n, lapack_int *nrhs,
    double *a, lapack_int *lda, double *e, lapack_int *ipiv, double *b,
    lapack_int *ldb, double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_csysv_rk (char *uplo, lapack_int *n, lapack_int *nrhs,
    lapack_complex_float *a, lapack_int *lda, lapack_complex_float *e,
    lapack_int *ipiv, lapack_complex_float *b, lapack_int *ldb,
    lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zsysv_rk (char *uplo, lapack_int *n, lapack_int *nrhs,
    lapack_complex_double *a, lapack_int *lda, lapack_complex_double *e,
    lapack_int *ipiv, lapack_complex_double *b, lapack_int *ldb,
    lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_chesv_rk (char *uplo, lapack_int *n, lapack_int *nrhs,
    lapack_complex_float *a, lapack_int *lda, lapack_complex_float *e,
    lapack_int *ipiv, lapack_complex_float *b, lapack_int *ldb,
    lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zhesv_rk (char *uplo, lapack_int *n, lapack_int *nrhs,
    lapack_complex_double *a, lapack_int *lda, lapack_complex_double *e,
    lapack_int *ipiv, lapack_complex_double *b, lapack_int *ldb,
    lapack_complex_double *work, lapack_int *lwork, lapack_int *info)

The trf_rk ones, also carrying e, no b, no nrhs:

void LAPACK_ssytrf_rk (char *uplo, lapack_int *n, float *a, lapack_int
    *lda, float *e, lapack_int *ipiv, float *work, lapack_int *lwork,
    lapack_int *info)
void LAPACK_dsytrf_rk (char *uplo, lapack_int *n, double *a, lapack_int
    *lda, double *e, lapack_int *ipiv, double *work, lapack_int *lwork,
    lapack_int *info)
void LAPACK_csytrf_rk (char *uplo, lapack_int *n, lapack_complex_float
    *a, lapack_int *lda, lapack_complex_float *e, lapack_int *ipiv,
    lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zsytrf_rk (char *uplo, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, lapack_complex_double *e, lapack_int *ipiv,
    lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
void LAPACK_chetrf_rk (char *uplo, lapack_int *n, lapack_complex_float
    *a, lapack_int *lda, lapack_complex_float *e, lapack_int *ipiv,
    lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
void LAPACK_zhetrf_rk (char *uplo, lapack_int *n, lapack_complex_double
    *a, lapack_int *lda, lapack_complex_double *e, lapack_int *ipiv,
    lapack_complex_double *work, lapack_int *lwork, lapack_int *info)

💀 and now the suffix flipped to _3

Plot twist, bestie: the trs versions of the _rk crew are not called trs_rk, they're called trs_3. Not a typo (we assume, it's what the page says), just vibes. They do keep the e and the const situation from before:

void LAPACK_ssytrs_3 (char *uplo, lapack_int *n, lapack_int *nrhs, const
    float *a, lapack_int *lda, const float *e, const lapack_int *ipiv,
    float *b, lapack_int *ldb, lapack_int *info)
void LAPACK_dsytrs_3 (char *uplo, lapack_int *n, lapack_int *nrhs, const

…and yeah, that's exactly where this part runs out 😭 mid-LAPACK_dsytrs_3, const dangling, absolutely leaving us on a cliffhanger. Next part picks it right back up — don't touch that dial 🫶

okay so we're still in the SYNOPSIS and it's literally just prototype after prototype at this point 💅 but every single one is a main character, so we're giving them all their screen time. no cap, no skipping, we're gonna get through this together. 🫶

first up: the _3 trs girlies. LAPACK_dsytrs_3 started in the last part, so here's the rest of her signature, exactly as promised:

           double *a, lapack_int *lda, const double *e, const lapack_int *ipiv,
           double *b, lapack_int *ldb, lapack_int *info)

and then her sisters in full — LAPACK_csytrs_3, LAPACK_zsytrs_3, LAPACK_chetrs_3, LAPACK_zhetrs_3:

       void LAPACK_csytrs_3 (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *e, const lapack_int *ipiv, lapack_complex_float *b, lapack_int
           *ldb, lapack_int *info)
       void LAPACK_zsytrs_3 (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *e, const lapack_int *ipiv,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)
       void LAPACK_chetrs_3 (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *e, const lapack_int *ipiv, lapack_complex_float *b, lapack_int
           *ldb, lapack_int *info)
       void LAPACK_zhetrs_3 (char *uplo, lapack_int *n, lapack_int *nrhs, const
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *e, const lapack_int *ipiv,
           lapack_complex_double *b, lapack_int *ldb, lapack_int *info)

the way they all take uplo, n, nrhs, a, lda, e, ipiv, b, ldb, info — that's the whole squad. csytrs_3 and chetrs_3 are the lapack_complex_float ones, zsytrs_3 and zhetrs_3 are the lapack_complex_double ones. the sy and he energy is both present and accounted for. slay. 💅


next: the tri_3 crew. they brought work and lwork because they're doing the most (respectfully):

       void LAPACK_ssytri_3 (char *uplo, lapack_int *n, float *a, lapack_int
           *lda, const float *e, const lapack_int *ipiv, float *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_dsytri_3 (char *uplo, lapack_int *n, double *a, lapack_int
           *lda, const double *e, const lapack_int *ipiv, double *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_csytri_3 (char *uplo, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, const lapack_complex_float *e, const lapack_int
           *ipiv, lapack_complex_float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_zsytri_3 (char *uplo, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, const lapack_complex_double *e, const
           lapack_int *ipiv, lapack_complex_double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_chetri_3 (char *uplo, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, const lapack_complex_float *e, const lapack_int
           *ipiv, lapack_complex_float *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_zhetri_3 (char *uplo, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, const lapack_complex_double *e, const
           lapack_int *ipiv, lapack_complex_double *work, lapack_int *lwork,
           lapack_int *info)

ssytri_3 and dsytri_3 are the real float/double ones, csytri_3 and zsytri_3 are complex, chetri_3 and zhetri_3 are the other complex flavor. every single one takes uplo, n, a, lda, e, ipiv, work, lwork, info. the lwork is just sitting there like a little boss. periodt. ✨


then the con_3 squad — condition-estimating energy, and they're all about anorm and rcond:

       void LAPACK_ssycon_3 (char *uplo, lapack_int *n, const float *a,
           lapack_int *lda, const float *e, const lapack_int *ipiv, float
           *anorm, float *rcond, float *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_dsycon_3 (char *uplo, lapack_int *n, const double *a,
           lapack_int *lda, const double *e, const lapack_int *ipiv, double
           *anorm, double *rcond, double *work, lapack_int *iwork, lapack_int
           *info)
       void LAPACK_csycon_3 (char *uplo, lapack_int *n, const
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *e, const lapack_int *ipiv, float *anorm, float *rcond,
           lapack_complex_float *work, lapack_int *info)
       void LAPACK_zsycon_3 (char *uplo, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *e, const lapack_int *ipiv, double *anorm,
           double *rcond, lapack_complex_double *work, lapack_int *info)
       void LAPACK_checon_3 (char *uplo, lapack_int *n, const
           lapack_complex_float *a, lapack_int *lda, const lapack_complex_float
           *e, const lapack_int *ipiv, float *anorm, float *rcond,
           lapack_complex_float *work, lapack_int *info)
       void LAPACK_zhecon_3 (char *uplo, lapack_int *n, const
           lapack_complex_double *a, lapack_int *lda, const
           lapack_complex_double *e, const lapack_int *ipiv, double *anorm,
           double *rcond, lapack_complex_double *work, lapack_int *info)

okay so ssycon_3/dsycon_3 take const float*/const double* for a, e, and ipiv, plus anorm, rcond, work, iwork, info. the complex csycon_3/zsycon_3/checon_3/zhecon_3 take float/double anorm and rcond but lapack_complex_* work — and they don't have iwork in the signature. not me noticing the little differences 👀 anyway, exact tea below.


now we're in the gelq era. sgelq, dgelq, cgelq, zgelq — all of them take m, n, a, lda, t, tsize, work, lwork, info, and tsize is giving mysterious and powerful:

       void LAPACK_sgelq (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, float *t, lapack_int *tsize, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dgelq (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, double *t, lapack_int *tsize, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_cgelq (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_complex_float *t, lapack_int *tsize,
           lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zgelq (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_complex_double *t, lapack_int *tsize,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)

float, double, complex-float, complex-double. same parameter list, different types. iconic behavior. 🎀


and the gemlq besties — they add side, trans, k, and c/ldc into the mix, so they're lowkey doing the most:

       void LAPACK_sgemlq (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const float *a, lapack_int *lda, const float *t,
           lapack_int *tsize, float *c, lapack_int *ldc, float *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_dgemlq (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const double *a, lapack_int *lda, const double
           *t, lapack_int *tsize, double *c, lapack_int *ldc, double *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_cgemlq (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const lapack_complex_float *a, lapack_int *lda,
           const lapack_complex_float *t, lapack_int *tsize,
           lapack_complex_float *c, lapack_int *ldc, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zgemlq (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const lapack_complex_double *a, lapack_int *lda,
           const lapack_complex_double *t, lapack_int *tsize,
           lapack_complex_double *c, lapack_int *ldc, lapack_complex_double
           *work, lapack_int *lwork, lapack_int *info)

sgemlq and dgemlq take const float*/const double* for a and t, then float*/double* for c and work. the complex cgemlq/zgemlq are the same but with lapack_complex_*. side and trans are both char*, tsize is still there, and info is still the final boss. no notes. 💜


next: geqr. yes, the QR girlies. sgeqr, dgeqr, cgeqr, zgeqr all have the exact same m, n, a, lda, t, tsize, work, lwork, info shape as gelq, just different letter energy:

       void LAPACK_sgeqr (lapack_int *m, lapack_int *n, float *a, lapack_int
           *lda, float *t, lapack_int *tsize, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dgeqr (lapack_int *m, lapack_int *n, double *a, lapack_int
           *lda, double *t, lapack_int *tsize, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_cgeqr (lapack_int *m, lapack_int *n, lapack_complex_float
           *a, lapack_int *lda, lapack_complex_float *t, lapack_int *tsize,
           lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zgeqr (lapack_int *m, lapack_int *n, lapack_complex_double
           *a, lapack_int *lda, lapack_complex_double *t, lapack_int *tsize,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)

if you clocked that geqr and gelq have matching parameter lists, congrats, your pattern recognition is slaying. 💅


and the gemqr crew — same deal as gemlq but with a q instead of an l. side, trans, m, n, k, a, lda, t, tsize, c, ldc, work, lwork, info, all present and accounted for:

       void LAPACK_sgemqr (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const float *a, lapack_int *lda, const float *t,
           lapack_int *tsize, float *c, lapack_int *ldc, float *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_dgemqr (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const double *a, lapack_int *lda, const double
           *t, lapack_int *tsize, double *c, lapack_int *ldc, double *work,
           lapack_int *lwork, lapack_int *info)
       void LAPACK_cgemqr (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const lapack_complex_float *a, lapack_int *lda,
           const lapack_complex_float *t, lapack_int *tsize,
           lapack_complex_float *c, lapack_int *ldc, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zgemqr (char *side, char *trans, lapack_int *m, lapack_int
           *n, lapack_int *k, const lapack_complex_double *a, lapack_int *lda,
           const lapack_complex_double *t, lapack_int *tsize,
           lapack_complex_double *c, lapack_int *ldc, lapack_complex_double
           *work, lapack_int *lwork, lapack_int *info)

these are literally the QR equivalents in the same precision lineup — float, double, complex-float, complex-double. we love a consistent queen. 🌈


then getsls — the least-squares girlies are here, and they take trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info. no t, no tsize, just vibes and a b:

       void LAPACK_sgetsls (char *trans, lapack_int *m, lapack_int *n,
           lapack_int *nrhs, float *a, lapack_int *lda, float *b, lapack_int
           *ldb, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dgetsls (char *trans, lapack_int *m, lapack_int *n,
           lapack_int *nrhs, double *a, lapack_int *lda, double *b, lapack_int
           *ldb, double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_cgetsls (char *trans, lapack_int *m, lapack_int *n,
           lapack_int *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *b, lapack_int *ldb, lapack_complex_float
           *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zgetsls (char *trans, lapack_int *m, lapack_int *n,
           lapack_int *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *b, lapack_int *ldb, lapack_complex_double
           *work, lapack_int *lwork, lapack_int *info)

sgetsls/dgetsls are real, cgetsls/zgetsls are complex. same parameter order, different types. and yes, nrhs is there because multiple right-hand sides are a thing. periodt. 🦋


okay now we're entering the _2stage section and it's giving ✨eigenvalue era✨. first the ev_2stage girlies — ssyev_2stage, dsyev_2stage, cheev_2stage, zheev_2stage. they all take jobz, uplo, n, a, lda, w, work, lwork, info, and the complex ones also brought rwork:

       void LAPACK_ssyev_2stage (char *jobz, char *uplo, lapack_int *n, float
           *a, lapack_int *lda, float *w, float *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_dsyev_2stage (char *jobz, char *uplo, lapack_int *n, double
           *a, lapack_int *lda, double *w, double *work, lapack_int *lwork,
           lapack_int *info)
       void LAPACK_cheev_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, float *w,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *info)
       void LAPACK_zheev_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, double *w,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *info)

the real ones ssyev_2stage/dsyev_2stage are chilling with float*/double* w and work. the complex cheev_2stage/zheev_2stage add float*/double* rwork because complex eigenvalues need real workspace, iykyk. slay. 🌸


then evd_2stage — same family but with iwork and liwork added, and the complex ones also get lrwork. they're extra in the best way:

       void LAPACK_ssyevd_2stage (char *jobz, char *uplo, lapack_int *n, float
           *a, lapack_int *lda, float *w, float *work, lapack_int *lwork,
           lapack_int *iwork, lapack_int *liwork, lapack_int *info)
       void LAPACK_dsyevd_2stage (char *jobz, char *uplo, lapack_int *n, double
           *a, lapack_int *lda, double *w, double *work, lapack_int *lwork,
           lapack_int *iwork, lapack_int *liwork, lapack_int *info)
       void LAPACK_cheevd_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, float *w,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork,
           lapack_int *info)
       void LAPACK_zheevd_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, double *w,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork,
           lapack_int *info)

ssyevd_2stage/dsyevd_2stage: jobz, uplo, n, a, lda, w, work, lwork, iwork, liwork, info. cheevd_2stage/zheevd_2stage: same but with rwork, lrwork too. the d in the name is just there to let you know she's different, and honestly? she ate. 💅


and finally for this part, the evx_2stage duo — ssyevx_2stage and dsyevx_2stage. these are the full-glam versions with range, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, iwork, ifail, info. it's a lot, but she ate:

       void LAPACK_ssyevx_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, float *a, lapack_int *lda, float *vl, float *vu,
           lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m, float
           *w, float *z, lapack_int *ldz, float *work, lapack_int *lwork,
           lapack_int *iwork, lapack_int *ifail, lapack_int *info)
       void LAPACK_dsyevx_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, double *a, lapack_int *lda, double *vl, double *vu,
           lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m,
           double *w, double *z, lapack_int *ldz, double *work, lapack_int
           *lwork, lapack_int *iwork, lapack_int *ifail, lapack_int *info)

like, jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, iwork, ifail, info — that's the whole alphabet almost. if you need to select eigenvalues by range or index, this is the one. no cap. 🔥

and that's where part 88 dips — more _2stage prototypes are coming in part 89, so don't go anywhere. 💖

okay bestie, next batch of LAPACK_*_2stage and LAPACK_*_aa_2stage prototypes is here 💅 every pointer, lapack_int, lapack_complex_float, lapack_complex_double, and char * stays exactly as written — no cap, we do not touch the signatures:

       void LAPACK_cheevx_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, lapack_complex_float *a, lapack_int *lda, float *vl,
           float *vu, lapack_int *il, lapack_int *iu, float *abstol, lapack_int
           *m, float *w, lapack_complex_float *z, lapack_int *ldz,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *iwork, lapack_int *ifail, lapack_int *info)
       void LAPACK_zheevx_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, lapack_complex_double *a, lapack_int *lda, double
           *vl, double *vu, lapack_int *il, lapack_int *iu, double *abstol,
           lapack_int *m, double *w, lapack_complex_double *z, lapack_int *ldz,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *iwork, lapack_int *ifail, lapack_int *info)
       void LAPACK_ssyevr_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, float *a, lapack_int *lda, float *vl, float *vu,
           lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m, float
           *w, float *z, lapack_int *ldz, lapack_int *isuppz, float *work,
           lapack_int *lwork, lapack_int *iwork, lapack_int *liwork, lapack_int
           *info)
       void LAPACK_dsyevr_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, double *a, lapack_int *lda, double *vl, double *vu,
           lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m,
           double *w, double *z, lapack_int *ldz, lapack_int *isuppz, double
           *work, lapack_int *lwork, lapack_int *iwork, lapack_int *liwork,
           lapack_int *info)
       void LAPACK_cheevr_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, lapack_complex_float *a, lapack_int *lda, float *vl,
           float *vu, lapack_int *il, lapack_int *iu, float *abstol, lapack_int
           *m, float *w, lapack_complex_float *z, lapack_int *ldz, lapack_int
           *isuppz, lapack_complex_float *work, lapack_int *lwork, float
           *rwork, lapack_int *lrwork, lapack_int *iwork, lapack_int *liwork,
           lapack_int *info)
       void LAPACK_zheevr_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, lapack_complex_double *a, lapack_int *lda, double
           *vl, double *vu, lapack_int *il, lapack_int *iu, double *abstol,
           lapack_int *m, double *w, lapack_complex_double *z, lapack_int *ldz,
           lapack_int *isuppz, lapack_complex_double *work, lapack_int *lwork,
           double *rwork, lapack_int *lrwork, lapack_int *iwork, lapack_int
           *liwork, lapack_int *info)
       void LAPACK_ssbev_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_int *kd, float *ab, lapack_int *ldab, float *w, float *z,
           lapack_int *ldz, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dsbev_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_int *kd, double *ab, lapack_int *ldab, double *w, double *z,
           lapack_int *ldz, double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_chbev_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_int *kd, lapack_complex_float *ab, lapack_int *ldab, float
           *w, lapack_complex_float *z, lapack_int *ldz, lapack_complex_float
           *work, lapack_int *lwork, float *rwork, lapack_int *info)
       void LAPACK_zhbev_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_int *kd, lapack_complex_double *ab, lapack_int *ldab, double
           *w, lapack_complex_double *z, lapack_int *ldz, lapack_complex_double
           *work, lapack_int *lwork, double *rwork, lapack_int *info)
       void LAPACK_ssbevd_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_int *kd, float *ab, lapack_int *ldab, float *w, float *z,
           lapack_int *ldz, float *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *liwork, lapack_int *info)
       void LAPACK_dsbevd_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_int *kd, double *ab, lapack_int *ldab, double *w, double *z,
           lapack_int *ldz, double *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *liwork, lapack_int *info)
       void LAPACK_chbevd_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_int *kd, lapack_complex_float *ab, lapack_int *ldab, float
           *w, lapack_complex_float *z, lapack_int *ldz, lapack_complex_float
           *work, lapack_int *lwork, float *rwork, lapack_int *lrwork,
           lapack_int *iwork, lapack_int *liwork, lapack_int *info)
       void LAPACK_zhbevd_2stage (char *jobz, char *uplo, lapack_int *n,
           lapack_int *kd, lapack_complex_double *ab, lapack_int *ldab, double
           *w, lapack_complex_double *z, lapack_int *ldz, lapack_complex_double
           *work, lapack_int *lwork, double *rwork, lapack_int *lrwork,
           lapack_int *iwork, lapack_int *liwork, lapack_int *info)
       void LAPACK_ssbevx_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, lapack_int *kd, float *ab, lapack_int *ldab, float
           *q, lapack_int *ldq, float *vl, float *vu, lapack_int *il,
           lapack_int *iu, float *abstol, lapack_int *m, float *w, float *z,
           lapack_int *ldz, float *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *ifail, lapack_int *info)
       void LAPACK_dsbevx_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, lapack_int *kd, double *ab, lapack_int *ldab, double
           *q, lapack_int *ldq, double *vl, double *vu, lapack_int *il,
           lapack_int *iu, double *abstol, lapack_int *m, double *w, double *z,
           lapack_int *ldz, double *work, lapack_int *lwork, lapack_int *iwork,
           lapack_int *ifail, lapack_int *info)
       void LAPACK_chbevx_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, lapack_int *kd, lapack_complex_float *ab, lapack_int
           *ldab, lapack_complex_float *q, lapack_int *ldq, float *vl, float
           *vu, lapack_int *il, lapack_int *iu, float *abstol, lapack_int *m,
           float *w, lapack_complex_float *z, lapack_int *ldz,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *iwork, lapack_int *ifail, lapack_int *info)
       void LAPACK_zhbevx_2stage (char *jobz, char *range, char *uplo,
           lapack_int *n, lapack_int *kd, lapack_complex_double *ab, lapack_int
           *ldab, lapack_complex_double *q, lapack_int *ldq, double *vl, double
           *vu, lapack_int *il, lapack_int *iu, double *abstol, lapack_int *m,
           double *w, lapack_complex_double *z, lapack_int *ldz,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *iwork, lapack_int *ifail, lapack_int *info)
       void LAPACK_ssygv_2stage (lapack_int *itype, char *jobz, char *uplo,
           lapack_int *n, float *a, lapack_int *lda, float *b, lapack_int *ldb,
           float *w, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dsygv_2stage (lapack_int *itype, char *jobz, char *uplo,
           lapack_int *n, double *a, lapack_int *lda, double *b, lapack_int
           *ldb, double *w, double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_chegv_2stage (lapack_int *itype, char *jobz, char *uplo,
           lapack_int *n, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *b, lapack_int *ldb, float *w,
           lapack_complex_float *work, lapack_int *lwork, float *rwork,
           lapack_int *info)
       void LAPACK_zhegv_2stage (lapack_int *itype, char *jobz, char *uplo,
           lapack_int *n, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *b, lapack_int *ldb, double *w,
           lapack_complex_double *work, lapack_int *lwork, double *rwork,
           lapack_int *info)
       void LAPACK_ssysv_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, float *a, lapack_int *lda, float *tb, lapack_int *ltb,
           lapack_int *ipiv, lapack_int *ipiv2, float *b, lapack_int *ldb,
           float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dsysv_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, double *a, lapack_int *lda, double *tb, lapack_int *ltb,
           lapack_int *ipiv, lapack_int *ipiv2, double *b, lapack_int *ldb,
           double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_csysv_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *tb, lapack_int *ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zsysv_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *tb, lapack_int *ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_chesv_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *tb, lapack_int *ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_float *b, lapack_int *ldb,
           lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zhesv_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *tb, lapack_int *ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_double *b, lapack_int *ldb,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_ssytrf_aa_2stage (char *uplo, lapack_int *n, float *a,
           lapack_int *lda, float *tb, lapack_int *ltb, lapack_int *ipiv,
           lapack_int *ipiv2, float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_dsytrf_aa_2stage (char *uplo, lapack_int *n, double *a,
           lapack_int *lda, double *tb, lapack_int *ltb, lapack_int *ipiv,
           lapack_int *ipiv2, double *work, lapack_int *lwork, lapack_int
           *info)
       void LAPACK_csytrf_aa_2stage (char *uplo, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *tb,
           lapack_int *ltb, lapack_int *ipiv, lapack_int *ipiv2,
           lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zsytrf_aa_2stage (char *uplo, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double
           *tb, lapack_int *ltb, lapack_int *ipiv, lapack_int *ipiv2,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_chetrf_aa_2stage (char *uplo, lapack_int *n,
           lapack_complex_float *a, lapack_int *lda, lapack_complex_float *tb,
           lapack_int *ltb, lapack_int *ipiv, lapack_int *ipiv2,
           lapack_complex_float *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_zhetrf_aa_2stage (char *uplo, lapack_int *n,
           lapack_complex_double *a, lapack_int *lda, lapack_complex_double
           *tb, lapack_int *ltb, lapack_int *ipiv, lapack_int *ipiv2,
           lapack_complex_double *work, lapack_int *lwork, lapack_int *info)
       void LAPACK_ssytrs_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, float *a, lapack_int *lda, float *tb, lapack_int *ltb,
           lapack_int *ipiv, lapack_int *ipiv2, float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_dsytrs_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, double *a, lapack_int *lda, double *tb, lapack_int *ltb,

okay so the prototype list keeps rolling — here's the rest of that batch, verbatim, no cap:

           lapack_int *ipiv, lapack_int *ipiv2, double *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_csytrs_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *tb, lapack_int *ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_zsytrs_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *tb, lapack_int *ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_double *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_chetrs_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_float *a, lapack_int *lda,
           lapack_complex_float *tb, lapack_int *ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_float *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACK_zhetrs_aa_2stage (char *uplo, lapack_int *n, lapack_int
           *nrhs, lapack_complex_double *a, lapack_int *lda,
           lapack_complex_double *tb, lapack_int *ltb, lapack_int *ipiv,
           lapack_int *ipiv2, lapack_complex_double *b, lapack_int *ldb,
           lapack_int *info)
       void LAPACKE_set_nancheck (int flag)
       int LAPACKE_get_nancheck ()

bestie look at those two-stage variants — csytrs_aa_2stage, zsytrs_aa_2stage, chetrs_aa_2stage, zhetrs_aa_2stage — all of them carrying tb/ltb and double pivots ipiv/ipiv2 🫶. And then the little duo at the end, LAPACKE_set_nancheck and LAPACKE_get_nancheck, just vibing there: one takes int flag and returns nothing, the other takes nothing and hands you back an int. iconic.


💅 Macro Definition Documentation 💅

okay this is the part that's basically a whole vibe — a massive wall of #defines. Every single one is LAPACK_GLOBAL(...) with the lowercase name and the SHOUTY uppercase name, and each one tells you exactly which line of lapacke.h it lives on. We're going full detail, no skipping, periodt ✨

First up, the one that isn't a LAPACK_GLOBAL at all:

#define LAPACK_C2INT(x)   (lapack_int)(*((float*)&x ))
  • LAPACK_C2INT(x) — definition at line 116 of file lapacke.h. That's the whole thing, character for character: cast the address of x to a float*, deref it, then cast that to lapack_int. Very "trust me bestie, I know what I'm doing" energy 💀.

🦋 the cbbcsd → cgbtrs crowd

  • LAPACK_cbbcsd — LAPACK_GLOBAL(cbbcsd,CBBCSD) — definition at line 13662 of file lapacke.h.
  • LAPACK_cbdsqr — LAPACK_GLOBAL(cbdsqr,CBDSQR) — definition at line 13121 of file lapacke.h.
  • LAPACK_cgbbrd — LAPACK_GLOBAL(cgbbrd,CGBBRD) — definition at line 13109 of file lapacke.h.
  • LAPACK_cgbcon — LAPACK_GLOBAL(cgbcon,CGBCON) — definition at line 12735 of file lapacke.h.
  • LAPACK_cgbequ — LAPACK_GLOBAL(cgbequ,CGBEQU) — definition at line 12901 of file lapacke.h.
  • LAPACK_cgbequb — LAPACK_GLOBAL(cgbequb,CGBEQUB) — definition at line 12906 of file lapacke.h.
  • LAPACK_cgbrfs — LAPACK_GLOBAL(cgbrfs,CGBRFS) — definition at line 12791 of file lapacke.h.
  • LAPACK_cgbrfsx — LAPACK_GLOBAL(cgbrfsx,CGBRFSX) — definition at line 12796 of file lapacke.h.
  • LAPACK_cgbsv — LAPACK_GLOBAL(cgbsv,CGBSV) — definition at line 12945 of file lapacke.h.
  • LAPACK_cgbsvx — LAPACK_GLOBAL(cgbsvx,CGBSVX) — definition at line 12949 of file lapacke.h.
  • LAPACK_cgbsvxx — LAPACK_GLOBAL(cgbsvxx,CGBSVXX) — definition at line 12954 of file lapacke.h.
  • LAPACK_cgbtrf — LAPACK_GLOBAL(cgbtrf,CGBTRF) — definition at line 12615 of file lapacke.h.
  • LAPACK_cgbtrs — LAPACK_GLOBAL(cgbtrs,CGBTRS) — definition at line 12673 of file lapacke.h.

note how cgbsv, cgbsvx, cgbsvxx stack up like a little ladder of increasingly extra behaviour 🌈 — that's the band-matrix solve family doing its thing.


🌸 cge* era

  • LAPACK_cgebak — LAPACK_GLOBAL(cgebak,CGEBAK) — definition at line 13219 of file lapacke.h.
  • LAPACK_cgebal — LAPACK_GLOBAL(cgebal,CGEBAL) — definition at line 13215 of file lapacke.h.
  • LAPACK_cgebrd — LAPACK_GLOBAL(cgebrd,CGEBRD) — definition at line 13105 of file lapacke.h.
  • LAPACK_cgecon — LAPACK_GLOBAL(cgecon,CGECON) — definition at line 12731 of file lapacke.h.
  • LAPACK_cgeequ — LAPACK_GLOBAL(cgeequ,CGEEQU) — definition at line 12893 of file lapacke.h.
  • LAPACK_cgeequb — LAPACK_GLOBAL(cgeequb,CGEEQUB) — definition at line 12898 of file lapacke.h.
  • LAPACK_cgees — LAPACK_GLOBAL(cgees,CGEES) — definition at line 13403 of file lapacke.h.
  • LAPACK_cgeesx — LAPACK_GLOBAL(cgeesx,CGEESX) — definition at line 13407 of file lapacke.h.
  • LAPACK_cgeev — LAPACK_GLOBAL(cgeev,CGEEV) — definition at line 13411 of file lapacke.h.
  • LAPACK_cgeevx — LAPACK_GLOBAL(cgeevx,CGEEVX) — definition at line 13415 of file lapacke.h.
  • LAPACK_cgehrd — LAPACK_GLOBAL(cgehrd,CGEHRD) — definition at line 13203 of file lapacke.h.
  • LAPACK_cgejsv — LAPACK_GLOBAL(cgejsv,CGEJSV) — definition at line 13431 of file lapacke.h.
  • LAPACK_cgelq — LAPACK_GLOBAL(cgelq,CGELQ) — definition at line 13804 of file lapacke.h.
  • LAPACK_cgelq2 — LAPACK_GLOBAL(cgelq2,CGELQ2) — definition at line 13591 of file lapacke.h.
  • LAPACK_cgelqf — LAPACK_GLOBAL(cgelqf,CGELQF) — definition at line 13053 of file lapacke.h.
  • LAPACK_cgels — LAPACK_GLOBAL(cgels,CGELS) — definition at line 13303 of file lapacke.h.
  • LAPACK_cgelsd — LAPACK_GLOBAL(cgelsd,CGELSD) — definition at line 13315 of file lapacke.h.
  • LAPACK_cgelss — LAPACK_GLOBAL(cgelss,CGELSS) — definition at line 13311 of file lapacke.h.
  • LAPACK_cgelsy — LAPACK_GLOBAL(cgelsy,CGELSY) — definition at line 13307 of file lapacke.h.
  • LAPACK_cgemlq — LAPACK_GLOBAL(cgemlq,CGEMLQ) — definition at line 13808 of file lapacke.h.
  • LAPACK_cgemqr — LAPACK_GLOBAL(cgemqr,CGEMQR) — definition at line 13816 of file lapacke.h.
  • LAPACK_cgemqrt — LAPACK_GLOBAL(cgemqrt,CGEMQRT) — definition at line 13709 of file lapacke.h.
  • LAPACK_cgeqlf — LAPACK_GLOBAL(cgeqlf,CGEQLF) — definition at line 13065 of file lapacke.h.
  • LAPACK_cgeqp3 — LAPACK_GLOBAL(cgeqp3,CGEQP3) — definition at line 13041 of file lapacke.h.
  • LAPACK_cgeqpf — LAPACK_GLOBAL(cgeqpf,CGEQPF) — definition at line 13037 of file lapacke.h.
  • LAPACK_cgeqr — LAPACK_GLOBAL(cgeqr,CGEQR) — definition at line 13812 of file lapacke.h.
  • LAPACK_cgeqr2 — LAPACK_GLOBAL(cgeqr2,CGEQR2) — definition at line 13549 of file lapacke.h.
  • LAPACK_cgeqrf — LAPACK_GLOBAL(cgeqrf,CGEQRF) — definition at line 13033 of file lapacke.h.
  • LAPACK_cgeqrfp — LAPACK_GLOBAL(cgeqrfp,CGEQRFP) — definition at line 13539 of file lapacke.h.
  • LAPACK_cgeqrt — LAPACK_GLOBAL(cgeqrt,CGEQRT) — definition at line 13713 of file lapacke.h.
  • LAPACK_cgeqrt2 — LAPACK_GLOBAL(cgeqrt2,CGEQRT2) — definition at line 13717 of file lapacke.h.
  • LAPACK_cgeqrt3 — LAPACK_GLOBAL(cgeqrt3,CGEQRT3) — definition at line 13721 of file lapacke.h.
  • LAPACK_cgerfs — LAPACK_GLOBAL(cgerfs,CGERFS) — definition at line 12783 of file lapacke.h.
  • LAPACK_cgerfsx — LAPACK_GLOBAL(cgerfsx,CGERFSX) — definition at line 12788 of file lapacke.h.
  • LAPACK_cgerqf — LAPACK_GLOBAL(cgerqf,CGERQF) — definition at line 13077 of file lapacke.h.
  • LAPACK_cgesdd — LAPACK_GLOBAL(cgesdd,CGESDD) — definition at line 13427 of file lapacke.h.
  • LAPACK_cgesv — LAPACK_GLOBAL(cgesv,CGESV) — definition at line 12931 of file lapacke.h.
  • LAPACK_cgesvd — LAPACK_GLOBAL(cgesvd,CGESVD) — definition at line 13419 of file lapacke.h.
  • LAPACK_cgesvdx — LAPACK_GLOBAL(cgesvdx,CGESVDX) — definition at line 13423 of file lapacke.h.
  • LAPACK_cgesvj — LAPACK_GLOBAL(cgesvj,CGESVJ) — definition at line 13435 of file lapacke.h.
  • LAPACK_cgesvx — LAPACK_GLOBAL(cgesvx,CGESVX) — definition at line 12937 of file lapacke.h.
  • LAPACK_cgesvxx — LAPACK_GLOBAL(cgesvxx,CGESVXX) — definition at line 12942 of file lapacke.h.
  • LAPACK_cgetf2 — LAPACK_GLOBAL(cgetf2,CGETF2) — definition at line 13563 of file lapacke.h.
  • LAPACK_cgetrf — LAPACK_GLOBAL(cgetrf,CGETRF) — definition at line 12607 of file lapacke.h.
  • LAPACK_cgetrf2 — LAPACK_GLOBAL(cgetrf2,CGETRF2) — definition at line 12611 of file lapacke.h.
  • LAPACK_cgetri — LAPACK_GLOBAL(cgetri,CGETRI) — definition at line 12853 of file lapacke.h.
  • LAPACK_cgetrs — LAPACK_GLOBAL(cgetrs,CGETRS) — definition at line 12669 of file lapacke.h.
  • LAPACK_cgetsls — LAPACK_GLOBAL(cgetsls,CGETSLS) — definition at line 13820 of file lapacke.h.

the way cgeqrf, cgeqrfp, cgeqr2, cgeqr, cgeqrt, cgeqrt2, cgeqrt3 just keep multiplying 😭 that's a whole QR cinematic universe. and yes, cgelq/cgelq2/cgelqf are a separate one, L not R, don't mix them up bestie 🙈


🎀 the cgg* saga (plus the tail of the g's)

  • LAPACK_cggbak — LAPACK_GLOBAL(cggbak,CGGBAK) — definition at line 13263 of file lapacke.h.
  • LAPACK_cggbal — LAPACK_GLOBAL(cggbal,CGGBAL) — definition at line 13259 of file lapacke.h.
  • LAPACK_cgges — LAPACK_GLOBAL(cgges,CGGES) — definition at line 13483 of file lapacke.h.
  • LAPACK_cgges3 — LAPACK_GLOBAL(cgges3,CGGES3) — definition at line 13487 of file lapacke.h.
  • LAPACK_cggesx — LAPACK_GLOBAL(cggesx,CGGESX) — definition at line 13491 of file lapacke.h.
  • LAPACK_cggev — LAPACK_GLOBAL(cggev,CGGEV) — definition at line 13495 of file lapacke.h.
  • LAPACK_cggev3 — LAPACK_GLOBAL(cggev3,CGGEV3) — definition at line 13499 of file lapacke.h.
  • LAPACK_cggevx — LAPACK_GLOBAL(cggevx,CGGEVX) — definition at line 13503 of file lapacke.h.
  • LAPACK_cggglm — LAPACK_GLOBAL(cggglm,CGGGLM) — definition at line 13323 of file lapacke.h.
  • LAPACK_cgghd3 — LAPACK_GLOBAL(cgghd3,CGGHD3) — definition at line 13255 of file lapacke.h.
  • LAPACK_cgghrd — LAPACK_GLOBAL(cgghrd,CGGHRD) — definition at line 13251 of file lapacke.h.
  • LAPACK_cgglse — LAPACK_GLOBAL(cgglse,CGGLSE) — definition at line 13319 of file lapacke.h.
  • LAPACK_cggqrf — LAPACK_GLOBAL(cggqrf,CGGQRF) — definition at line 13097 of file lapacke.h.
  • LAPACK_cggrqf — LAPACK_GLOBAL(cggrqf,CGGRQF) — definition at line 13101 of file lapacke.h.
  • LAPACK_cggsvd — LAPACK_GLOBAL(cggsvd,CGGSVD) — definition at line 13439 of file lapacke.h.
  • LAPACK_cggsvd3 — LAPACK_GLOBAL(cggsvd3,CGGSVD3) — definition at line 13750 of file lapacke.h.
  • LAPACK_cggsvp — LAPACK_GLOBAL(cggsvp,CGGSVP) — definition at line 13291 of file lapacke.h.
  • LAPACK_cggsvp3 — LAPACK_GLOBAL(cggsvp3,CGGSVP3) — definition at line 13295 of file lapacke.h.
  • LAPACK_cgtcon — LAPACK_GLOBAL(cgtcon,CGTCON) — definition at line 12739 of file lapacke.h.
  • LAPACK_cgtrfs — LAPACK_GLOBAL(cgtrfs,CGTRFS) — definition at line 12799 of file lapacke.h.
  • LAPACK_cgtsv — LAPACK_GLOBAL(cgtsv,CGTSV) — definition at line 12957 of file lapacke.h.
  • LAPACK_cgtsvx — LAPACK_GLOBAL(cgtsvx,CGTSVX) — definition at line 12961 of file lapacke.h.
  • LAPACK_cgttrf — LAPACK_GLOBAL(cgttrf,CGTTRF) — definition at line 12619 of file lapacke.h.
  • LAPACK_cgttrs — LAPACK_GLOBAL(cgttrs,CGTTRS) — definition at line 12677 of file lapacke.h.

okay cggsvd / cggsvd3 / cggsvp / cggsvp3 — the 3 at the end is literally a whole separate macro, don't get cute and drop it 🔥 and same deal with cgges/cgges3 and cggev/cggev3. They're siblings, not duplicates, iykyk.


💜 and now the ch* hermition era begins

  • LAPACK_chbev — LAPACK_GLOBAL(chbev,CHBEV) — definition at line 13371 of file lapacke.h.
  • LAPACK_chbev_2stage — LAPACK_GLOBAL(chbev_2stage,CHBEV_2STAGE) — definition at line 13375 of file lapacke.h.
  • LAPACK_chbevd — LAPACK_GLOBAL(chbevd,CHBEVD) — definition at line 13379 of file lapacke.h.
  • LAPACK_chbevd_2stage — LAPACK_GLOBAL(chbevd_2stage,CHBEVD_2STAGE) — definition at line 13383 of file lapacke.h.
  • LAPACK_chbevx — LAPACK_GLOBAL(chbevx,CHBEVX) — definition at line 13387 of file lapacke.h.
  • LAPACK_chbevx_2stage — LAPACK_GLOBAL(chbevx_2stage,CHBEVX_2STAGE) — definition at line 13391 of file lapacke.h.
  • LAPACK_chbgst — LAPACK_GLOBAL(chbgst,CHBGST) — definition at line 13195 of file lapacke.h.
  • LAPACK_chbgv — LAPACK_GLOBAL(chbgv,CHBGV) — definition at line 13471 of file lapacke.h.
  • LAPACK_chbgvd — LAPACK_GLOBAL(chbgvd,CHBGVD) — definition at line 13475 of file lapacke.h.
  • LAPACK_chbgvx — LAPACK_GLOBAL(chbgvx,CHBGVX) — definition at line 13479 of file lapacke.h.
  • LAPACK_chbtrd — LAPACK_GLOBAL(chbtrd,CHBTRD) — definition at line 13153 of file lapacke.h.

the _2stage ones are so real — lowercase in the first slot, ALL CAPS in the second, exactly: LAPACK_GLOBAL(chbev_2stage,CHBEV_2STAGE) 💅 and that chbtrd sitting at 13153 all by itself at the end, cute.


anyway that's where this chunk lands — the ch* family is just getting started and the macros keep coming, so don't touch that dial 🧚

  • LAPACK_checon — expands to LAPACK_GLOBAL(checon,CHECON) — defined at line 12761 of lapacke.h. 💅
  • LAPACK_checon_3 — expands to LAPACK_GLOBAL(checon_3,CHECON_3) — defined at line 13800 of lapacke.h.
  • LAPACK_cheequb — expands to LAPACK_GLOBAL(cheequb,CHEEQUB) — defined at line 12928 of lapacke.h.
  • LAPACK_cheev — expands to LAPACK_GLOBAL(cheev,CHEEV) — defined at line 13327 of lapacke.h.
  • LAPACK_cheev_2stage — expands to LAPACK_GLOBAL(cheev_2stage,CHEEV_2STAGE) — defined at line 13331 of lapacke.h.
  • LAPACK_cheevd — expands to LAPACK_GLOBAL(cheevd,CHEEVD) — defined at line 13335 of lapacke.h.
  • LAPACK_cheevd_2stage — expands to LAPACK_GLOBAL(cheevd_2stage,CHEEVD_2STAGE) — defined at line 13339 of lapacke.h.
  • LAPACK_cheevr — expands to LAPACK_GLOBAL(cheevr,CHEEVR) — defined at line 13351 of lapacke.h.
  • LAPACK_cheevr_2stage — expands to LAPACK_GLOBAL(cheevr_2stage,CHEEVR_2STAGE) — defined at line 13355 of lapacke.h.
  • LAPACK_cheevx — expands to LAPACK_GLOBAL(cheevx,CHEEVX) — defined at line 13343 of lapacke.h.
  • LAPACK_cheevx_2stage — expands to LAPACK_GLOBAL(cheevx_2stage,CHEEVX_2STAGE) — defined at line 13347 of lapacke.h.
  • LAPACK_chegst — expands to LAPACK_GLOBAL(chegst,CHEGST) — defined at line 13187 of lapacke.h.
  • LAPACK_chegv — expands to LAPACK_GLOBAL(chegv,CHEGV) — defined at line 13443 of lapacke.h.
  • LAPACK_chegv_2stage — expands to LAPACK_GLOBAL(chegv_2stage,CHEGV_2STAGE) — defined at line 13447 of lapacke.h.
  • LAPACK_chegvd — expands to LAPACK_GLOBAL(chegvd,CHEGVD) — defined at line 13451 of lapacke.h.
  • LAPACK_chegvx — expands to LAPACK_GLOBAL(chegvx,CHEGVX) — defined at line 13455 of lapacke.h.
  • LAPACK_cherfs — expands to LAPACK_GLOBAL(cherfs,CHERFS) — defined at line 12829 of lapacke.h.
  • LAPACK_cherfsx — expands to LAPACK_GLOBAL(cherfsx,CHERFSX) — defined at line 12832 of lapacke.h.
  • LAPACK_chesv — expands to LAPACK_GLOBAL(chesv,CHESV) — defined at line 13013 of lapacke.h.
  • LAPACK_chesv_aa — expands to LAPACK_GLOBAL(chesv_aa,CHESV_AA) — defined at line 13755 of lapacke.h.
  • LAPACK_chesv_aa_2stage — expands to LAPACK_GLOBAL(chesv_aa_2stage,CHESV_AA_2STAGE) — defined at line 13826 of lapacke.h.
  • LAPACK_chesv_rk — expands to LAPACK_GLOBAL(chesv_rk,CHESV_RK) — defined at line 13774 of lapacke.h.
  • LAPACK_chesvx — expands to LAPACK_GLOBAL(chesvx,CHESVX) — defined at line 13015 of lapacke.h.
  • LAPACK_chesvxx — expands to LAPACK_GLOBAL(chesvxx,CHESVXX) — defined at line 13018 of lapacke.h.
  • LAPACK_cheswapr — expands to LAPACK_GLOBAL(cheswapr,CHESWAPR) — defined at line 13663 of lapacke.h.
  • LAPACK_chetrd — expands to LAPACK_GLOBAL(chetrd,CHETRD) — defined at line 13133 of lapacke.h.
  • LAPACK_chetrf — expands to LAPACK_GLOBAL(chetrf,CHETRF) — defined at line 12657 of lapacke.h.
  • LAPACK_chetrf_aa — expands to LAPACK_GLOBAL(chetrf_aa,CHETRF_AA) — defined at line 13769 of lapacke.h.
  • LAPACK_chetrf_aa_2stage — expands to LAPACK_GLOBAL(chetrf_aa_2stage,CHETRF_AA_2STAGE) — defined at line 13840 of lapacke.h.
  • LAPACK_chetrf_rk — expands to LAPACK_GLOBAL(chetrf_rk,CHETRF_RK) — defined at line 13782 of lapacke.h.
  • LAPACK_chetrf_rook — expands to LAPACK_GLOBAL(chetrf_rook,CHETRF_ROOK) — defined at line 12658 of lapacke.h.
  • LAPACK_chetri — expands to LAPACK_GLOBAL(chetri,CHETRI) — defined at line 12871 of lapacke.h.
  • LAPACK_chetri2 — expands to LAPACK_GLOBAL(chetri2,CHETRI2) — defined at line 13664 of lapacke.h.
  • LAPACK_chetri2x — expands to LAPACK_GLOBAL(chetri2x,CHETRI2X) — defined at line 13665 of lapacke.h.
  • LAPACK_chetri_3 — expands to LAPACK_GLOBAL(chetri_3,CHETRI_3) — defined at line 13794 of lapacke.h.
  • LAPACK_chetrs — expands to LAPACK_GLOBAL(chetrs,CHETRS) — defined at line 12707 of lapacke.h.
  • LAPACK_chetrs2 — expands to LAPACK_GLOBAL(chetrs2,CHETRS2) — defined at line 13666 of lapacke.h.
  • LAPACK_chetrs_3 — expands to LAPACK_GLOBAL(chetrs_3,CHETRS_3) — defined at line 13788 of lapacke.h.
  • LAPACK_chetrs_aa — expands to LAPACK_GLOBAL(chetrs_aa,CHETRS_AA) — defined at line 13763 of lapacke.h.
  • LAPACK_chetrs_aa_2stage — expands to LAPACK_GLOBAL(chetrs_aa_2stage,CHETRS_AA_2STAGE) — defined at line 13834 of lapacke.h.
  • LAPACK_chetrs_rook — expands to LAPACK_GLOBAL(chetrs_rook,CHETRS_ROOK) — defined at line 12708 of lapacke.h.
  • LAPACK_chfrk — expands to LAPACK_GLOBAL(chfrk,CHFRK) — defined at line 13508 of lapacke.h.
  • LAPACK_chgeqz — expands to LAPACK_GLOBAL(chgeqz,CHGEQZ) — defined at line 13267 of lapacke.h.
  • LAPACK_chpcon — expands to LAPACK_GLOBAL(chpcon,CHPCON) — defined at line 12767 of lapacke.h.
  • LAPACK_chpev — expands to LAPACK_GLOBAL(chpev,CHPEV) — defined at line 13359 of lapacke.h.
  • LAPACK_chpevd — expands to LAPACK_GLOBAL(chpevd,CHPEVD) — defined at line 13363 of lapacke.h.
  • LAPACK_chpevx — expands to LAPACK_GLOBAL(chpevx,CHPEVX) — defined at line 13367 of lapacke.h.
  • LAPACK_chpgst — expands to LAPACK_GLOBAL(chpgst,CHPGST) — defined at line 13191 of lapacke.h.
  • LAPACK_chpgv — expands to LAPACK_GLOBAL(chpgv,CHPGV) — defined at line 13459 of lapacke.h.
  • LAPACK_chpgvd — expands to LAPACK_GLOBAL(chpgvd,CHPGVD) — defined at line 13463 of lapacke.h.
  • LAPACK_chpgvx — expands to LAPACK_GLOBAL(chpgvx,CHPGVX) — defined at line 13467 of lapacke.h.
  • LAPACK_chprfs — expands to LAPACK_GLOBAL(chprfs,CHPRFS) — defined at line 12837 of lapacke.h.
  • LAPACK_chpsv — expands to LAPACK_GLOBAL(chpsv,CHPSV) — defined at line 13027 of lapacke.h.
  • LAPACK_chpsvx — expands to LAPACK_GLOBAL(chpsvx,CHPSVX) — defined at line 13029 of lapacke.h.
  • LAPACK_chptrd — expands to LAPACK_GLOBAL(chptrd,CHPTRD) — defined at line 13145 of lapacke.h.
  • LAPACK_chptrf — expands to LAPACK_GLOBAL(chptrf,CHPTRF) — defined at line 12665 of lapacke.h.
  • LAPACK_chptri — expands to LAPACK_GLOBAL(chptri,CHPTRI) — defined at line 12877 of lapacke.h.
  • LAPACK_chptrs — expands to LAPACK_GLOBAL(chptrs,CHPTRS) — defined at line 12715 of lapacke.h.
  • LAPACK_chsein — expands to LAPACK_GLOBAL(chsein,CHSEIN) — defined at line 13227 of lapacke.h.
  • LAPACK_chseqr — expands to LAPACK_GLOBAL(chseqr,CHSEQR) — defined at line 13223 of lapacke.h.

Okay bestie, deep breath, because now we're sliding into the clac* / clan* / clar* neighbourhood — this is the helper-function district of the header and honestly? It's giving backstage at the LAPACK show. ✨

  • LAPACK_clacgv — expands to LAPACK_GLOBAL(clacgv,CLACGV) — defined at line 13541 of lapacke.h.
  • LAPACK_clacn2 — expands to LAPACK_GLOBAL(clacn2,CLACN2) — defined at line 13553 of lapacke.h.
  • LAPACK_clacp2 — expands to LAPACK_GLOBAL(clacp2,CLACP2) — defined at line 13559 of lapacke.h.
  • LAPACK_clacpy — expands to LAPACK_GLOBAL(clacpy,CLACPY) — defined at line 13557 of lapacke.h.
  • LAPACK_clacrm — expands to LAPACK_GLOBAL(clacrm,CLACRM) — defined at line 13577 of lapacke.h.
  • LAPACK_clag2z — expands to LAPACK_GLOBAL(clag2z,CLAG2Z) — defined at line 13619 of lapacke.h.
  • LAPACK_clagge — expands to LAPACK_GLOBAL(clagge,CLAGGE) — defined at line 13627 of lapacke.h.
  • LAPACK_claghe — expands to LAPACK_GLOBAL(claghe,CLAGHE) — defined at line 13643 of lapacke.h.
  • LAPACK_clagsy — expands to LAPACK_GLOBAL(clagsy,CLAGSY) — defined at line 13641 of lapacke.h.
  • LAPACK_clange — expands to LAPACK_GLOBAL(clange,CLANGE) — defined at line 13571 of lapacke.h.
  • LAPACK_clanhe — expands to LAPACK_GLOBAL(clanhe,CLANHE) — defined at line 13573 of lapacke.h.
  • LAPACK_clansy — expands to LAPACK_GLOBAL(clansy,CLANSY) — defined at line 13581 of lapacke.h.
  • LAPACK_clantr — expands to LAPACK_GLOBAL(clantr,CLANTR) — defined at line 13585 of lapacke.h.
  • LAPACK_clapmr — expands to LAPACK_GLOBAL(clapmr,CLAPMR) — defined at line 13647 of lapacke.h.
  • LAPACK_clapmt — expands to LAPACK_GLOBAL(clapmt,CLAPMT) — defined at line 13651 of lapacke.h.
  • LAPACK_clarcm — expands to LAPACK_GLOBAL(clarcm,CLARCM) — defined at line 13575 of lapacke.h.
  • LAPACK_clarfb — expands to LAPACK_GLOBAL(clarfb,CLARFB) — defined at line 13595 of lapacke.h.
  • LAPACK_clarfg — expands to LAPACK_GLOBAL(clarfg,CLARFG) — defined at line 13599 of lapacke.h.
  • LAPACK_clarft — expands to LAPACK_GLOBAL(clarft,CLARFT) — defined at line 13607 of lapacke.h.
  • LAPACK_clarfx — expands to LAPACK_GLOBAL(clarfx,CLARFX) — defined at line 13611 of lapacke.h.
  • LAPACK_clarnv — expands to LAPACK_GLOBAL(clarnv,CLARNV) — defined at line 13545 of lapacke.h.
  • LAPACK_clascl — expands to LAPACK_GLOBAL(clascl,CLASCL) — defined at line 13631 of lapacke.h.
  • LAPACK_claset — expands to LAPACK_GLOBAL(claset,CLASET) — defined at line 13635 of lapacke.h.
  • LAPACK_classq — expands to LAPACK_GLOBAL(classq,CLASSQ) — defined at line 13603 of lapacke.h.
  • LAPACK_claswp — expands to LAPACK_GLOBAL(claswp,CLASWP) — defined at line 13567 of lapacke.h.
  • LAPACK_clatms — expands to LAPACK_GLOBAL(clatms,CLATMS) — defined at line 13615 of lapacke.h.
  • LAPACK_clauum — expands to LAPACK_GLOBAL(clauum,CLAUUM) — defined at line 13623 of lapacke.h.

And now for a little plot twist — the defines stop being function aliases for a sec and start being, like, actual constants and complex-number plumbing. 🌈

  • LAPACK_COL_MAJOR — expands to 102 — defined at line 120 of lapacke.h. (That's the column-major layout marker, bestie — remember that number, it comes back a lot. 👀)
  • lapack_complex_double — expands to double _Complex — defined at line 90 of lapacke.h.
  • lapack_complex_double_imag(z) — expands to (cimag(z)) — defined at line 98 of lapacke.h.
  • lapack_complex_double_real(z) — expands to (creal(z)) — defined at line 94 of lapacke.h.
  • lapack_complex_float — expands to float _Complex — defined at line 74 of lapacke.h.
  • lapack_complex_float_imag(z) — expands to (cimag(z)) — defined at line 82 of lapacke.h.
  • lapack_complex_float_real(z) — expands to (creal(z)) — defined at line 78 of lapacke.h.

So like, lapack_complex_float_real(z) and lapack_complex_double_real(z) are literally just wrapping creal, and the _imag ones wrap cimag — no cap, that's the whole vibe. 🫶


Back to the function aliases, and we're in cp* territory now — packed storage girlies, rise. 🎀

  • LAPACK_cpbcon — expands to LAPACK_GLOBAL(cpbcon,CPBCON) — defined at line 12751 of lapacke.h.
  • LAPACK_cpbequ — expands to LAPACK_GLOBAL(cpbequ,CPBEQU) — defined at line 12921 of lapacke.h.
  • LAPACK_cpbrfs — expands to LAPACK_GLOBAL(cpbrfs,CPBRFS) — defined at line 12815 of lapacke.h.
  • LAPACK_cpbstf — expands to LAPACK_GLOBAL(cpbstf,CPBSTF) — defined at line 13199 of lapacke.h.
  • LAPACK_cpbsv — expands to LAPACK_GLOBAL(cpbsv,CPBSV) — defined at line 12987 of lapacke.h.
  • LAPACK_cpbsvx — expands to LAPACK_GLOBAL(cpbsvx,CPBSVX) — defined at line 12991 of lapacke.h.
  • LAPACK_cpbtrf — expands to LAPACK_GLOBAL(cpbtrf,CPBTRF) — defined at line 12643 of lapacke.h.
  • LAPACK_cpbtrs — expands to LAPACK_GLOBAL(cpbtrs,CPBTRS) — defined at line 12693 of lapacke.h.
  • LAPACK_cpftrf — expands to LAPACK_GLOBAL(cpftrf,CPFTRF) — defined at line 12636 of lapacke.h.
  • LAPACK_cpftri — expands to LAPACK_GLOBAL(cpftri,CPFTRI) — defined at line 12862 of lapacke.h.
  • LAPACK_cpftrs — expands to LAPACK_GLOBAL(cpftrs,CPFTRS) — defined at line 12686 of lapacke.h.
  • LAPACK_cpocon — expands to LAPACK_GLOBAL(cpocon,CPOCON) — defined at line 12743 of lapacke.h.
  • LAPACK_cpoequ — expands to LAPACK_GLOBAL(cpoequ,CPOEQU) — defined at line 12909 of lapacke.h.
  • LAPACK_cpoequb — expands to LAPACK_GLOBAL(cpoequb,CPOEQUB) — defined at line 12914 of lapacke.h.

Okay bestie, we're still deep in the c block — complex single precision girlies, this is your section 💅 Every single one of these is a #define in lapacke.h that glues the lowercase LAPACKE name to its ALL-CAPS Fortran symbol through LAPACK_GLOBAL. Lowercase on the left, uppercase on the right, that's the whole vibe check.

  • #define LAPACK_cporfs LAPACK_GLOBAL(cporfs,CPORFS) — Definition at line 12803 of file lapacke.h.
  • #define LAPACK_cporfsx LAPACK_GLOBAL(cporfsx,CPORFSX) — Definition at line 12808 of file lapacke.h.
  • #define LAPACK_cposv LAPACK_GLOBAL(cposv,CPOSV) — Definition at line 12965 of file lapacke.h.
  • #define LAPACK_cposvx LAPACK_GLOBAL(cposvx,CPOSVX) — Definition at line 12971 of file lapacke.h.
  • #define LAPACK_cposvxx LAPACK_GLOBAL(cposvxx,CPOSVXX) — Definition at line 12976 of file lapacke.h.
  • #define LAPACK_cpotrf LAPACK_GLOBAL(cpotrf,CPOTRF) — Definition at line 12623 of file lapacke.h.
  • #define LAPACK_cpotrf2 LAPACK_GLOBAL(cpotrf2,CPOTRF2) — Definition at line 12627 of file lapacke.h. the sequel, and honestly? it ate ✨
  • #define LAPACK_cpotri LAPACK_GLOBAL(cpotri,CPOTRI) — Definition at line 12857 of file lapacke.h.
  • #define LAPACK_cpotrs LAPACK_GLOBAL(cpotrs,CPOTRS) — Definition at line 12681 of file lapacke.h.
  • #define LAPACK_cppcon LAPACK_GLOBAL(cppcon,CPPCON) — Definition at line 12747 of file lapacke.h.
  • #define LAPACK_cppequ LAPACK_GLOBAL(cppequ,CPPEQU) — Definition at line 12917 of file lapacke.h.
  • #define LAPACK_cpprfs LAPACK_GLOBAL(cpprfs,CPPRFS) — Definition at line 12811 of file lapacke.h.
  • #define LAPACK_cppsv LAPACK_GLOBAL(cppsv,CPPSV) — Definition at line 12979 of file lapacke.h.
  • #define LAPACK_cppsvx LAPACK_GLOBAL(cppsvx,CPPSVX) — Definition at line 12983 of file lapacke.h.
  • #define LAPACK_cpptrf LAPACK_GLOBAL(cpptrf,CPPTRF) — Definition at line 12639 of file lapacke.h.
  • #define LAPACK_cpptri LAPACK_GLOBAL(cpptri,CPPTRI) — Definition at line 12865 of file lapacke.h.
  • #define LAPACK_cpptrs LAPACK_GLOBAL(cpptrs,CPPTRS) — Definition at line 12689 of file lapacke.h.
  • #define LAPACK_cpstrf LAPACK_GLOBAL(cpstrf,CPSTRF) — Definition at line 12632 of file lapacke.h.
  • #define LAPACK_cptcon LAPACK_GLOBAL(cptcon,CPTCON) — Definition at line 12755 of file lapacke.h.
  • #define LAPACK_cpteqr LAPACK_GLOBAL(cpteqr,CPTEQR) — Definition at line 13175 of file lapacke.h.
  • #define LAPACK_cptrfs LAPACK_GLOBAL(cptrfs,CPTRFS) — Definition at line 12819 of file lapacke.h.
  • #define LAPACK_cptsv LAPACK_GLOBAL(cptsv,CPTSV) — Definition at line 12995 of file lapacke.h.
  • #define LAPACK_cptsvx LAPACK_GLOBAL(cptsvx,CPTSVX) — Definition at line 12999 of file lapacke.h.
  • #define LAPACK_cpttrf LAPACK_GLOBAL(cpttrf,CPTTRF) — Definition at line 12647 of file lapacke.h.
  • #define LAPACK_cpttrs LAPACK_GLOBAL(cpttrs,CPTTRS) — Definition at line 12697 of file lapacke.h.
  • #define LAPACK_cspcon LAPACK_GLOBAL(cspcon,CSPCON) — Definition at line 12765 of file lapacke.h.
  • #define LAPACK_csprfs LAPACK_GLOBAL(csprfs,CSPRFS) — Definition at line 12835 of file lapacke.h.
  • #define LAPACK_cspsv LAPACK_GLOBAL(cspsv,CSPSV) — Definition at line 13021 of file lapacke.h.
  • #define LAPACK_cspsvx LAPACK_GLOBAL(cspsvx,CSPSVX) — Definition at line 13025 of file lapacke.h.
  • #define LAPACK_csptrf LAPACK_GLOBAL(csptrf,CSPTRF) — Definition at line 12663 of file lapacke.h.
  • #define LAPACK_csptri LAPACK_GLOBAL(csptri,CSPTRI) — Definition at line 12875 of file lapacke.h.
  • #define LAPACK_csptrs LAPACK_GLOBAL(csptrs,CSPTRS) — Definition at line 12713 of file lapacke.h.
  • #define LAPACK_cstedc LAPACK_GLOBAL(cstedc,CSTEDC) — Definition at line 13167 of file lapacke.h.
  • #define LAPACK_cstegr LAPACK_GLOBAL(cstegr,CSTEGR) — Definition at line 13171 of file lapacke.h.
  • #define LAPACK_cstein LAPACK_GLOBAL(cstein,CSTEIN) — Definition at line 13181 of file lapacke.h.
  • #define LAPACK_cstemr LAPACK_GLOBAL(cstemr,CSTEMR) — Definition at line 13163 of file lapacke.h.
  • #define LAPACK_csteqr LAPACK_GLOBAL(csteqr,CSTEQR) — Definition at line 13159 of file lapacke.h.

Now we hit the sy era and bestie, it is giving family reunion 😭 so many cousins:

  • #define LAPACK_csycon LAPACK_GLOBAL(csycon,CSYCON) — Definition at line 12759 of file lapacke.h.
  • #define LAPACK_csycon_3 LAPACK_GLOBAL(csycon_3,CSYCON_3) — Definition at line 13798 of file lapacke.h. yes the _3 is part of the name, don't come for me 🙈
  • #define LAPACK_csyconv LAPACK_GLOBAL(csyconv,CSYCONV) — Definition at line 13667 of file lapacke.h.
  • #define LAPACK_csyequb LAPACK_GLOBAL(csyequb,CSYEQUB) — Definition at line 12926 of file lapacke.h.
  • #define LAPACK_csyr LAPACK_GLOBAL(csyr,CSYR) — Definition at line 13744 of file lapacke.h. short king 👑
  • #define LAPACK_csyrfs LAPACK_GLOBAL(csyrfs,CSYRFS) — Definition at line 12823 of file lapacke.h.
  • #define LAPACK_csyrfsx LAPACK_GLOBAL(csyrfsx,CSYRFSX) — Definition at line 12828 of file lapacke.h.
  • #define LAPACK_csysv LAPACK_GLOBAL(csysv,CSYSV) — Definition at line 13003 of file lapacke.h.
  • #define LAPACK_csysv_aa LAPACK_GLOBAL(csysv_aa,CSYSV_AA) — Definition at line 13757 of file lapacke.h.
  • #define LAPACK_csysv_aa_2stage — split over two lines in the source, and it's giving drama:
#define LAPACK_csysv_aa_2stage
      LAPACK_GLOBAL(csysv_aa_2stage,CSYSV_AA_2STAGE)

Definition at line 13828 of file lapacke.h.

  • #define LAPACK_csysv_rk LAPACK_GLOBAL(csysv_rk,CSYSV_RK) — Definition at line 13776 of file lapacke.h.
  • #define LAPACK_csysv_rook LAPACK_GLOBAL(csysv_rook,CSYSV_ROOK) — Definition at line 13742 of file lapacke.h.
  • #define LAPACK_csysvx LAPACK_GLOBAL(csysvx,CSYSVX) — Definition at line 13007 of file lapacke.h.
  • #define LAPACK_csysvxx LAPACK_GLOBAL(csysvxx,CSYSVXX) — Definition at line 13012 of file lapacke.h.
  • #define LAPACK_csyswapr LAPACK_GLOBAL(csyswapr,CSYSWAPR) — Definition at line 13668 of file lapacke.h.
  • #define LAPACK_csytrf LAPACK_GLOBAL(csytrf,CSYTRF) — Definition at line 12653 of file lapacke.h.
  • #define LAPACK_csytrf_aa LAPACK_GLOBAL(csytrf_aa,CSYTRF_AA) — Definition at line 13767 of file lapacke.h.
  • #define LAPACK_csytrf_aa_2stage — another two-liner, stay with me:
#define LAPACK_csytrf_aa_2stage
      LAPACK_GLOBAL(csytrf_aa_2stage,CSYTRF_AA_2STAGE)

Definition at line 13838 of file lapacke.h.

  • #define LAPACK_csytrf_rk LAPACK_GLOBAL(csytrf_rk,CSYTRF_RK) — Definition at line 13780 of file lapacke.h.
  • #define LAPACK_csytrf_rook LAPACK_GLOBAL(csytrf_rook,CSYTRF_ROOK) — Definition at line 12654 of file lapacke.h.
  • #define LAPACK_csytri LAPACK_GLOBAL(csytri,CSYTRI) — Definition at line 12869 of file lapacke.h.
  • #define LAPACK_csytri2 LAPACK_GLOBAL(csytri2,CSYTRI2) — Definition at line 13669 of file lapacke.h.
  • #define LAPACK_csytri2x LAPACK_GLOBAL(csytri2x,CSYTRI2X) — Definition at line 13670 of file lapacke.h.
  • #define LAPACK_csytri_3 LAPACK_GLOBAL(csytri_3,CSYTRI_3) — Definition at line 13792 of file lapacke.h.
  • #define LAPACK_csytrs LAPACK_GLOBAL(csytrs,CSYTRS) — Definition at line 12703 of file lapacke.h.
  • #define LAPACK_csytrs2 LAPACK_GLOBAL(csytrs2,CSYTRS2) — Definition at line 13671 of file lapacke.h.
  • #define LAPACK_csytrs_3 LAPACK_GLOBAL(csytrs_3,CSYTRS_3) — Definition at line 13786 of file lapacke.h.
  • #define LAPACK_csytrs_aa LAPACK_GLOBAL(csytrs_aa,CSYTRS_AA) — Definition at line 13761 of file lapacke.h.
  • #define LAPACK_csytrs_aa_2stage — third two-liner bestie, we're collecting them like Pokémon:
#define LAPACK_csytrs_aa_2stage
      LAPACK_GLOBAL(csytrs_aa_2stage,CSYTRS_AA_2STAGE)

Definition at line 13832 of file lapacke.h.

  • #define LAPACK_csytrs_rook LAPACK_GLOBAL(csytrs_rook,CSYTRS_ROOK) — Definition at line 12704 of file lapacke.h.

The t block said hold my iced coffee ☕ every triangular/bidiagonal girlie gets her moment:

  • #define LAPACK_ctbcon LAPACK_GLOBAL(ctbcon,CTBCON) — Definition at line 12779 of file lapacke.h.
  • #define LAPACK_ctbrfs LAPACK_GLOBAL(ctbrfs,CTBRFS) — Definition at line 12849 of file lapacke.h.
  • #define LAPACK_ctbtrs LAPACK_GLOBAL(ctbtrs,CTBTRS) — Definition at line 12727 of file lapacke.h.
  • #define LAPACK_ctfsm LAPACK_GLOBAL(ctfsm,CTFSM) — Definition at line 13512 of file lapacke.h.
  • #define LAPACK_ctftri LAPACK_GLOBAL(ctftri,CTFTRI) — Definition at line 12886 of file lapacke.h.
  • #define LAPACK_ctfttp LAPACK_GLOBAL(ctfttp,CTFTTP) — Definition at line 13516 of file lapacke.h.
  • #define LAPACK_ctfttr LAPACK_GLOBAL(ctfttr,CTFTTR) — Definition at line 13520 of file lapacke.h.
  • #define LAPACK_ctgevc LAPACK_GLOBAL(ctgevc,CTGEVC) — Definition at line 13271 of file lapacke.h.
  • #define LAPACK_ctgexc LAPACK_GLOBAL(ctgexc,CTGEXC) — Definition at line 13275 of file lapacke.h.
  • #define LAPACK_ctgsen LAPACK_GLOBAL(ctgsen,CTGSEN) — Definition at line 13279 of file lapacke.h.
  • #define LAPACK_ctgsja LAPACK_GLOBAL(ctgsja,CTGSJA) — Definition at line 13299 of file lapacke.h.
  • #define LAPACK_ctgsna LAPACK_GLOBAL(ctgsna,CTGSNA) — Definition at line 13287 of file lapacke.h.
  • #define LAPACK_ctgsyl LAPACK_GLOBAL(ctgsyl,CTGSYL) — Definition at line 13283 of file lapacke.h.
  • #define LAPACK_ctpcon LAPACK_GLOBAL(ctpcon,CTPCON) — Definition at line 12775 of file lapacke.h.
  • #define LAPACK_ctpmqrt LAPACK_GLOBAL(ctpmqrt,CTPMQRT) — Definition at line 13725 of file lapacke.h.
  • #define LAPACK_ctpqrt LAPACK_GLOBAL(ctpqrt,CTPQRT) — Definition at line 13729 of file lapacke.h.
  • #define LAPACK_ctpqrt2 LAPACK_GLOBAL(ctpqrt2,CTPQRT2) — Definition at line 13733 of file lapacke.h.
  • #define LAPACK_ctprfb LAPACK_GLOBAL(ctprfb,CTPRFB) — Definition at line 13737 of file lapacke.h.
  • #define LAPACK_ctprfs LAPACK_GLOBAL(ctprfs,CTPRFS) — Definition at line 12845 of file lapacke.h.
  • #define LAPACK_ctptri LAPACK_GLOBAL(ctptri,CTPTRI) — Definition at line 12889 of file lapacke.h.
  • #define LAPACK_ctptrs LAPACK_GLOBAL(ctptrs,CTPTRS) — Definition at line 12723 of file lapacke.h.
  • #define LAPACK_ctpttf LAPACK_GLOBAL(ctpttf,CTPTTF) — Definition at line 13524 of file lapacke.h.
  • #define LAPACK_ctpttr LAPACK_GLOBAL(ctpttr,CTPTTR) — Definition at line 13528 of file lapacke.h.
  • #define LAPACK_ctrcon LAPACK_GLOBAL(ctrcon,CTRCON) — Definition at line 12771 of file lapacke.h.
  • #define LAPACK_ctrevc LAPACK_GLOBAL(ctrevc,CTREVC) — Definition at line 13231 of file lapacke.h.
  • #define LAPACK_ctrexc LAPACK_GLOBAL(ctrexc,CTREXC) — Definition at line 13239 of file lapacke.h.
  • #define LAPACK_ctrrfs LAPACK_GLOBAL(ctrrfs,CTRRFS) — Definition at line 12841 of file lapacke.h.
  • #define LAPACK_ctrsen LAPACK_GLOBAL(ctrsen,CTRSEN) — Definition at line 13243 of file lapacke.h.
  • #define LAPACK_ctrsna LAPACK_GLOBAL(ctrsna,CTRSNA) — Definition at line 13235 of file lapacke.h.
  • #define LAPACK_ctrsyl LAPACK_GLOBAL(ctrsyl,CTRSYL) — Definition at line 13247 of file lapacke.h.
  • #define LAPACK_ctrtri LAPACK_GLOBAL(ctrtri,CTRTRI) — Definition at line 12881 of file lapacke.h.
  • #define LAPACK_ctrtrs LAPACK_GLOBAL(ctrtrs,CTRTRS) — Definition at line 12719 of file lapacke.h.
  • #define LAPACK_ctrttf LAPACK_GLOBAL(ctrttf,CTRTTF) — Definition at line 13532 of file lapacke.h.
  • #define LAPACK_ctrttp LAPACK_GLOBAL(ctrttp,CTRTTP) — Definition at line 13536 of file lapacke.h.
  • #define LAPACK_ctzrzf LAPACK_GLOBAL(ctzrzf,CTZRZF) — Definition at line 13089 of file lapacke.h.

And finally the un girlies — unitary all day, no skips 🌈

  • #define LAPACK_cunbdb LAPACK_GLOBAL(cunbdb,CUNBDB) — Definition at line 13672 of file lapacke.h.
  • #define LAPACK_cuncsd LAPACK_GLOBAL(cuncsd,CUNCSD) — Definition at line 13673 of file lapacke.h.
  • #define LAPACK_cuncsd2by1 LAPACK_GLOBAL(cuncsd2by1,CUNCSD2BY1) — Definition at line 13674 of file lapacke.h.
  • #define LAPACK_cungbr LAPACK_GLOBAL(cungbr,CUNGBR) — Definition at line 13115 of file lapacke.h.
  • #define LAPACK_cunghr LAPACK_GLOBAL(cunghr,CUNGHR) — Definition at line 13209 of file lapacke.h.
  • #define LAPACK_cunglq LAPACK_GLOBAL(cunglq,CUNGLQ) — Definition at line 13059 of file lapacke.h.
bestie note fr: the line numbers are just where each #define sits in lapacke.h — that's the whole fact. Don't read anything else into them, iykyk 🫶

Still more where that came from — the macro list keeps going, so don't go anywhere 💖

alright bestie, next batch of #defines incoming 💅 and the tea is: every single one of these follows the exact same lil shape — #define LAPACK_x LAPACK_GLOBAL(x,X) — so it's just an alias pointing at the real symbol, and each one has its own home address in lapacke.h. no cap, that's the whole vibe. let's roll:

  • LAPACK_cungql — expands to LAPACK_GLOBAL(cungql,CUNGQL). Definition at line 13069 of file lapacke.h. ✨
  • LAPACK_cungqr — expands to LAPACK_GLOBAL(cungqr,CUNGQR). Definition at line 13047 of file lapacke.h. ✨
  • LAPACK_cungrq — expands to LAPACK_GLOBAL(cungrq,CUNGRQ). Definition at line 13081 of file lapacke.h. ✨
  • LAPACK_cungtr — expands to LAPACK_GLOBAL(cungtr,CUNGTR). Definition at line 13135 of file lapacke.h. ✨
  • LAPACK_cunmbr — expands to LAPACK_GLOBAL(cunmbr,CUNMBR). Definition at line 13117 of file lapacke.h. ✨
  • LAPACK_cunmhr — expands to LAPACK_GLOBAL(cunmhr,CUNMHR). Definition at line 13211 of file lapacke.h. ✨
  • LAPACK_cunmlq — expands to LAPACK_GLOBAL(cunmlq,CUNMLQ). Definition at line 13061 of file lapacke.h. ✨
  • LAPACK_cunmql — expands to LAPACK_GLOBAL(cunmql,CUNMQL). Definition at line 13073 of file lapacke.h. ✨
  • LAPACK_cunmqr — expands to LAPACK_GLOBAL(cunmqr,CUNMQR). Definition at line 13049 of file lapacke.h. ✨
  • LAPACK_cunmrq — expands to LAPACK_GLOBAL(cunmrq,CUNMRQ). Definition at line 13085 of file lapacke.h. ✨
  • LAPACK_cunmrz — expands to LAPACK_GLOBAL(cunmrz,CUNMRZ). Definition at line 13093 of file lapacke.h. ✨
  • LAPACK_cunmtr — expands to LAPACK_GLOBAL(cunmtr,CUNMTR). Definition at line 13137 of file lapacke.h. ✨
  • LAPACK_cupgtr — expands to LAPACK_GLOBAL(cupgtr,CUPGTR). Definition at line 13147 of file lapacke.h. ✨
  • LAPACK_cupmtr — expands to LAPACK_GLOBAL(cupmtr,CUPMTR). Definition at line 13149 of file lapacke.h. ✨

and that's the c crew done, wrapping up the complex-flavoured block 🎀 now the d girlies step in — same deal, same shape, just different letters:

  • LAPACK_dbbcsd — expands to LAPACK_GLOBAL(dbbcsd,DBBCSD). Definition at line 13675 of file lapacke.h. 🦋
  • LAPACK_dbdsdc — expands to LAPACK_GLOBAL(dbdsdc,DBDSDC). Definition at line 13124 of file lapacke.h. 🦋
  • LAPACK_dbdsqr — expands to LAPACK_GLOBAL(dbdsqr,DBDSQR). Definition at line 13120 of file lapacke.h. 🦋
  • LAPACK_dbdsvdx — expands to LAPACK_GLOBAL(dbdsvdx,DBDSVDX). Definition at line 13126 of file lapacke.h. 🦋
  • LAPACK_ddisna — expands to LAPACK_GLOBAL(ddisna,DDISNA). Definition at line 13184 of file lapacke.h. 🦋
  • LAPACK_dgbbrd — expands to LAPACK_GLOBAL(dgbbrd,DGBBRD). Definition at line 13108 of file lapacke.h. 🦋
  • LAPACK_dgbcon — expands to LAPACK_GLOBAL(dgbcon,DGBCON). Definition at line 12734 of file lapacke.h. 🦋
  • LAPACK_dgbequ — expands to LAPACK_GLOBAL(dgbequ,DGBEQU). Definition at line 12900 of file lapacke.h. 🦋
  • LAPACK_dgbequb — expands to LAPACK_GLOBAL(dgbequb,DGBEQUB). Definition at line 12903 of file lapacke.h. 🦋
  • LAPACK_dgbrfs — expands to LAPACK_GLOBAL(dgbrfs,DGBRFS). Definition at line 12790 of file lapacke.h. 🦋
  • LAPACK_dgbrfsx — expands to LAPACK_GLOBAL(dgbrfsx,DGBRFSX). Definition at line 12793 of file lapacke.h. 🦋
  • LAPACK_dgbsv — expands to LAPACK_GLOBAL(dgbsv,DGBSV). Definition at line 12944 of file lapacke.h. 🦋
  • LAPACK_dgbsvx — expands to LAPACK_GLOBAL(dgbsvx,DGBSVX). Definition at line 12948 of file lapacke.h. 🦋
  • LAPACK_dgbsvxx — expands to LAPACK_GLOBAL(dgbsvxx,DGBSVXX). Definition at line 12951 of file lapacke.h. 🦋
  • LAPACK_dgbtrf — expands to LAPACK_GLOBAL(dgbtrf,DGBTRF). Definition at line 12614 of file lapacke.h. 🦋
  • LAPACK_dgbtrs — expands to LAPACK_GLOBAL(dgbtrs,DGBTRS). Definition at line 12672 of file lapacke.h. 🦋

look at us go, the dge* cluster is next and honestly it's giving main character energy 👑:

  • LAPACK_dgebak — expands to LAPACK_GLOBAL(dgebak,DGEBAK). Definition at line 13218 of file lapacke.h. ⭐
  • LAPACK_dgebal — expands to LAPACK_GLOBAL(dgebal,DGEBAL). Definition at line 13214 of file lapacke.h. ⭐
  • LAPACK_dgebrd — expands to LAPACK_GLOBAL(dgebrd,DGEBRD). Definition at line 13104 of file lapacke.h. ⭐
  • LAPACK_dgecon — expands to LAPACK_GLOBAL(dgecon,DGECON). Definition at line 12730 of file lapacke.h. ⭐
  • LAPACK_dgeequ — expands to LAPACK_GLOBAL(dgeequ,DGEEQU). Definition at line 12892 of file lapacke.h. ⭐
  • LAPACK_dgeequb — expands to LAPACK_GLOBAL(dgeequb,DGEEQUB). Definition at line 12895 of file lapacke.h. ⭐
  • LAPACK_dgees — expands to LAPACK_GLOBAL(dgees,DGEES). Definition at line 13402 of file lapacke.h. ⭐
  • LAPACK_dgeesx — expands to LAPACK_GLOBAL(dgeesx,DGEESX). Definition at line 13406 of file lapacke.h. ⭐
  • LAPACK_dgeev — expands to LAPACK_GLOBAL(dgeev,DGEEV). Definition at line 13410 of file lapacke.h. ⭐
  • LAPACK_dgeevx — expands to LAPACK_GLOBAL(dgeevx,DGEEVX). Definition at line 13414 of file lapacke.h. ⭐
  • LAPACK_dgehrd — expands to LAPACK_GLOBAL(dgehrd,DGEHRD). Definition at line 13202 of file lapacke.h. ⭐
  • LAPACK_dgejsv — expands to LAPACK_GLOBAL(dgejsv,DGEJSV). Definition at line 13430 of file lapacke.h. ⭐
  • LAPACK_dgelq — expands to LAPACK_GLOBAL(dgelq,DGELQ). Definition at line 13803 of file lapacke.h. ⭐
  • LAPACK_dgelq2 — expands to LAPACK_GLOBAL(dgelq2,DGELQ2). Definition at line 13590 of file lapacke.h. ⭐
  • LAPACK_dgelqf — expands to LAPACK_GLOBAL(dgelqf,DGELQF). Definition at line 13052 of file lapacke.h. ⭐
  • LAPACK_dgels — expands to LAPACK_GLOBAL(dgels,DGELS). Definition at line 13302 of file lapacke.h. ⭐
  • LAPACK_dgelsd — expands to LAPACK_GLOBAL(dgelsd,DGELSD). Definition at line 13314 of file lapacke.h. ⭐
  • LAPACK_dgelss — expands to LAPACK_GLOBAL(dgelss,DGELSS). Definition at line 13310 of file lapacke.h. ⭐
  • LAPACK_dgelsy — expands to LAPACK_GLOBAL(dgelsy,DGELSY). Definition at line 13306 of file lapacke.h. ⭐
  • LAPACK_dgemlq — expands to LAPACK_GLOBAL(dgemlq,DGEMLQ). Definition at line 13807 of file lapacke.h. ⭐
  • LAPACK_dgemqr — expands to LAPACK_GLOBAL(dgemqr,DGEMQR). Definition at line 13815 of file lapacke.h. ⭐
  • LAPACK_dgemqrt — expands to LAPACK_GLOBAL(dgemqrt,DGEMQRT). Definition at line 13708 of file lapacke.h. ⭐
  • LAPACK_dgeqlf — expands to LAPACK_GLOBAL(dgeqlf,DGEQLF). Definition at line 13064 of file lapacke.h. ⭐
  • LAPACK_dgeqp3 — expands to LAPACK_GLOBAL(dgeqp3,DGEQP3). Definition at line 13040 of file lapacke.h. ⭐
  • LAPACK_dgeqpf — expands to LAPACK_GLOBAL(dgeqpf,DGEQPF). Definition at line 13036 of file lapacke.h. ⭐
  • LAPACK_dgeqr — expands to LAPACK_GLOBAL(dgeqr,DGEQR). Definition at line 13811 of file lapacke.h. ⭐
  • LAPACK_dgeqr2 — expands to LAPACK_GLOBAL(dgeqr2,DGEQR2). Definition at line 13548 of file lapacke.h. ⭐
  • LAPACK_dgeqrf — expands to LAPACK_GLOBAL(dgeqrf,DGEQRF). Definition at line 13032 of file lapacke.h. ⭐
  • LAPACK_dgeqrfp — expands to LAPACK_GLOBAL(dgeqrfp,DGEQRFP). Definition at line 13538 of file lapacke.h. ⭐
  • LAPACK_dgeqrt — expands to LAPACK_GLOBAL(dgeqrt,DGEQRT). Definition at line 13712 of file lapacke.h. ⭐
  • LAPACK_dgeqrt2 — expands to LAPACK_GLOBAL(dgeqrt2,DGEQRT2). Definition at line 13716 of file lapacke.h. ⭐
  • LAPACK_dgeqrt3 — expands to LAPACK_GLOBAL(dgeqrt3,DGEQRT3). Definition at line 13720 of file lapacke.h. ⭐
  • LAPACK_dgerfs — expands to LAPACK_GLOBAL(dgerfs,DGERFS). Definition at line 12782 of file lapacke.h. ⭐
  • LAPACK_dgerfsx — expands to LAPACK_GLOBAL(dgerfsx,DGERFSX). Definition at line 12785 of file lapacke.h. ⭐
  • LAPACK_dgerqf — expands to LAPACK_GLOBAL(dgerqf,DGERQF). Definition at line 13076 of file lapacke.h. ⭐
  • LAPACK_dgesdd — expands to LAPACK_GLOBAL(dgesdd,DGESDD). Definition at line 13426 of file lapacke.h. ⭐
  • LAPACK_dgesv — expands to LAPACK_GLOBAL(dgesv,DGESV). Definition at line 12930 of file lapacke.h. ⭐
  • LAPACK_dgesvd — expands to LAPACK_GLOBAL(dgesvd,DGESVD). Definition at line 13418 of file lapacke.h. ⭐
  • LAPACK_dgesvdx — expands to LAPACK_GLOBAL(dgesvdx,DGESVDX). Definition at line 13422 of file lapacke.h. ⭐
  • LAPACK_dgesvj — expands to LAPACK_GLOBAL(dgesvj,DGESVJ). Definition at line 13434 of file lapacke.h. ⭐
  • LAPACK_dgesvx — expands to LAPACK_GLOBAL(dgesvx,DGESVX). Definition at line 12936 of file lapacke.h. ⭐
  • LAPACK_dgesvxx — expands to LAPACK_GLOBAL(dgesvxx,DGESVXX). Definition at line 12939 of file lapacke.h. ⭐
  • LAPACK_dgetf2 — expands to LAPACK_GLOBAL(dgetf2,DGETF2). Definition at line 13562 of file lapacke.h. ⭐
  • LAPACK_dgetrf — expands to LAPACK_GLOBAL(dgetrf,DGETRF). Definition at line 12606 of file lapacke.h. ⭐
  • LAPACK_dgetrf2 — expands to LAPACK_GLOBAL(dgetrf2,DGETRF2). Definition at line 12610 of file lapacke.h. ⭐
  • LAPACK_dgetri — expands to LAPACK_GLOBAL(dgetri,DGETRI). Definition at line 12852 of file lapacke.h. ⭐
  • LAPACK_dgetrs — expands to LAPACK_GLOBAL(dgetrs,DGETRS). Definition at line 12668 of file lapacke.h. ⭐
  • LAPACK_dgetsls — expands to LAPACK_GLOBAL(dgetsls,DGETSLS). Definition at line 13819 of file lapacke.h. ⭐

and the dgg* girlies, because of course there's a whole other cluster 🙈:

  • LAPACK_dggbak — expands to LAPACK_GLOBAL(dggbak,DGGBAK). Definition at line 13262 of file lapacke.h. 🍓
  • LAPACK_dggbal — expands to LAPACK_GLOBAL(dggbal,DGGBAL). Definition at line 13258 of file lapacke.h. 🍓
  • LAPACK_dgges — expands to LAPACK_GLOBAL(dgges,DGGES). Definition at line 13482 of file lapacke.h. 🍓
  • LAPACK_dgges3 — expands to LAPACK_GLOBAL(dgges3,DGGES3). Definition at line 13486 of file lapacke.h. 🍓
  • LAPACK_dggesx — expands to LAPACK_GLOBAL(dggesx,DGGESX). Definition at line 13490 of file lapacke.h. 🍓
  • LAPACK_dggev — expands to LAPACK_GLOBAL(dggev,DGGEV). Definition at line 13494 of file lapacke.h. 🍓
  • LAPACK_dggev3 — expands to LAPACK_GLOBAL(dggev3,DGGEV3). Definition at line 13498 of file lapacke.h. 🍓
  • LAPACK_dggevx — expands to LAPACK_GLOBAL(dggevx,DGGEVX). Definition at line 13502 of file lapacke.h. 🍓
  • LAPACK_dggglm — expands to LAPACK_GLOBAL(dggglm,DGGGLM). Definition at line 13322 of file lapacke.h. 🍓
  • LAPACK_dgghd3 — expands to LAPACK_GLOBAL(dgghd3,DGGHD3). Definition at line 13254 of file lapacke.h. 🍓
  • LAPACK_dgghrd — expands to LAPACK_GLOBAL(dgghrd,DGGHRD). Definition at line 13250 of file lapacke.h. 🍓
  • LAPACK_dgglse — expands to LAPACK_GLOBAL(dgglse,DGGLSE). Definition at line 13318 of file lapacke.h. 🍓
  • LAPACK_dggqrf — expands to LAPACK_GLOBAL(dggqrf,DGGQRF). Definition at line 13096 of file lapacke.h. 🍓
  • LAPACK_dggrqf — expands to LAPACK_GLOBAL(dggrqf,DGGRQF). Definition at line 13100 of file lapacke.h. 🍓
  • LAPACK_dggsvd — expands to LAPACK_GLOBAL(dggsvd,DGGSVD). Definition at line 13438 of file lapacke.h. 🍓
  • LAPACK_dggsvd3 — expands to LAPACK_GLOBAL(dggsvd3,DGGSVD3). Definition at line 13749 of file lapacke.h. 🍓
  • LAPACK_dggsvp — expands to LAPACK_GLOBAL(dggsvp,DGGSVP). Definition at line 13290 of file lapacke.h. 🍓
  • LAPACK_dggsvp3 — expands to LAPACK_GLOBAL(dggsvp3,DGGSVP3). Definition at line 13294 of file lapacke.h. 🍓

the gt trio-ish situation (there's more than three, don't come for me 💀):

  • LAPACK_dgtcon — expands to LAPACK_GLOBAL(dgtcon,DGTCON). Definition at line 12738 of file lapacke.h. 🌸
  • LAPACK_dgtrfs — expands to LAPACK_GLOBAL(dgtrfs,DGTRFS). Definition at line 12798 of file lapacke.h. 🌸
  • LAPACK_dgtsv — expands to LAPACK_GLOBAL(dgtsv,DGTSV). Definition at line 12956 of file lapacke.h. 🌸
  • LAPACK_dgtsvx — expands to LAPACK_GLOBAL(dgtsvx,DGTSVX). Definition at line 12960 of file lapacke.h. 🌸
  • LAPACK_dgttrf — expands to LAPACK_GLOBAL(dgttrf,DGTTRF). Definition at line 12618 of file lapacke.h. 🌸
  • LAPACK_dgttrs — expands to LAPACK_GLOBAL(dgttrs,DGTTRS). Definition at line 12676 of file lapacke.h. 🌸

then the h girlies (yes they exist, they're right there in the header, no I will not be explaining why the letters jump around 😭):

  • LAPACK_dhgeqz — expands to LAPACK_GLOBAL(dhgeqz,DHGEQZ). Definition at line 13266 of file lapacke.h. 🧚
  • LAPACK_dhsein — expands to LAPACK_GLOBAL(dhsein,DHSEIN). Definition at line 13226 of file lapacke.h. 🧚
  • LAPACK_dhseqr — expands to LAPACK_GLOBAL(dhseqr,DHSEQR). Definition at line 13222 of file lapacke.h. 🧚

and finally the lac/lag utility besties, aka the little helpers that ate 💅:

  • LAPACK_dlacn2 — expands to LAPACK_GLOBAL(dlacn2,DLACN2). Definition at line 13552 of file lapacke.h. 🔥
  • LAPACK_dlacpy — expands to LAPACK_GLOBAL(dlacpy,DLACPY). Definition at line 13556 of file lapacke.h. 🔥
  • LAPACK_dlag2s — expands to LAPACK_GLOBAL(dlag2s,DLAG2S). Definition at line 13618 of file lapacke.h. 🔥
  • LAPACK_dlagge — expands to LAPACK_GLOBAL(dlagge,DLAGGE). Definition at line 13626 of file lapacke.h. 🔥
  • LAPACK_dlagsy — expands to LAPACK_GLOBAL(dlagsy,DLAGSY). Definition at line 13640 of file lapacke.h. 🔥

okay that's this chunk done and honestly? ate. no crumbs left. 🫶 still more #defines queued up so don't wander off — the header is LONG long. 💖

  • #define LAPACK_dlamch LAPACK_GLOBAL(dlamch,DLAMCH) — defined at line 13588 of lapacke.h 💅
  • #define LAPACK_dlange LAPACK_GLOBAL(dlange,DLANGE) — defined at line 13570 of lapacke.h ✨
  • #define LAPACK_dlansy LAPACK_GLOBAL(dlansy,DLANSY) — defined at line 13580 of lapacke.h
  • #define LAPACK_dlantr LAPACK_GLOBAL(dlantr,DLANTR) — defined at line 13584 of lapacke.h
  • #define LAPACK_dlapmr LAPACK_GLOBAL(dlapmr,DLAPMR) — defined at line 13646 of lapacke.h 🌸
  • #define LAPACK_dlapmt LAPACK_GLOBAL(dlapmt,DLAPMT) — defined at line 13650 of lapacke.h
  • #define LAPACK_dlapy2 LAPACK_GLOBAL(dlapy2,DLAPY2) — defined at line 13654 of lapacke.h
  • #define LAPACK_dlapy3 LAPACK_GLOBAL(dlapy3,DLAPY3) — defined at line 13656 of lapacke.h
  • #define LAPACK_dlarfb LAPACK_GLOBAL(dlarfb,DLARFB) — defined at line 13594 of lapacke.h 🦋
  • #define LAPACK_dlarfg LAPACK_GLOBAL(dlarfg,DLARFG) — defined at line 13598 of lapacke.h
  • #define LAPACK_dlarft LAPACK_GLOBAL(dlarft,DLARFT) — defined at line 13606 of lapacke.h
  • #define LAPACK_dlarfx LAPACK_GLOBAL(dlarfx,DLARFX) — defined at line 13610 of lapacke.h
  • #define LAPACK_dlarnv LAPACK_GLOBAL(dlarnv,DLARNV) — defined at line 13544 of lapacke.h 🎀
  • #define LAPACK_dlartgp LAPACK_GLOBAL(dlartgp,DLARTGP) — defined at line 13658 of lapacke.h
  • #define LAPACK_dlartgs LAPACK_GLOBAL(dlartgs,DLARTGS) — defined at line 13660 of lapacke.h
  • #define LAPACK_dlascl LAPACK_GLOBAL(dlascl,DLASCL) — defined at line 13630 of lapacke.h ✨
  • #define LAPACK_dlaset LAPACK_GLOBAL(dlaset,DLASET) — defined at line 13634 of lapacke.h
  • #define LAPACK_dlasrt LAPACK_GLOBAL(dlasrt,DLASRT) — defined at line 13638 of lapacke.h
  • #define LAPACK_dlassq LAPACK_GLOBAL(dlassq,DLASSQ) — defined at line 13602 of lapacke.h
  • #define LAPACK_dlaswp LAPACK_GLOBAL(dlaswp,DLASWP) — defined at line 13566 of lapacke.h 💫
  • #define LAPACK_dlatms LAPACK_GLOBAL(dlatms,DLATMS) — defined at line 13614 of lapacke.h
  • #define LAPACK_dlauum LAPACK_GLOBAL(dlauum,DLAUUM) — defined at line 13622 of lapacke.h

okay and now we drift into the dop/dor region bestie, orthogonality central 💜

  • #define LAPACK_dopgtr LAPACK_GLOBAL(dopgtr,DOPGTR) — defined at line 13142 of lapacke.h
  • #define LAPACK_dopmtr LAPACK_GLOBAL(dopmtr,DOPMTR) — defined at line 13144 of lapacke.h
  • #define LAPACK_dorbdb LAPACK_GLOBAL(dorbdb,DORBDB) — defined at line 13676 of lapacke.h 🌀
  • #define LAPACK_dorcsd LAPACK_GLOBAL(dorcsd,DORCSD) — defined at line 13677 of lapacke.h
  • #define LAPACK_dorcsd2by1 LAPACK_GLOBAL(dorcsd2by1,DORCSD2BY1) — defined at line 13678 of lapacke.h
  • #define LAPACK_dorgbr LAPACK_GLOBAL(dorgbr,DORGBR) — defined at line 13112 of lapacke.h
  • #define LAPACK_dorghr LAPACK_GLOBAL(dorghr,DORGHR) — defined at line 13206 of lapacke.h
  • #define LAPACK_dorglq LAPACK_GLOBAL(dorglq,DORGLQ) — defined at line 13056 of lapacke.h 🌈
  • #define LAPACK_dorgql LAPACK_GLOBAL(dorgql,DORGQL) — defined at line 13068 of lapacke.h
  • #define LAPACK_dorgqr LAPACK_GLOBAL(dorgqr,DORGQR) — defined at line 13044 of lapacke.h
  • #define LAPACK_dorgrq LAPACK_GLOBAL(dorgrq,DORGRQ) — defined at line 13080 of lapacke.h
  • #define LAPACK_dorgtr LAPACK_GLOBAL(dorgtr,DORGTR) — defined at line 13130 of lapacke.h
  • #define LAPACK_dormbr LAPACK_GLOBAL(dormbr,DORMBR) — defined at line 13114 of lapacke.h ✨
  • #define LAPACK_dormhr LAPACK_GLOBAL(dormhr,DORMHR) — defined at line 13208 of lapacke.h
  • #define LAPACK_dormlq LAPACK_GLOBAL(dormlq,DORMLQ) — defined at line 13058 of lapacke.h
  • #define LAPACK_dormql LAPACK_GLOBAL(dormql,DORMQL) — defined at line 13072 of lapacke.h
  • #define LAPACK_dormqr LAPACK_GLOBAL(dormqr,DORMQR) — defined at line 13046 of lapacke.h
  • #define LAPACK_dormrq LAPACK_GLOBAL(dormrq,DORMRQ) — defined at line 13084 of lapacke.h 🫶
  • #define LAPACK_dormrz LAPACK_GLOBAL(dormrz,DORMRZ) — defined at line 13092 of lapacke.h
  • #define LAPACK_dormtr LAPACK_GLOBAL(dormtr,DORMTR) — defined at line 13132 of lapacke.h

banded + positive-definite hours, the dpb/dpo/dpp/dpt girlies are here 💅

  • #define LAPACK_dpbcon LAPACK_GLOBAL(dpbcon,DPBCON) — defined at line 12750 of lapacke.h
  • #define LAPACK_dpbequ LAPACK_GLOBAL(dpbequ,DPBEQU) — defined at line 12920 of lapacke.h
  • #define LAPACK_dpbrfs LAPACK_GLOBAL(dpbrfs,DPBRFS) — defined at line 12814 of lapacke.h
  • #define LAPACK_dpbstf LAPACK_GLOBAL(dpbstf,DPBSTF) — defined at line 13198 of lapacke.h 🌸
  • #define LAPACK_dpbsv LAPACK_GLOBAL(dpbsv,DPBSV) — defined at line 12986 of lapacke.h
  • #define LAPACK_dpbsvx LAPACK_GLOBAL(dpbsvx,DPBSVX) — defined at line 12990 of lapacke.h
  • #define LAPACK_dpbtrf LAPACK_GLOBAL(dpbtrf,DPBTRF) — defined at line 12642 of lapacke.h
  • #define LAPACK_dpbtrs LAPACK_GLOBAL(dpbtrs,DPBTRS) — defined at line 12692 of lapacke.h ✨
  • #define LAPACK_dpftrf LAPACK_GLOBAL(dpftrf,DPFTRF) — defined at line 12633 of lapacke.h
  • #define LAPACK_dpftri LAPACK_GLOBAL(dpftri,DPFTRI) — defined at line 12859 of lapacke.h
  • #define LAPACK_dpftrs LAPACK_GLOBAL(dpftrs,DPFTRS) — defined at line 12683 of lapacke.h
  • #define LAPACK_dpocon LAPACK_GLOBAL(dpocon,DPOCON) — defined at line 12742 of lapacke.h 💖
  • #define LAPACK_dpoequ LAPACK_GLOBAL(dpoequ,DPOEQU) — defined at line 12908 of lapacke.h
  • #define LAPACK_dpoequb LAPACK_GLOBAL(dpoequb,DPOEQUB) — defined at line 12911 of lapacke.h
  • #define LAPACK_dporfs LAPACK_GLOBAL(dporfs,DPORFS) — defined at line 12802 of lapacke.h
  • #define LAPACK_dporfsx LAPACK_GLOBAL(dporfsx,DPORFSX) — defined at line 12805 of lapacke.h
  • #define LAPACK_dposv LAPACK_GLOBAL(dposv,DPOSV) — defined at line 12964 of lapacke.h 👑
  • #define LAPACK_dposvx LAPACK_GLOBAL(dposvx,DPOSVX) — defined at line 12970 of lapacke.h
  • #define LAPACK_dposvxx LAPACK_GLOBAL(dposvxx,DPOSVXX) — defined at line 12973 of lapacke.h
  • #define LAPACK_dpotrf LAPACK_GLOBAL(dpotrf,DPOTRF) — defined at line 12622 of lapacke.h 🔥
  • #define LAPACK_dpotrf2 LAPACK_GLOBAL(dpotrf2,DPOTRF2) — defined at line 12626 of lapacke.h
  • #define LAPACK_dpotri LAPACK_GLOBAL(dpotri,DPOTRI) — defined at line 12856 of lapacke.h
  • #define LAPACK_dpotrs LAPACK_GLOBAL(dpotrs,DPOTRS) — defined at line 12680 of lapacke.h
  • #define LAPACK_dppcon LAPACK_GLOBAL(dppcon,DPPCON) — defined at line 12746 of lapacke.h 🦋
  • #define LAPACK_dppequ LAPACK_GLOBAL(dppequ,DPPEQU) — defined at line 12916 of lapacke.h
  • #define LAPACK_dpprfs LAPACK_GLOBAL(dpprfs,DPPRFS) — defined at line 12810 of lapacke.h
  • #define LAPACK_dppsv LAPACK_GLOBAL(dppsv,DPPSV) — defined at line 12978 of lapacke.h
  • #define LAPACK_dppsvx LAPACK_GLOBAL(dppsvx,DPPSVX) — defined at line 12982 of lapacke.h
  • #define LAPACK_dpptrf LAPACK_GLOBAL(dpptrf,DPPTRF) — defined at line 12638 of lapacke.h ✨
  • #define LAPACK_dpptri LAPACK_GLOBAL(dpptri,DPPTRI) — defined at line 12864 of lapacke.h
  • #define LAPACK_dpptrs LAPACK_GLOBAL(dpptrs,DPPTRS) — defined at line 12688 of lapacke.h
  • #define LAPACK_dpstrf LAPACK_GLOBAL(dpstrf,DPSTRF) — defined at line 12629 of lapacke.h
  • #define LAPACK_dptcon LAPACK_GLOBAL(dptcon,DPTCON) — defined at line 12754 of lapacke.h 🌸
  • #define LAPACK_dpteqr LAPACK_GLOBAL(dpteqr,DPTEQR) — defined at line 13174 of lapacke.h
  • #define LAPACK_dptrfs LAPACK_GLOBAL(dptrfs,DPTRFS) — defined at line 12818 of lapacke.h
  • #define LAPACK_dptsv LAPACK_GLOBAL(dptsv,DPTSV) — defined at line 12994 of lapacke.h
  • #define LAPACK_dptsvx LAPACK_GLOBAL(dptsvx,DPTSVX) — defined at line 12998 of lapacke.h 🎀
  • #define LAPACK_dpttrf LAPACK_GLOBAL(dpttrf,DPTTRF) — defined at line 12646 of lapacke.h
  • #define LAPACK_dpttrs LAPACK_GLOBAL(dpttrs,DPTTRS) — defined at line 12696 of lapacke.h

eigen era unlocked 🔓 the ds* squad said symmetric and meant it 💜

  • #define LAPACK_dsbev LAPACK_GLOBAL(dsbev,DSBEV) — defined at line 13370 of lapacke.h
  • #define LAPACK_dsbev_2stage LAPACK_GLOBAL(dsbev_2stage,DSBEV_2STAGE) — defined at line 13374 of lapacke.h 🌀
  • #define LAPACK_dsbevd LAPACK_GLOBAL(dsbevd,DSBEVD) — defined at line 13378 of lapacke.h
  • #define LAPACK_dsbevd_2stage LAPACK_GLOBAL(dsbevd_2stage,DSBEVD_2STAGE) — defined at line 13382 of lapacke.h
  • #define LAPACK_dsbevx LAPACK_GLOBAL(dsbevx,DSBEVX) — defined at line 13386 of lapacke.h
  • #define LAPACK_dsbevx_2stage LAPACK_GLOBAL(dsbevx_2stage,DSBEVX_2STAGE) — defined at line 13390 of lapacke.h ✨
  • #define LAPACK_dsbgst LAPACK_GLOBAL(dsbgst,DSBGST) — defined at line 13194 of lapacke.h
  • #define LAPACK_dsbgv LAPACK_GLOBAL(dsbgv,DSBGV) — defined at line 13470 of lapacke.h
  • #define LAPACK_dsbgvd LAPACK_GLOBAL(dsbgvd,DSBGVD) — defined at line 13474 of lapacke.h
  • #define LAPACK_dsbgvx LAPACK_GLOBAL(dsbgvx,DSBGVX) — defined at line 13478 of lapacke.h 💖
  • #define LAPACK_dsbtrd LAPACK_GLOBAL(dsbtrd,DSBTRD) — defined at line 13152 of lapacke.h
  • #define LAPACK_dsfrk LAPACK_GLOBAL(dsfrk,DSFRK) — defined at line 13505 of lapacke.h
  • #define LAPACK_dsgesv LAPACK_GLOBAL(dsgesv,DSGESV) — defined at line 12933 of lapacke.h 🔥
  • #define LAPACK_dspcon LAPACK_GLOBAL(dspcon,DSPCON) — defined at line 12764 of lapacke.h
  • #define LAPACK_dspev LAPACK_GLOBAL(dspev,DSPEV) — defined at line 13358 of lapacke.h
  • #define LAPACK_dspevd LAPACK_GLOBAL(dspevd,DSPEVD) — defined at line 13362 of lapacke.h
  • #define LAPACK_dspevx LAPACK_GLOBAL(dspevx,DSPEVX) — defined at line 13366 of lapacke.h 🦋
  • #define LAPACK_dspgst LAPACK_GLOBAL(dspgst,DSPGST) — defined at line 13190 of lapacke.h
  • #define LAPACK_dspgv LAPACK_GLOBAL(dspgv,DSPGV) — defined at line 13458 of lapacke.h
  • #define LAPACK_dspgvd LAPACK_GLOBAL(dspgvd,DSPGVD) — defined at line 13462 of lapacke.h
  • #define LAPACK_dspgvx LAPACK_GLOBAL(dspgvx,DSPGVX) — defined at line 13466 of lapacke.h ✨
  • #define LAPACK_dsposv LAPACK_GLOBAL(dsposv,DSPOSV) — defined at line 12967 of lapacke.h
  • #define LAPACK_dsprfs LAPACK_GLOBAL(dsprfs,DSPRFS) — defined at line 12834 of lapacke.h
  • #define LAPACK_dspsv LAPACK_GLOBAL(dspsv,DSPSV) — defined at line 13020 of lapacke.h
  • #define LAPACK_dspsvx LAPACK_GLOBAL(dspsvx,DSPSVX) — defined at line 13024 of lapacke.h 🫶
  • #define LAPACK_dsptrd LAPACK_GLOBAL(dsptrd,DSPTRD) — defined at line 13140 of lapacke.h
  • #define LAPACK_dsptrf LAPACK_GLOBAL(dsptrf,DSPTRF) — defined at line 12662 of lapacke.h
  • #define LAPACK_dsptri LAPACK_GLOBAL(dsptri,DSPTRI) — defined at line 12874 of lapacke.h
  • #define LAPACK_dsptrs LAPACK_GLOBAL(dsptrs,DSPTRS) — defined at line 12712 of lapacke.h 🌈

okay the d-crew is still absolutely running the group chat and honestly? we respect the consistency 💅 every single one of these is a LAPACK_GLOBAL wrapper, so let's just vibe through the roll call together, bestie. line numbers stay exactly where they are, no cap 🫶

  • #define LAPACK_dstebz LAPACK_GLOBAL(dstebz,DSTEBZ) — the dst section is starting and it's giving organized 🎀 — Definition at line 13178 of file lapacke.h.
  • #define LAPACK_dstedc LAPACK_GLOBAL(dstedc,DSTEDC) — little dstedc showing up right before it 💖 — Definition at line 13166 of file lapacke.h.
  • #define LAPACK_dstegr LAPACK_GLOBAL(dstegr,DSTEGR) — and dstegr sliding in next, slay ✨ — Definition at line 13170 of file lapacke.h.
  • #define LAPACK_dstein LAPACK_GLOBAL(dstein,DSTEIN) — dstein is here, iconic behavior tbh 👑 — Definition at line 13180 of file lapacke.h.
  • #define LAPACK_dstemr LAPACK_GLOBAL(dstemr,DSTEMR) — dstemr said "let me get a higher line number" and we love that for her — Definition at line 13162 of file lapacke.h.
  • #define LAPACK_dsteqr LAPACK_GLOBAL(dsteqr,DSTEQR) — dsteqr, nepo baby of the dst block, still valid 🌸 — Definition at line 13158 of file lapacke.h.
  • #define LAPACK_dsterf LAPACK_GLOBAL(dsterf,DSTERF) — dsterf clocking in at a modest little line number 🥺 — Definition at line 13156 of file lapacke.h.
  • #define LAPACK_dstev LAPACK_GLOBAL(dstev,DSTEV) — okay dstev, we see you in the 13300s 🔥 — Definition at line 13394 of file lapacke.h.
  • #define LAPACK_dstevd LAPACK_GLOBAL(dstevd,DSTEVD) — dstevd with one (1) extra letter and zero (0) extra chill 💀 — Definition at line 13396 of file lapacke.h.
  • #define LAPACK_dstevr LAPACK_GLOBAL(dstevr,DSTEVR) — dstevr hopping in two lines down, main character energy ⭐ — Definition at line 13400 of file lapacke.h.
  • #define LAPACK_dstevx LAPACK_GLOBAL(dstevx,DSTEVX) — and the x variant, sandwiched between its siblings, adorable 🙈 — Definition at line 13398 of file lapacke.h.

okay now the dsy era begins, and bestie there are SO many of them 💀 but like, respectfully, they all eat.

  • #define LAPACK_dsycon LAPACK_GLOBAL(dsycon,DSYCON) — dsycon up first, no notes 🦋 — Definition at line 12758 of file lapacke.h.
  • #define LAPACK_dsycon_3 LAPACK_GLOBAL(dsycon_3,DSYCON_3) — the _3 sequel, highkey a franchise at this point 🎀 — Definition at line 13797 of file lapacke.h.
  • #define LAPACK_dsyconv LAPACK_GLOBAL(dsyconv,DSYCONV) — dsyconv — not to be confused with the previous one, fr fr — Definition at line 13679 of file lapacke.h.
  • #define LAPACK_dsyequb LAPACK_GLOBAL(dsyequb,DSYEQUB) — dsyequb making its little debut ✨ — Definition at line 12923 of file lapacke.h.

and here come the eigenvalue girlies 💅 this block is literally a friend group:

  • #define LAPACK_dsyev LAPACK_GLOBAL(dsyev,DSYEV) — dsyev, the original icon 👑 — Definition at line 13326 of file lapacke.h.
  • #define LAPACK_dsyev_2stage LAPACK_GLOBAL(dsyev_2stage,DSYEV_2STAGE) — _2stage version, living her two-act lifestyle 🎭 — Definition at line 13330 of file lapacke.h.
  • #define LAPACK_dsyevd LAPACK_GLOBAL(dsyevd,DSYEVD) — dsyevd with the extra letter, periodt 💖 — Definition at line 13334 of file lapacke.h.
  • #define LAPACK_dsyevd_2stage LAPACK_GLOBAL(dsyevd_2stage,DSYEVD_2STAGE) — yes both suffixes, she's got range 🌈 — Definition at line 13338 of file lapacke.h.
  • #define LAPACK_dsyevr LAPACK_GLOBAL(dsyevr,DSYEVR) — dsyevr rolling in with the r energy ⭐ — Definition at line 13350 of file lapacke.h.
  • #define LAPACK_dsyevr_2stage LAPACK_GLOBAL(dsyevr_2stage,DSYEVR_2STAGE) — dsyevr but make it two stages, iykyk 🧚 — Definition at line 13354 of file lapacke.h.
  • #define LAPACK_dsyevx LAPACK_GLOBAL(dsyevx,DSYEVX) — dsyevx sneaking in at 13342, out of order, chaotic queen 💀 — Definition at line 13342 of file lapacke.h.
  • #define LAPACK_dsyevx_2stage LAPACK_GLOBAL(dsyevx_2stage,DSYEVX_2STAGE) — and her two-stage twin right behind her 🫶 — Definition at line 13346 of file lapacke.h.

  • #define LAPACK_dsygst LAPACK_GLOBAL(dsygst,DSYGST) — dsygst jumping back down to the 13100s, the way she just ✨teleports✨ — Definition at line 13186 of file lapacke.h.
  • #define LAPACK_dsygv LAPACK_GLOBAL(dsygv,DSYGV) — dsygv, the g stands for "girlboss" (source: trust me, do NOT quote me on that) 🙈 — Definition at line 13442 of file lapacke.h.
  • #define LAPACK_dsygv_2stage LAPACK_GLOBAL(dsygv_2stage,DSYGV_2STAGE) — two-stage again, she's committed to the bit 💅 — Definition at line 13446 of file lapacke.h.
  • #define LAPACK_dsygvd LAPACK_GLOBAL(dsygvd,DSYGVD) — dsygvd with the d, no further questions 💜 — Definition at line 13450 of file lapacke.h.
  • #define LAPACK_dsygvx LAPACK_GLOBAL(dsygvx,DSYGVX) — and dsygvx closing out the mini-set 🌸 — Definition at line 13454 of file lapacke.h.
  • #define LAPACK_dsyrfs LAPACK_GLOBAL(dsyrfs,DSYRFS) — dsyrfs over in the rfs corner, chilling 😌 — Definition at line 12822 of file lapacke.h.
  • #define LAPACK_dsyrfsx LAPACK_GLOBAL(dsyrfsx,DSYRFSX) — dsyrfsx with the extra x, three whole lines later, consistency is a myth 🫠 — Definition at line 12825 of file lapacke.h.

  • #define LAPACK_dsysv LAPACK_GLOBAL(dsysv,DSYSV) — dsysv, 13002, cute round-ish number, love that 🎀 — Definition at line 13002 of file lapacke.h.
  • #define LAPACK_dsysv_aa LAPACK_GLOBAL(dsysv_aa,DSYSV_AA) — _aa variant, the double-a aesthetic is real ✨ — Definition at line 13754 of file lapacke.h.
  • #define LAPACK_dsysv_aa_2stage LAPACK_GLOBAL(dsysv_aa_2stage,DSYSV_AA_2STAGE) — dsysv_aa_2stage, the longest name in the friend group and she knows it 💅 — Definition at line 13825 of file lapacke.h.
  • #define LAPACK_dsysv_rk LAPACK_GLOBAL(dsysv_rk,DSYSV_RK) — _rk variant, two letters, zero explanations 🦋 — Definition at line 13773 of file lapacke.h.
  • #define LAPACK_dsysv_rook LAPACK_GLOBAL(dsysv_rook,DSYSV_ROOK) — _rook, iconic word honestly, ate 🔥 — Definition at line 13741 of file lapacke.h.
  • #define LAPACK_dsysvx LAPACK_GLOBAL(dsysvx,DSYSVX) — dsysvx, back over at 13006, we love a callback 😌 — Definition at line 13006 of file lapacke.h.
  • #define LAPACK_dsysvxx LAPACK_GLOBAL(dsysvxx,DSYSVXX) — dsysvxx with TWO x's, double the letter, double the slay ⭐ — Definition at line 13009 of file lapacke.h.
  • #define LAPACK_dsyswapr LAPACK_GLOBAL(dsyswapr,DSYSWAPR) — dsyswapr, the name sounds like a dance move and I'm here for it 💃 — Definition at line 13680 of file lapacke.h.

  • #define LAPACK_dsytrd LAPACK_GLOBAL(dsytrd,DSYTRD) — dsytrd, entering the dsyt block with confidence 😤 — Definition at line 13128 of file lapacke.h.
  • #define LAPACK_dsytrf LAPACK_GLOBAL(dsytrf,DSYTRF) — dsytrf, way down at 12651 like she's been here the longest 💀 — Definition at line 12651 of file lapacke.h.
  • #define LAPACK_dsytrf_aa LAPACK_GLOBAL(dsytrf_aa,DSYTRF_AA) — _aa again, she's consistent 💖 — Definition at line 13766 of file lapacke.h.
  • #define LAPACK_dsytrf_aa_2stage LAPACK_GLOBAL(dsytrf_aa_2stage,DSYTRF_AA_2STAGE) — dsytrf_aa_2stage, a whole mouthful, but she's worth it 🎀 — Definition at line 13837 of file lapacke.h.
  • #define LAPACK_dsytrf_rk LAPACK_GLOBAL(dsytrf_rk,DSYTRF_RK) — _rk, short and specific, ok periodt 💅 — Definition at line 13779 of file lapacke.h.
  • #define LAPACK_dsytrf_rook LAPACK_GLOBAL(dsytrf_rook,DSYTRF_ROOK) — _rook again, one line down from the original dsytrf, shouting distance 🫶 — Definition at line 12652 of file lapacke.h.
  • #define LAPACK_dsytri LAPACK_GLOBAL(dsytri,DSYTRI) — dsytri, switching from f to i, a rebrand 💫 — Definition at line 12868 of file lapacke.h.
  • #define LAPACK_dsytri2 LAPACK_GLOBAL(dsytri2,DSYTRI2) — dsytri2, the sequel nobody asked for but everyone needed 🌈 — Definition at line 13681 of file lapacke.h.
  • #define LAPACK_dsytri2x LAPACK_GLOBAL(dsytri2x,DSYTRI2X) — dsytri2x, three-way combo of 2 and x, show-off behavior ngl ⭐ — Definition at line 13682 of file lapacke.h.
  • #define LAPACK_dsytri_3 LAPACK_GLOBAL(dsytri_3,DSYTRI_3) — dsytri_3, the third act 🎭 — Definition at line 13791 of file lapacke.h.
  • #define LAPACK_dsytrs LAPACK_GLOBAL(dsytrs,DSYTRS) — dsytrs, swapping i for s, the plot thickens 😭 — Definition at line 12701 of file lapacke.h.
  • #define LAPACK_dsytrs2 LAPACK_GLOBAL(dsytrs2,DSYTRS2) — dsytrs2, part two, electric boogaloo 🌸 — Definition at line 13683 of file lapacke.h.
  • #define LAPACK_dsytrs_3 LAPACK_GLOBAL(dsytrs_3,DSYTRS_3) — dsytrs_3, third installment, franchise energy 👑 — Definition at line 13785 of file lapacke.h.
  • #define LAPACK_dsytrs_aa LAPACK_GLOBAL(dsytrs_aa,DSYTRS_AA) — _aa, we meet again, bestie 💖 — Definition at line 13760 of file lapacke.h.
  • #define LAPACK_dsytrs_aa_2stage LAPACK_GLOBAL(dsytrs_aa_2stage,DSYTRS_AA_2STAGE) — the full combo meal, aa plus 2stage, she has everything 🍓 — Definition at line 13831 of file lapacke.h.
  • #define LAPACK_dsytrs_rook LAPACK_GLOBAL(dsytrs_rook,DSYTRS_ROOK) — dsytrs_rook, tucked right next to plain dsytrs, sisters fr fr 🫶 — Definition at line 12702 of file lapacke.h.

okay new letter block, the dt crew is here and they're all in the 12700–13800 range, chaotic little line numbers, we love 🤪

  • #define LAPACK_dtbcon LAPACK_GLOBAL(dtbcon,DTBCON) — dtbcon, first of the dtb trio 🎀 — Definition at line 12778 of file lapacke.h.
  • #define LAPACK_dtbrfs LAPACK_GLOBAL(dtbrfs,DTBRFS) — dtbrfs, the rfs one 🦋 — Definition at line 12848 of file lapacke.h.
  • #define LAPACK_dtbtrs LAPACK_GLOBAL(dtbtrs,DTBTRS) — dtbtrs, third and final dtb, we stan a complete set ✨ — Definition at line 12726 of file lapacke.h.
  • #define LAPACK_dtfsm LAPACK_GLOBAL(dtfsm,DTFSM) — dtfsm, jumping to the dtf block with zero warning 💀 — Definition at line 13509 of file lapacke.h.
  • #define LAPACK_dtftri LAPACK_GLOBAL(dtftri,DTFTRI) — dtftri back at 12883 like "miss me?" 😭 — Definition at line 12883 of file lapacke.h.
  • #define LAPACK_dtfttp LAPACK_GLOBAL(dtfttp,DTFTTP) — dtfttp, all the t's and p's, phonetically a tongue twister 💅 — Definition at line 13513 of file lapacke.h.
  • #define LAPACK_dtfttr LAPACK_GLOBAL(dtfttr,DTFTTR) — dtfttr, sister of the above, four lines apart, bonded 🌸 — Definition at line 13517 of file lapacke.h.

and now the dtg and dtp chaos, buckle up bestie 🎢

  • #define LAPACK_dtgevc LAPACK_GLOBAL(dtgevc,DTGEVC) — dtgevc, opening the dtg section 💜 — Definition at line 13270 of file lapacke.h.
  • #define LAPACK_dtgexc LAPACK_GLOBAL(dtgexc,DTGEXC) — dtgexc, the x variant, four lines later ⭐ — Definition at line 13274 of file lapacke.h.
  • #define LAPACK_dtgsen LAPACK_GLOBAL(dtgsen,DTGSEN) — dtgsen, another four lines, this block is on a schedule 🕐 — Definition at line 13278 of file lapacke.h.
  • #define LAPACK_dtgsja LAPACK_GLOBAL(dtgsja,DTGSJA) — dtgsja down at 13298, taking the scenic route 😌 — Definition at line 13298 of file lapacke.h.
  • #define LAPACK_dtgsna LAPACK_GLOBAL(dtgsna,DTGSNA) — dtgsna at 13286, sandwiched between the others, middle child energy 🙈 — Definition at line 13286 of file lapacke.h.
  • #define LAPACK_dtgsyl LAPACK_GLOBAL(dtgsyl,DTGSYL) — dtgsyl, at 13282, closing the dtg family portrait 🖼️ — Definition at line 13282 of file lapacke.h.
  • #define LAPACK_dtpcon LAPACK_GLOBAL(dtpcon,DTPCON) — dtpcon back at 12774, hello again stranger 🫶 — Definition at line 12774 of file lapacke.h.
  • #define LAPACK_dtpmqrt LAPACK_GLOBAL(dtpmqrt,DTPMQRT) — dtpmqrt, vowel-free and thriving, ate 💅 — Definition at line 13724 of file lapacke.h.
  • #define LAPACK_dtpqrt LAPACK_GLOBAL(dtpqrt,DTPQRT) — dtpqrt, dtpmqrt minus the m, math 💀 — Definition at line 13728 of file lapacke.h.
  • #define LAPACK_dtpqrt2 LAPACK_GLOBAL(dtpqrt2,DTPQRT2) — dtpqrt2, the numbered sequel 🎀 — Definition at line 13732 of file lapacke.h.
  • #define LAPACK_dtprfb LAPACK_GLOBAL(dtprfb,DTPRFB) — dtprfb, completing the little dtpq-ish quartet ✨ — Definition at line 13736 of file lapacke.h.
  • #define LAPACK_dtprfs LAPACK_GLOBAL(dtprfs,DTPRFS) — dtprfs, back to 12844, the ping-ponging is so real 😭 — Definition at line 12844 of file lapacke.h.
  • #define LAPACK_dtptri LAPACK_GLOBAL(dtptri,DTPTRI) — dtptri, at 12888, vibing 🌸 — Definition at line 12888 of file lapacke.h.
  • #define LAPACK_dtptrs LAPACK_GLOBAL(dtptrs,DTPTRS) — dtptrs, 12722, early bird 🐦 — Definition at line 12722 of file lapacke.h.
  • #define LAPACK_dtpttf LAPACK_GLOBAL(dtpttf,DTPTTF) — dtpttf, the t→f version ⭐ — Definition at line 13521 of file lapacke.h.
  • #define LAPACK_dtpttr LAPACK_GLOBAL(dtpttr,DTPTTR) — dtpttr, the t→r version, four lines later, twins 🫶 — Definition at line 13525 of file lapacke.h.

and now the dtr block, aka the last stretch of the d-family before things get alphabetical again 💖

  • #define LAPACK_dtrcon LAPACK_GLOBAL(dtrcon,DTRCON) — dtrcon, opening the dtr era 👑 — Definition at line 12770 of file lapacke.h.
  • #define LAPACK_dtrevc LAPACK_GLOBAL(dtrevc,DTREVC) — dtrevc, the e variant, different vibe entirely 🌈 — Definition at line 13230 of file lapacke.h.
  • #define LAPACK_dtrexc LAPACK_GLOBAL(dtrexc,DTREXC) — dtrexc, eight lines down, consistent spacing, we notice ✨ — Definition at line 13238 of file lapacke.h.
  • #define LAPACK_dtrrfs LAPACK_GLOBAL(dtrrfs,DTRRFS) — dtrrfs, 12840, the rfs corner again 🦋 — Definition at line 12840 of file lapacke.h.
  • #define LAPACK_dtrsen LAPACK_GLOBAL(dtrsen,DTRSEN) — dtrsen, between dtrexc and dtrsna, cozy 😌 — Definition at line 13242 of file lapacke.h.
  • #define LAPACK_dtrsna LAPACK_GLOBAL(dtrsna,DTRSNA) — dtrsna, at 13234, just above the pack 💜 — Definition at line 13234 of file lapacke.h.
  • #define LAPACK_dtrsyl LAPACK_GLOBAL(dtrsyl,DTRSYL) — dtrsyl, 13246, closing the dtrs trio 🎀 — Definition at line 13246 of file lapacke.h.
  • #define LAPACK_dtrtri LAPACK_GLOBAL(dtrtri,DTRTRI) — dtrtri, 12880, the i version 🌸 — Definition at line 12880 of file lapacke.h.
  • #define LAPACK_dtrtrs LAPACK_GLOBAL(dtrtrs,DTRTRS) — dtrtrs, 12718, the s version, four-line gap from dtptrs, sibling energy 🫶 — Definition at line 12718 of file lapacke.h.
  • #define LAPACK_dtrttf LAPACK_GLOBAL(dtrttf,DTRTTF) — dtrttf, 13529, the t→f again ⭐ — Definition at line 13529 of file lapacke.h.
  • #define LAPACK_dtrttp LAPACK_GLOBAL(dtrttp,DTRTTP) — dtrttp, 13533, ending on a p, iconic closer 💅 — Definition at line 13533 of file lapacke.h.
  • #define LAPACK_dtzrzf LAPACK_GLOBAL(dtzrzf,DTZRZF) — dtzrzf, the very last d-entry in this batch, and honestly? she carried the whole alphabet on her back 😭 — Definition at line 13088 of file lapacke.h.

okay and now we've got some absolute legends that aren't part of any letter family, they just EXIST 💀

  • #define LAPACK_ilaver LAPACK_GLOBAL(ilaver,ILAVER) — ilaver, no d, no s, just vibes 🦋 — Definition at line 13746 of file lapacke.h.
  • #define lapack_int int — okay this one is literally just int and it's giving "I'm the blueprint" 👑 — Definition at line 47 of file lapacke.h.
  • #define lapack_logical lapack_int — and lapack_logical is defined as lapack_int, nepo baby via typedef-free macro, we love nepotism when it's C 💅 — Definition at line 51 of file lapacke.h.
  • #define LAPACK_lsame LAPACK_GLOBAL(lsame,LSAME) — LAPACK_lsame, the lowercase-speaking legend ✨ — Definition at line 145 of file lapacke.h.
  • #define LAPACK_ROW_MAJOR 101 — LAPACK_ROW_MAJOR is literally 101, the number, and honestly same bestie same 🎀 — Definition at line 119 of file lapacke.h.

and now the s-crew has entered the chat 🫶 single-precision besties, we were wondering when you'd show up.

  • #define LAPACK_sbbcsd LAPACK_GLOBAL(sbbcsd,SBBCSD) — sbbcsd, first of the s's, trailblazer 🌟 — Definition at line 13684 of file lapacke.h.
  • #define LAPACK_sbdsdc LAPACK_GLOBAL(sbdsdc,SBDSDC) — sbdsdc, the sbd family begins 🦋 — Definition at line 13123 of file lapacke.h.
  • #define LAPACK_sbdsqr LAPACK_GLOBAL(sbdsqr,SBDSQR) — sbdsqr, 13119, four lines up, we see the pattern 💖 — Definition at line 13119 of file lapacke.h.
  • #define LAPACK_sbdsvdx LAPACK_GLOBAL(sbdsvdx,SBDSVDX) — sbdsvdx, 13125, closing the sbd trio with a bang ⭐ — Definition at line 13125 of file lapacke.h.
  • #define LAPACK_sdisna LAPACK_GLOBAL(sdisna,SDISNA) — sdisna, jumping to a whole new prefix, chaotic 💀 — Definition at line 13183 of file lapacke.h.

and now the sgb block, aka "the g is for girlboss" part two (again, don't quote me) 🙈

  • #define LAPACK_sgbbrd LAPACK_GLOBAL(sgbbrd,SGBBRD) — sgbbrd, resident consonant cluster 🎀 — Definition at line 13107 of file lapacke.h.
  • #define LAPACK_sgbcon LAPACK_GLOBAL(sgbcon,SGBCON) — sgbcon, the con variant 💅 — Definition at line 12733 of file lapacke.h.
  • #define LAPACK_sgbequ LAPACK_GLOBAL(sgbequ,SGBEQU) — sgbequ, the equ variant, fancy 🌸 — Definition at line 12899 of file lapacke.h.
  • #define LAPACK_sgbequb LAPACK_GLOBAL(sgbequb,SGBEQUB) — sgbequb, sgbequ with a b on the end, five lines later, sibling behavior 💖 — Definition at line 12904 of file lapacke.h.
  • #define LAPACK_sgbrfs LAPACK_GLOBAL(sgbrfs,SGBRFS) — sgbrfs, the rfs classic 🦋 — Definition at line 12789 of file lapacke.h.
  • #define LAPACK_sgbrfsx LAPACK_GLOBAL(sgbrfsx,SGBRFSX) — sgbrfsx, sgbrfs plus an x, five lines down, we're sensing a theme ✨ — Definition at line 12794 of file lapacke.h.
  • #define LAPACK_sgbsv LAPACK_GLOBAL(sgbsv,SGBSV) — sgbsv, the sv variant, clean 🎀 — Definition at line 12943 of file lapacke.h.
  • #define LAPACK_sgbsvx LAPACK_GLOBAL(sgbsvx,SGBSVX) — sgbsvx, plus x, four lines later, consistent queen 👑 — Definition at line 12947 of file lapacke.h.
  • #define LAPACK_sgbsvxx LAPACK_GLOBAL(sgbsvxx,SGBSVXX) — sgbsvxx, DOUBLE x, the maximalist of the group, she ate and left no crumbs 🔥 — Definition at line 12952 of file lapacke.h.

and that's where this part cuts off bestie 💖 the s-family is clearly just getting started, so like... stay tuned, the roll call continues 😭🫶

okay so we're fully in the s-block now, bestie — a whole parade of macros that all start with s, all spelled LAPACK_GLOBAL(lowercase,UPPERCASE), and all dutifully reporting which line of lapacke.h they live on. alphabet-adjacent chaos, but we move 💅

  • LAPACK_sgbtrf — expands to LAPACK_GLOBAL(sgbtrf,SGBTRF) · defined at line 12613 of lapacke.h
  • LAPACK_sgbtrs — expands to LAPACK_GLOBAL(sgbtrs,SGBTRS) · defined at line 12671 of lapacke.h
  • LAPACK_sgebak — expands to LAPACK_GLOBAL(sgebak,SGEBAK) · defined at line 13217 of lapacke.h
  • LAPACK_sgebal — expands to LAPACK_GLOBAL(sgebal,SGEBAL) · defined at line 13213 of lapacke.h
  • LAPACK_sgebrd — expands to LAPACK_GLOBAL(sgebrd,SGEBRD) · defined at line 13103 of lapacke.h
  • LAPACK_sgecon — expands to LAPACK_GLOBAL(sgecon,SGECON) · defined at line 12729 of lapacke.h
  • LAPACK_sgeequ — expands to LAPACK_GLOBAL(sgeequ,SGEEQU) · defined at line 12891 of lapacke.h
  • LAPACK_sgeequb — expands to LAPACK_GLOBAL(sgeequb,SGEEQUB) · defined at line 12896 of lapacke.h

the way sgeequ and sgeequb are literally sat right next to each other at 12891 and 12896… siblings fr fr 🫶

  • LAPACK_sgees — expands to LAPACK_GLOBAL(sgees,SGEES) · defined at line 13401 of lapacke.h
  • LAPACK_sgeesx — expands to LAPACK_GLOBAL(sgeesx,SGEESX) · defined at line 13405 of lapacke.h
  • LAPACK_sgeev — expands to LAPACK_GLOBAL(sgeev,SGEEV) · defined at line 13409 of lapacke.h
  • LAPACK_sgeevx — expands to LAPACK_GLOBAL(sgeevx,SGEEVX) · defined at line 13413 of lapacke.h

okay the x suffix cluster is giving "same icon, deluxe edition" ✨ and i'm obsessed

  • LAPACK_sgehrd — expands to LAPACK_GLOBAL(sgehrd,SGEHRD) · defined at line 13201 of lapacke.h
  • LAPACK_sgejsv — expands to LAPACK_GLOBAL(sgejsv,SGEJSV) · defined at line 13429 of lapacke.h
  • LAPACK_sgelq — expands to LAPACK_GLOBAL(sgelq,SGELQ) · defined at line 13802 of lapacke.h
  • LAPACK_sgelq2 — expands to LAPACK_GLOBAL(sgelq2,SGELQ2) · defined at line 13589 of lapacke.h
  • LAPACK_sgelqf — expands to LAPACK_GLOBAL(sgelqf,SGELQF) · defined at line 13051 of lapacke.h
  • LAPACK_sgels — expands to LAPACK_GLOBAL(sgels,SGELS) · defined at line 13301 of lapacke.h
  • LAPACK_sgelsd — expands to LAPACK_GLOBAL(sgelsd,SGELSD) · defined at line 13313 of lapacke.h
  • LAPACK_sgelss — expands to LAPACK_GLOBAL(sgelss,SGELSS) · defined at line 13309 of lapacke.h
  • LAPACK_sgelsy — expands to LAPACK_GLOBAL(sgelsy,SGELSY) · defined at line 13305 of lapacke.h

sgels, sgelsd, sgelsy, sgelss — the whole little family reunion, and yes they're alphabetized by their extra letter 🎀

  • LAPACK_sgemlq — expands to LAPACK_GLOBAL(sgemlq,SGEMLQ) · defined at line 13806 of lapacke.h
  • LAPACK_sgemqr — expands to LAPACK_GLOBAL(sgemqr,SGEMQR) · defined at line 13814 of lapacke.h
  • LAPACK_sgemqrt — expands to LAPACK_GLOBAL(sgemqrt,SGEMQRT) · defined at line 13707 of lapacke.h
  • LAPACK_sgeqlf — expands to LAPACK_GLOBAL(sgeqlf,SGEQLF) · defined at line 13063 of lapacke.h
  • LAPACK_sgeqp3 — expands to LAPACK_GLOBAL(sgeqp3,SGEQP3) · defined at line 13039 of lapacke.h
  • LAPACK_sgeqpf — expands to LAPACK_GLOBAL(sgeqpf,SGEQPF) · defined at line 13035 of lapacke.h
  • LAPACK_sgeqr — expands to LAPACK_GLOBAL(sgeqr,SGEQR) · defined at line 13810 of lapacke.h
  • LAPACK_sgeqr2 — expands to LAPACK_GLOBAL(sgeqr2,SGEQR2) · defined at line 13547 of lapacke.h
  • LAPACK_sgeqrf — expands to LAPACK_GLOBAL(sgeqrf,SGEQRF) · defined at line 13031 of lapacke.h
  • LAPACK_sgeqrfp — expands to LAPACK_GLOBAL(sgeqrfp,SGEQRFP) · defined at line 13537 of lapacke.h
  • LAPACK_sgeqrt — expands to LAPACK_GLOBAL(sgeqrt,SGEQRT) · defined at line 13711 of lapacke.h
  • LAPACK_sgeqrt2 — expands to LAPACK_GLOBAL(sgeqrt2,SGEQRT2) · defined at line 13715 of lapacke.h
  • LAPACK_sgeqrt3 — expands to LAPACK_GLOBAL(sgeqrt3,SGEQRT3) · defined at line 13719 of lapacke.h

SGEQRT, SGEQRT2, SGEQRT3 at 13711 / 13715 / 13719 — evenly spaced, no notes, main character energy 👑

  • LAPACK_sgerfs — expands to LAPACK_GLOBAL(sgerfs,SGERFS) · defined at line 12781 of lapacke.h
  • LAPACK_sgerfsx — expands to LAPACK_GLOBAL(sgerfsx,SGERFSX) · defined at line 12786 of lapacke.h
  • LAPACK_sgerqf — expands to LAPACK_GLOBAL(sgerqf,SGERQF) · defined at line 13075 of lapacke.h
  • LAPACK_sgesdd — expands to LAPACK_GLOBAL(sgesdd,SGESDD) · defined at line 13425 of lapacke.h
  • LAPACK_sgesv — expands to LAPACK_GLOBAL(sgesv,SGESV) · defined at line 12929 of lapacke.h
  • LAPACK_sgesvd — expands to LAPACK_GLOBAL(sgesvd,SGESVD) · defined at line 13417 of lapacke.h
  • LAPACK_sgesvdx — expands to LAPACK_GLOBAL(sgesvdx,SGESVDX) · defined at line 13421 of lapacke.h
  • LAPACK_sgesvj — expands to LAPACK_GLOBAL(sgesvj,SGESVJ) · defined at line 13433 of lapacke.h
  • LAPACK_sgesvx — expands to LAPACK_GLOBAL(sgesvx,SGESVX) · defined at line 12935 of lapacke.h
  • LAPACK_sgesvxx — expands to LAPACK_GLOBAL(sgesvxx,SGESVXX) · defined at line 12940 of lapacke.h

not sgesvx AND sgesvxx, double x, she said "and i took that personally" 💀

  • LAPACK_sgetf2 — expands to LAPACK_GLOBAL(sgetf2,SGETF2) · defined at line 13561 of lapacke.h
  • LAPACK_sgetrf — expands to LAPACK_GLOBAL(sgetrf,SGETRF) · defined at line 12605 of lapacke.h
  • LAPACK_sgetrf2 — expands to LAPACK_GLOBAL(sgetrf2,SGETRF2) · defined at line 12609 of lapacke.h
  • LAPACK_sgetri — expands to LAPACK_GLOBAL(sgetri,SGETRI) · defined at line 12851 of lapacke.h
  • LAPACK_sgetrs — expands to LAPACK_GLOBAL(sgetrs,SGETRS) · defined at line 12667 of lapacke.h
  • LAPACK_sgetsls — expands to LAPACK_GLOBAL(sgetsls,SGETSLS) · defined at line 13818 of lapacke.h
  • LAPACK_sggbak — expands to LAPACK_GLOBAL(sggbak,SGGBAK) · defined at line 13261 of lapacke.h
  • LAPACK_sggbal — expands to LAPACK_GLOBAL(sggbal,SGGBAL) · defined at line 13257 of lapacke.h
  • LAPACK_sgges — expands to LAPACK_GLOBAL(sgges,SGGES) · defined at line 13481 of lapacke.h
  • LAPACK_sgges3 — expands to LAPACK_GLOBAL(sgges3,SGGES3) · defined at line 13485 of lapacke.h
  • LAPACK_sggesx — expands to LAPACK_GLOBAL(sggesx,SGGESX) · defined at line 13489 of lapacke.h
  • LAPACK_sggev — expands to LAPACK_GLOBAL(sggev,SGGEV) · defined at line 13493 of lapacke.h
  • LAPACK_sggev3 — expands to LAPACK_GLOBAL(sggev3,SGGEV3) · defined at line 13497 of lapacke.h
  • LAPACK_sggevx — expands to LAPACK_GLOBAL(sggevx,SGGEVX) · defined at line 13501 of lapacke.h

the sgg block said "copy my fit but make it different" and honestly? ate 🌸

  • LAPACK_sggglm — expands to LAPACK_GLOBAL(sggglm,SGGGLM) · defined at line 13321 of lapacke.h
  • LAPACK_sgghd3 — expands to LAPACK_GLOBAL(sgghd3,SGGHD3) · defined at line 13253 of lapacke.h
  • LAPACK_sgghrd — expands to LAPACK_GLOBAL(sgghrd,SGGHRD) · defined at line 13249 of lapacke.h
  • LAPACK_sgglse — expands to LAPACK_GLOBAL(sgglse,SGGLSE) · defined at line 13317 of lapacke.h
  • LAPACK_sggqrf — expands to LAPACK_GLOBAL(sggqrf,SGGQRF) · defined at line 13095 of lapacke.h
  • LAPACK_sggrqf — expands to LAPACK_GLOBAL(sggrqf,SGGRQF) · defined at line 13099 of lapacke.h
  • LAPACK_sggsvd — expands to LAPACK_GLOBAL(sggsvd,SGGSVD) · defined at line 13437 of lapacke.h
  • LAPACK_sggsvd3 — expands to LAPACK_GLOBAL(sggsvd3,SGGSVD3) · defined at line 13748 of lapacke.h
  • LAPACK_sggsvp — expands to LAPACK_GLOBAL(sggsvp,SGGSVP) · defined at line 13289 of lapacke.h
  • LAPACK_sggsvp3 — expands to LAPACK_GLOBAL(sggsvp3,SGGSVP3) · defined at line 13293 of lapacke.h

SGGQRF and SGGRQF — literally the same letters, different order, 13095 vs 13099. do NOT mix them up bestie, i'm begging 🙈

  • LAPACK_sgtcon — expands to LAPACK_GLOBAL(sgtcon,SGTCON) · defined at line 12737 of lapacke.h
  • LAPACK_sgtrfs — expands to LAPACK_GLOBAL(sgtrfs,SGTRFS) · defined at line 12797 of lapacke.h
  • LAPACK_sgtsv — expands to LAPACK_GLOBAL(sgtsv,SGTSV) · defined at line 12955 of lapacke.h
  • LAPACK_sgtsvx — expands to LAPACK_GLOBAL(sgtsvx,SGTSVX) · defined at line 12959 of lapacke.h
  • LAPACK_sgttrf — expands to LAPACK_GLOBAL(sgttrf,SGTTRF) · defined at line 12617 of lapacke.h
  • LAPACK_sgttrs — expands to LAPACK_GLOBAL(sgttrs,SGTTRS) · defined at line 12675 of lapacke.h
  • LAPACK_shgeqz — expands to LAPACK_GLOBAL(shgeqz,SHGEQZ) · defined at line 13265 of lapacke.h
  • LAPACK_shsein — expands to LAPACK_GLOBAL(shsein,SHSEIN) · defined at line 13225 of lapacke.h
  • LAPACK_shseqr — expands to LAPACK_GLOBAL(shseqr,SHSEQR) · defined at line 13221 of lapacke.h

okay we switched from g to h, the era change is REAL, and the macro body is still doing the exact same lowercase/UPPERCASE mirror thing 🔥

  • LAPACK_slacn2 — expands to LAPACK_GLOBAL(slacn2,SLACN2) · defined at line 13551 of lapacke.h
  • LAPACK_slacpy — expands to LAPACK_GLOBAL(slacpy,SLACPY) · defined at line 13555 of lapacke.h
  • LAPACK_slag2d — expands to LAPACK_GLOBAL(slag2d,SLAG2D) · defined at line 13617 of lapacke.h
  • LAPACK_slagge — expands to LAPACK_GLOBAL(slagge,SLAGGE) · defined at line 13625 of lapacke.h
  • LAPACK_slagsy — expands to LAPACK_GLOBAL(slagsy,SLAGSY) · defined at line 13639 of lapacke.h
  • LAPACK_slamch — expands to LAPACK_GLOBAL(slamch,SLAMCH) · defined at line 13587 of lapacke.h
  • LAPACK_slange — expands to LAPACK_GLOBAL(slange,SLANGE) · defined at line 13569 of lapacke.h
  • LAPACK_slansy — expands to LAPACK_GLOBAL(slansy,SLANSY) · defined at line 13579 of lapacke.h
  • LAPACK_slantr — expands to LAPACK_GLOBAL(slantr,SLANTR) · defined at line 13583 of lapacke.h

the sla mini-block, all just vibing in the 13540s–13650s range, lowkey the coziest neighborhood in the file 🏡

  • LAPACK_slapmr — expands to LAPACK_GLOBAL(slapmr,SLAPMR) · defined at line 13645 of lapacke.h
  • LAPACK_slapmt — expands to LAPACK_GLOBAL(slapmt,SLAPMT) · defined at line 13649 of lapacke.h
  • LAPACK_slapy2 — expands to LAPACK_GLOBAL(slapy2,SLAPY2) · defined at line 13653 of lapacke.h
  • LAPACK_slapy3 — expands to LAPACK_GLOBAL(slapy3,SLAPY3) · defined at line 13655 of lapacke.h
  • LAPACK_slarfb — expands to LAPACK_GLOBAL(slarfb,SLARFB) · defined at line 13593 of lapacke.h
  • LAPACK_slarfg — expands to LAPACK_GLOBAL(slarfg,SLARFG) · defined at line 13597 of lapacke.h
  • LAPACK_slarft — expands to LAPACK_GLOBAL(slarft,SLARFT) · defined at line 13605 of lapacke.h
  • LAPACK_slarfx — expands to LAPACK_GLOBAL(slarfx,SLARFX) · defined at line 13609 of lapacke.h

SLARFB, SLARFG, SLARFT, SLARFX — four besties, four different last letters, one shared destiny 😭

  • LAPACK_slarnv — expands to LAPACK_GLOBAL(slarnv,SLARNV) · defined at line 13543 of lapacke.h
  • LAPACK_slartgp — expands to LAPACK_GLOBAL(slartgp,SLARTGP) · defined at line 13657 of lapacke.h
  • LAPACK_slartgs — expands to LAPACK_GLOBAL(slartgs,SLARTGS) · defined at line 13659 of lapacke.h
  • LAPACK_slascl — expands to LAPACK_GLOBAL(slascl,SLASCL) · defined at line 13629 of lapacke.h
  • LAPACK_slaset — expands to LAPACK_GLOBAL(slaset,SLASET) · defined at line 13633 of lapacke.h
  • LAPACK_slasrt — expands to LAPACK_GLOBAL(slasrt,SLASRT) · defined at line 13637 of lapacke.h
  • LAPACK_slassq — expands to LAPACK_GLOBAL(slassq,SLASSQ) · defined at line 13601 of lapacke.h
  • LAPACK_slaswp — expands to LAPACK_GLOBAL(slaswp,SLASWP) · defined at line 13565 of lapacke.h
  • LAPACK_slatms — expands to LAPACK_GLOBAL(slatms,SLATMS) · defined at line 13613 of lapacke.h
  • LAPACK_slauum — expands to LAPACK_GLOBAL(slauum,SLAUUM) · defined at line 13621 of lapacke.h

not the slascl / slaset / slasrt trio at 13629 / 13633 / 13637 sitting in perfect four-line formation 💅 formatting icon behavior only

  • LAPACK_sopgtr — expands to LAPACK_GLOBAL(sopgtr,SOPGTR) · defined at line 13141 of lapacke.h
  • LAPACK_sopmtr — expands to LAPACK_GLOBAL(sopmtr,SOPMTR) · defined at line 13143 of lapacke.h
  • LAPACK_sorbdb — expands to LAPACK_GLOBAL(sorbdb,SORBDB) · defined at line 13685 of lapacke.h
  • LAPACK_sorcsd — expands to LAPACK_GLOBAL(sorcsd,SORCSD) · defined at line 13686 of lapacke.h
  • LAPACK_sorcsd2by1 — expands to LAPACK_GLOBAL(sorcsd2by1,SORCSD2BY1) · defined at line 13687 of lapacke.h
  • LAPACK_sorgbr — expands to LAPACK_GLOBAL(sorgbr,SORGBR) · defined at line 13111 of lapacke.h

and closing this batch out with SORBDB / SORCSD / SORCSD2BY1 stacked on three consecutive lines — 13685, 13686, 13687 — no gap, no shame, iconic 💖 keep scrolling bestie, the alphabet isn't done with us yet 🦋

okay so we're deep in the s block now and it just keeps going 💅 same deal as always: every line here is a #define that wires the LAPACKE name to the real routine through LAPACK_GLOBAL, and I've kept every line number so you can find it in lapacke.h yourself. no skipping, no summarising, we're doing all of them 🫶

  • #define LAPACK_sorghr LAPACK_GLOBAL(sorghr,SORGHR) — defined at line 13205 of lapacke.h ✨
  • #define LAPACK_sorglq LAPACK_GLOBAL(sorglq,SORGLQ) — defined at line 13055 of lapacke.h ✨
  • #define LAPACK_sorgql LAPACK_GLOBAL(sorgql,SORGQL) — defined at line 13067 of lapacke.h ✨
  • #define LAPACK_sorgqr LAPACK_GLOBAL(sorgqr,SORGQR) — defined at line 13043 of lapacke.h 🌸
  • #define LAPACK_sorgrq LAPACK_GLOBAL(sorgrq,SORGRQ) — defined at line 13079 of lapacke.h ✨
  • #define LAPACK_sorgtr LAPACK_GLOBAL(sorgtr,SORGTR) — defined at line 13129 of lapacke.h ✨
  • #define LAPACK_sormbr LAPACK_GLOBAL(sormbr,SORMBR) — defined at line 13113 of lapacke.h ✨
  • #define LAPACK_sormhr LAPACK_GLOBAL(sormhr,SORMHR) — defined at line 13207 of lapacke.h ✨
  • #define LAPACK_sormlq LAPACK_GLOBAL(sormlq,SORMLQ) — defined at line 13057 of lapacke.h ✨
  • #define LAPACK_sormql LAPACK_GLOBAL(sormql,SORMQL) — defined at line 13071 of lapacke.h ✨
  • #define LAPACK_sormqr LAPACK_GLOBAL(sormqr,SORMQR) — defined at line 13045 of lapacke.h ✨
  • #define LAPACK_sormrq LAPACK_GLOBAL(sormrq,SORMRQ) — defined at line 13083 of lapacke.h ✨
  • #define LAPACK_sormrz LAPACK_GLOBAL(sormrz,SORMRZ) — defined at line 13091 of lapacke.h ✨
  • #define LAPACK_sormtr LAPACK_GLOBAL(sormtr,SORMTR) — defined at line 13131 of lapacke.h ✨
  • #define LAPACK_spbcon LAPACK_GLOBAL(spbcon,SPBCON) — defined at line 12749 of lapacke.h 🦋
  • #define LAPACK_spbequ LAPACK_GLOBAL(spbequ,SPBEQU) — defined at line 12919 of lapacke.h 🦋
  • #define LAPACK_spbrfs LAPACK_GLOBAL(spbrfs,SPBRFS) — defined at line 12813 of lapacke.h 🦋
  • #define LAPACK_spbstf LAPACK_GLOBAL(spbstf,SPBSTF) — defined at line 13197 of lapacke.h 🦋
  • #define LAPACK_spbsv LAPACK_GLOBAL(spbsv,SPBSV) — defined at line 12985 of lapacke.h 🦋
  • #define LAPACK_spbsvx LAPACK_GLOBAL(spbsvx,SPBSVX) — defined at line 12989 of lapacke.h 🦋
  • #define LAPACK_spbtrf LAPACK_GLOBAL(spbtrf,SPBTRF) — defined at line 12641 of lapacke.h 🦋
  • #define LAPACK_spbtrs LAPACK_GLOBAL(spbtrs,SPBTRS) — defined at line 12691 of lapacke.h 🦋
  • #define LAPACK_spftrf LAPACK_GLOBAL(spftrf,SPFTRF) — defined at line 12634 of lapacke.h 🦋
  • #define LAPACK_spftri LAPACK_GLOBAL(spftri,SPFTRI) — defined at line 12860 of lapacke.h 🦋
  • #define LAPACK_spftrs LAPACK_GLOBAL(spftrs,SPFTRS) — defined at line 12684 of lapacke.h 🦋
  • #define LAPACK_spocon LAPACK_GLOBAL(spocon,SPOCON) — defined at line 12741 of lapacke.h 💜
  • #define LAPACK_spoequ LAPACK_GLOBAL(spoequ,SPOEQU) — defined at line 12907 of lapacke.h 💜
  • #define LAPACK_spoequb LAPACK_GLOBAL(spoequb,SPOEQUB) — defined at line 12912 of lapacke.h 💜
  • #define LAPACK_sporfs LAPACK_GLOBAL(sporfs,SPORFS) — defined at line 12801 of lapacke.h 💜
  • #define LAPACK_sporfsx LAPACK_GLOBAL(sporfsx,SPORFSX) — defined at line 12806 of lapacke.h 💜
  • #define LAPACK_sposv LAPACK_GLOBAL(sposv,SPOSV) — defined at line 12963 of lapacke.h 💜
  • #define LAPACK_sposvx LAPACK_GLOBAL(sposvx,SPOSVX) — defined at line 12969 of lapacke.h 💜
  • #define LAPACK_sposvxx LAPACK_GLOBAL(sposvxx,SPOSVXX) — defined at line 12974 of lapacke.h 💜
  • #define LAPACK_spotrf LAPACK_GLOBAL(spotrf,SPOTRF) — defined at line 12621 of lapacke.h 💜
  • #define LAPACK_spotrf2 LAPACK_GLOBAL(spotrf2,SPOTRF2) — defined at line 12625 of lapacke.h 💜
  • #define LAPACK_spotri LAPACK_GLOBAL(spotri,SPOTRI) — defined at line 12855 of lapacke.h 💜
  • #define LAPACK_spotrs LAPACK_GLOBAL(spotrs,SPOTRS) — defined at line 12679 of lapacke.h 💜
  • #define LAPACK_sppcon LAPACK_GLOBAL(sppcon,SPPCON) — defined at line 12745 of lapacke.h 🎀
  • #define LAPACK_sppequ LAPACK_GLOBAL(sppequ,SPPEQU) — defined at line 12915 of lapacke.h 🎀
  • #define LAPACK_spprfs LAPACK_GLOBAL(spprfs,SPPRFS) — defined at line 12809 of lapacke.h 🎀
  • #define LAPACK_sppsv LAPACK_GLOBAL(sppsv,SPPSV) — defined at line 12977 of lapacke.h 🎀
  • #define LAPACK_sppsvx LAPACK_GLOBAL(sppsvx,SPPSVX) — defined at line 12981 of lapacke.h 🎀
  • #define LAPACK_spptrf LAPACK_GLOBAL(spptrf,SPPTRF) — defined at line 12637 of lapacke.h 🎀
  • #define LAPACK_spptri LAPACK_GLOBAL(spptri,SPPTRI) — defined at line 12863 of lapacke.h 🎀
  • #define LAPACK_spptrs LAPACK_GLOBAL(spptrs,SPPTRS) — defined at line 12687 of lapacke.h 🎀
  • #define LAPACK_spstrf LAPACK_GLOBAL(spstrf,SPSTRF) — defined at line 12630 of lapacke.h 🎀
  • #define LAPACK_sptcon LAPACK_GLOBAL(sptcon,SPTCON) — defined at line 12753 of lapacke.h 🍓
  • #define LAPACK_spteqr LAPACK_GLOBAL(spteqr,SPTEQR) — defined at line 13173 of lapacke.h 🍓
  • #define LAPACK_sptrfs LAPACK_GLOBAL(sptrfs,SPTRFS) — defined at line 12817 of lapacke.h 🍓
  • #define LAPACK_sptsv LAPACK_GLOBAL(sptsv,SPTSV) — defined at line 12993 of lapacke.h 🍓
  • #define LAPACK_sptsvx LAPACK_GLOBAL(sptsvx,SPTSVX) — defined at line 12997 of lapacke.h 🍓
  • #define LAPACK_spttrf LAPACK_GLOBAL(spttrf,SPTTRF) — defined at line 12645 of lapacke.h 🍓
  • #define LAPACK_spttrs LAPACK_GLOBAL(spttrs,SPTTRS) — defined at line 12695 of lapacke.h 🍓

and now we slide into the ss era, bestie, hold my hand 🤝

  • #define LAPACK_ssbev LAPACK_GLOBAL(ssbev,SSBEV) — defined at line 13369 of lapacke.h ⭐
  • #define LAPACK_ssbev_2stage LAPACK_GLOBAL(ssbev_2stage,SSBEV_2STAGE) — defined at line 13373 of lapacke.h ⭐ (yes the _2stage ones are a whole vibe, the macro name keeps its lowercase _2stage but the LAPACK_GLOBAL second arg goes ALL CAPS SSBEV_2STAGE — copy it exactly, don't get creative 💀)
  • #define LAPACK_ssbevd LAPACK_GLOBAL(ssbevd,SSBEVD) — defined at line 13377 of lapacke.h ⭐
  • #define LAPACK_ssbevd_2stage LAPACK_GLOBAL(ssbevd_2stage,SSBEVD_2STAGE) — defined at line 13381 of lapacke.h ⭐
  • #define LAPACK_ssbevx LAPACK_GLOBAL(ssbevx,SSBEVX) — defined at line 13385 of lapacke.h ⭐
  • #define LAPACK_ssbevx_2stage LAPACK_GLOBAL(ssbevx_2stage,SSBEVX_2STAGE) — defined at line 13389 of lapacke.h ⭐
  • #define LAPACK_ssbgst LAPACK_GLOBAL(ssbgst,SSBGST) — defined at line 13193 of lapacke.h 🌈
  • #define LAPACK_ssbgv LAPACK_GLOBAL(ssbgv,SSBGV) — defined at line 13469 of lapacke.h 🌈
  • #define LAPACK_ssbgvd LAPACK_GLOBAL(ssbgvd,SSBGVD) — defined at line 13473 of lapacke.h 🌈
  • #define LAPACK_ssbgvx LAPACK_GLOBAL(ssbgvx,SSBGVX) — defined at line 13477 of lapacke.h 🌈
  • #define LAPACK_ssbtrd LAPACK_GLOBAL(ssbtrd,SSBTRD) — defined at line 13151 of lapacke.h 🌈
  • #define LAPACK_ssfrk LAPACK_GLOBAL(ssfrk,SSFRK) — defined at line 13506 of lapacke.h 🌈
  • #define LAPACK_sspcon LAPACK_GLOBAL(sspcon,SSPCON) — defined at line 12763 of lapacke.h 🔥
  • #define LAPACK_sspev LAPACK_GLOBAL(sspev,SSPEV) — defined at line 13357 of lapacke.h 🔥
  • #define LAPACK_sspevd LAPACK_GLOBAL(sspevd,SSPEVD) — defined at line 13361 of lapacke.h 🔥
  • #define LAPACK_sspevx LAPACK_GLOBAL(sspevx,SSPEVX) — defined at line 13365 of lapacke.h 🔥
  • #define LAPACK_sspgst LAPACK_GLOBAL(sspgst,SSPGST) — defined at line 13189 of lapacke.h 🔥
  • #define LAPACK_sspgv LAPACK_GLOBAL(sspgv,SSPGV) — defined at line 13457 of lapacke.h 🔥
  • #define LAPACK_sspgvd LAPACK_GLOBAL(sspgvd,SSPGVD) — defined at line 13461 of lapacke.h 🔥
  • #define LAPACK_sspgvx LAPACK_GLOBAL(sspgvx,SSPGVX) — defined at line 13465 of lapacke.h 🔥
  • #define LAPACK_ssprfs LAPACK_GLOBAL(ssprfs,SSPRFS) — defined at line 12833 of lapacke.h 🧚
  • #define LAPACK_sspsv LAPACK_GLOBAL(sspsv,SSPSV) — defined at line 13019 of lapacke.h 🧚
  • #define LAPACK_sspsvx LAPACK_GLOBAL(sspsvx,SSPSVX) — defined at line 13023 of lapacke.h 🧚
  • #define LAPACK_ssptrd LAPACK_GLOBAL(ssptrd,SSPTRD) — defined at line 13139 of lapacke.h 🧚
  • #define LAPACK_ssptrf LAPACK_GLOBAL(ssptrf,SSPTRF) — defined at line 12661 of lapacke.h 🧚
  • #define LAPACK_ssptri LAPACK_GLOBAL(ssptri,SSPTRI) — defined at line 12873 of lapacke.h 🧚
  • #define LAPACK_ssptrs LAPACK_GLOBAL(ssptrs,SSPTRS) — defined at line 12711 of lapacke.h 🧚
  • #define LAPACK_sstebz LAPACK_GLOBAL(sstebz,SSTEBZ) — defined at line 13177 of lapacke.h 👑
  • #define LAPACK_sstedc LAPACK_GLOBAL(sstedc,SSTEDC) — defined at line 13165 of lapacke.h 👑
  • #define LAPACK_sstegr LAPACK_GLOBAL(sstegr,SSTEGR) — defined at line 13169 of lapacke.h 👑
  • #define LAPACK_sstein LAPACK_GLOBAL(sstein,SSTEIN) — defined at line 13179 of lapacke.h 👑
  • #define LAPACK_sstemr LAPACK_GLOBAL(sstemr,SSTEMR) — defined at line 13161 of lapacke.h 👑
  • #define LAPACK_ssteqr LAPACK_GLOBAL(ssteqr,SSTEQR) — defined at line 13157 of lapacke.h 👑
  • #define LAPACK_ssterf LAPACK_GLOBAL(ssterf,SSTERF) — defined at line 13155 of lapacke.h 👑
  • #define LAPACK_sstev LAPACK_GLOBAL(sstev,SSTEV) — defined at line 13393 of lapacke.h 💫
  • #define LAPACK_sstevd LAPACK_GLOBAL(sstevd,SSTEVD) — defined at line 13395 of lapacke.h 💫
  • #define LAPACK_sstevr LAPACK_GLOBAL(sstevr,SSTEVR) — defined at line 13399 of lapacke.h 💫
  • #define LAPACK_sstevx LAPACK_GLOBAL(sstevx,SSTEVX) — defined at line 13397 of lapacke.h 💫 (heads up, sstevr and sstevx are adjacent-ish but the line numbers flip: 13399 for sstevr, 13397 for sstevx — don't let your brain autocomplete that one 🙈)

okay the ssy cluster is next and honestly it's giving main character energy 👑

  • #define LAPACK_ssycon LAPACK_GLOBAL(ssycon,SSYCON) — defined at line 12757 of lapacke.h 💖
  • #define LAPACK_ssycon_3 LAPACK_GLOBAL(ssycon_3,SSYCON_3) — defined at line 13796 of lapacke.h 💖
  • #define LAPACK_ssyconv LAPACK_GLOBAL(ssyconv,SSYCONV) — defined at line 13688 of lapacke.h 💖 (and yes ssycon, ssycon_3 and ssyconv are three different things — the _3 and the missing _3 are not typos, write them exactly as shown 😭)
  • #define LAPACK_ssyequb LAPACK_GLOBAL(ssyequb,SSYEQUB) — defined at line 12924 of lapacke.h 💖
  • #define LAPACK_ssyev LAPACK_GLOBAL(ssyev,SSYEV) — defined at line 13325 of lapacke.h 💖
  • #define LAPACK_ssyev_2stage LAPACK_GLOBAL(ssyev_2stage,SSYEV_2STAGE) — defined at line 13329 of lapacke.h 💖
  • #define LAPACK_ssyevd LAPACK_GLOBAL(ssyevd,SSYEVD) — defined at line 13333 of lapacke.h 💖
  • #define LAPACK_ssyevd_2stage LAPACK_GLOBAL(ssyevd_2stage,SSYEVD_2STAGE) — defined at line 13337 of lapacke.h 💖
  • #define LAPACK_ssyevr LAPACK_GLOBAL(ssyevr,SSYEVR) — defined at line 13349 of lapacke.h 💖
  • #define LAPACK_ssyevr_2stage LAPACK_GLOBAL(ssyevr_2stage,SSYEVR_2STAGE) — defined at line 13353 of lapacke.h 💖
  • #define LAPACK_ssyevx LAPACK_GLOBAL(ssyevx,SSYEVX) — defined at line 13341 of lapacke.h 💖
  • #define LAPACK_ssyevx_2stage LAPACK_GLOBAL(ssyevx_2stage,SSYEVX_2STAGE) — defined at line 13345 of lapacke.h 💖 (see how ssyevx sits at 13341 and ssyevx_2stage at 13345, while ssyevr is 13349 and ssyevr_2stage is 13353? the ordering in the file is not alphabetical by suffix, so just trust the numbers ✨)
  • #define LAPACK_ssygst LAPACK_GLOBAL(ssygst,SSYGST) — defined at line 13185 of lapacke.h 🦋
  • #define LAPACK_ssygv LAPACK_GLOBAL(ssygv,SSYGV) — defined at line 13441 of lapacke.h 🦋
  • #define LAPACK_ssygv_2stage LAPACK_GLOBAL(ssygv_2stage,SSYGV_2STAGE) — defined at line 13445 of lapacke.h 🦋
  • #define LAPACK_ssygvd LAPACK_GLOBAL(ssygvd,SSYGVD) — defined at line 13449 of lapacke.h 🦋
  • #define LAPACK_ssygvx LAPACK_GLOBAL(ssygvx,SSYGVX) — defined at line 13453 of lapacke.h 🦋
  • #define LAPACK_ssyrfs LAPACK_GLOBAL(ssyrfs,SSYRFS) — defined at line 12821 of lapacke.h 🦋

and that's where part 97 dips out — there is so much more of this macro wall coming, so hydrate bestie, we're not even close to done 💀🫶

  • #define LAPACK_ssyrfsx → LAPACK_GLOBAL(ssyrfsx,SSYRFSX) — bestie this one lives at Definition at line 12826 of file lapacke.h. 💖
  • #define LAPACK_ssysv → LAPACK_GLOBAL(ssysv,SSYSV) — Definition at line 13001 of file lapacke.h. ✨
  • #define LAPACK_ssysv_aa → LAPACK_GLOBAL(ssysv_aa,SSYSV_AA) — Definition at line 13753 of file lapacke.h. 🎀
  • #define LAPACK_ssysv_aa_2stage → LAPACK_GLOBAL(ssysv_aa_2stage,SSYSV_AA_2STAGE) — Definition at line 13824 of file lapacke.h. 🦋
  • #define LAPACK_ssysv_rk → LAPACK_GLOBAL(ssysv_rk,SSYSV_RK) — Definition at line 13772 of file lapacke.h. 🌸
  • #define LAPACK_ssysv_rook → LAPACK_GLOBAL(ssysv_rook,SSYSV_ROOK) — Definition at line 13740 of file lapacke.h. 💅
  • #define LAPACK_ssysvx → LAPACK_GLOBAL(ssysvx,SSYSVX) — Definition at line 13005 of file lapacke.h. 🫶
  • #define LAPACK_ssysvxx → LAPACK_GLOBAL(ssysvxx,SSYSVXX) — Definition at line 13010 of file lapacke.h. 😭
  • #define LAPACK_ssyswapr → LAPACK_GLOBAL(ssyswapr,SSYSWAPR) — Definition at line 13689 of file lapacke.h. 🔥
  • #define LAPACK_ssytrd → LAPACK_GLOBAL(ssytrd,SSYTRD) — Definition at line 13127 of file lapacke.h. 👑
  • #define LAPACK_ssytrf → LAPACK_GLOBAL(ssytrf,SSYTRF) — Definition at line 12649 of file lapacke.h. 🌈
  • #define LAPACK_ssytrf_aa → LAPACK_GLOBAL(ssytrf_aa,SSYTRF_AA) — Definition at line 13765 of file lapacke.h. ⭐
  • #define LAPACK_ssytrf_aa_2stage → LAPACK_GLOBAL(ssytrf_aa_2stage,SSYTRF_AA_2STAGE) — Definition at line 13836 of file lapacke.h. 💀
  • #define LAPACK_ssytrf_rk → LAPACK_GLOBAL(ssytrf_rk,SSYTRF_RK) — Definition at line 13778 of file lapacke.h. 🙈
  • #define LAPACK_ssytrf_rook → LAPACK_GLOBAL(ssytrf_rook,SSYTRF_ROOK) — Definition at line 12650 of file lapacke.h. 🍓
  • #define LAPACK_ssytri → LAPACK_GLOBAL(ssytri,SSYTRI) — Definition at line 12867 of file lapacke.h. 🧚
  • #define LAPACK_ssytri2 → LAPACK_GLOBAL(ssytri2,SSYTRI2) — Definition at line 13690 of file lapacke.h. 💜
  • #define LAPACK_ssytri2x → LAPACK_GLOBAL(ssytri2x,SSYTRI2X) — Definition at line 13691 of file lapacke.h. 💖
  • #define LAPACK_ssytri_3 → LAPACK_GLOBAL(ssytri_3,SSYTRI_3) — Definition at line 13790 of file lapacke.h. ✨
  • #define LAPACK_ssytrs → LAPACK_GLOBAL(ssytrs,SSYTRS) — Definition at line 12699 of file lapacke.h. 🎀
  • #define LAPACK_ssytrs2 → LAPACK_GLOBAL(ssytrs2,SSYTRS2) — Definition at line 13692 of file lapacke.h. 🦋
  • #define LAPACK_ssytrs_3 → LAPACK_GLOBAL(ssytrs_3,SSYTRS_3) — Definition at line 13784 of file lapacke.h. 🌸
  • #define LAPACK_ssytrs_aa → LAPACK_GLOBAL(ssytrs_aa,SSYTRS_AA) — Definition at line 13759 of file lapacke.h. 💅
  • #define LAPACK_ssytrs_aa_2stage → LAPACK_GLOBAL(ssytrs_aa_2stage,SSYTRS_AA_2STAGE) — Definition at line 13830 of file lapacke.h. 🫶
  • #define LAPACK_ssytrs_rook → LAPACK_GLOBAL(ssytrs_rook,SSYTRS_ROOK) — Definition at line 12700 of file lapacke.h. 😭
  • #define LAPACK_stbcon → LAPACK_GLOBAL(stbcon,STBCON) — Definition at line 12777 of file lapacke.h. 🔥
  • #define LAPACK_stbrfs → LAPACK_GLOBAL(stbrfs,STBRFS) — Definition at line 12847 of file lapacke.h. 👑
  • #define LAPACK_stbtrs → LAPACK_GLOBAL(stbtrs,STBTRS) — Definition at line 12725 of file lapacke.h. 🌈
  • #define LAPACK_stfsm → LAPACK_GLOBAL(stfsm,STFSM) — Definition at line 13510 of file lapacke.h. ⭐
  • #define LAPACK_stftri → LAPACK_GLOBAL(stftri,STFTRI) — Definition at line 12884 of file lapacke.h. 💀
  • #define LAPACK_stfttp → LAPACK_GLOBAL(stfttp,STFTTP) — Definition at line 13514 of file lapacke.h. 🙈
  • #define LAPACK_stfttr → LAPACK_GLOBAL(stfttr,STFTTR) — Definition at line 13518 of file lapacke.h. 🍓
  • #define LAPACK_stgevc → LAPACK_GLOBAL(stgevc,STGEVC) — Definition at line 13269 of file lapacke.h. 🧚
  • #define LAPACK_stgexc → LAPACK_GLOBAL(stgexc,STGEXC) — Definition at line 13273 of file lapacke.h. 💜
  • #define LAPACK_stgsen → LAPACK_GLOBAL(stgsen,STGSEN) — Definition at line 13277 of file lapacke.h. 💖
  • #define LAPACK_stgsja → LAPACK_GLOBAL(stgsja,STGSJA) — Definition at line 13297 of file lapacke.h. ✨
  • #define LAPACK_stgsna → LAPACK_GLOBAL(stgsna,STGSNA) — Definition at line 13285 of file lapacke.h. 🎀
  • #define LAPACK_stgsyl → LAPACK_GLOBAL(stgsyl,STGSYL) — Definition at line 13281 of file lapacke.h. 🦋
  • #define LAPACK_stpcon → LAPACK_GLOBAL(stpcon,STPCON) — Definition at line 12773 of file lapacke.h. 🌸
  • #define LAPACK_stpmqrt → LAPACK_GLOBAL(stpmqrt,STPMQRT) — Definition at line 13723 of file lapacke.h. 💅
  • #define LAPACK_stpqrt → LAPACK_GLOBAL(stpqrt,STPQRT) — Definition at line 13727 of file lapacke.h. 🫶
  • #define LAPACK_stpqrt2 → LAPACK_GLOBAL(stpqrt2,STPQRT2) — Definition at line 13731 of file lapacke.h. 😭
  • #define LAPACK_stprfb → LAPACK_GLOBAL(stprfb,STPRFB) — Definition at line 13735 of file lapacke.h. 🔥
  • #define LAPACK_stprfs → LAPACK_GLOBAL(stprfs,STPRFS) — Definition at line 12843 of file lapacke.h. 👑
  • #define LAPACK_stptri → LAPACK_GLOBAL(stptri,STPTRI) — Definition at line 12887 of file lapacke.h. 🌈
  • #define LAPACK_stptrs → LAPACK_GLOBAL(stptrs,STPTRS) — Definition at line 12721 of file lapacke.h. ⭐
  • #define LAPACK_stpttf → LAPACK_GLOBAL(stpttf,STPTTF) — Definition at line 13522 of file lapacke.h. 💀
  • #define LAPACK_stpttr → LAPACK_GLOBAL(stpttr,STPTTR) — Definition at line 13526 of file lapacke.h. 🙈
  • #define LAPACK_strcon → LAPACK_GLOBAL(strcon,STRCON) — Definition at line 12769 of file lapacke.h. 🍓
  • #define LAPACK_strevc → LAPACK_GLOBAL(strevc,STREVC) — Definition at line 13229 of file lapacke.h. 🧚
  • #define LAPACK_strexc → LAPACK_GLOBAL(strexc,STREXC) — Definition at line 13237 of file lapacke.h. 💜
  • #define LAPACK_strrfs → LAPACK_GLOBAL(strrfs,STRRFS) — Definition at line 12839 of file lapacke.h. 💖
  • #define LAPACK_strsen → LAPACK_GLOBAL(strsen,STRSEN) — Definition at line 13241 of file lapacke.h. ✨
  • #define LAPACK_strsna → LAPACK_GLOBAL(strsna,STRSNA) — Definition at line 13233 of file lapacke.h. 🎀
  • #define LAPACK_strsyl → LAPACK_GLOBAL(strsyl,STRSYL) — Definition at line 13245 of file lapacke.h. 🦋
  • #define LAPACK_strtri → LAPACK_GLOBAL(strtri,STRTRI) — Definition at line 12879 of file lapacke.h. 🌸
  • #define LAPACK_strtrs → LAPACK_GLOBAL(strtrs,STRTRS) — Definition at line 12717 of file lapacke.h. 💅
  • #define LAPACK_strttf → LAPACK_GLOBAL(strttf,STRTTF) — Definition at line 13530 of file lapacke.h. 🫶
  • #define LAPACK_strttp → LAPACK_GLOBAL(strttp,STRTTP) — Definition at line 13534 of file lapacke.h. 😭
  • #define LAPACK_stzrzf → LAPACK_GLOBAL(stzrzf,STZRZF) — Definition at line 13087 of file lapacke.h. 🔥
  • #define LAPACK_TRANSPOSE_MEMORY_ERROR → -1011 — Definition at line 123 of file lapacke.h. 👑
  • #define LAPACK_WORK_MEMORY_ERROR → -1010 — Definition at line 122 of file lapacke.h. 🌈
  • #define LAPACK_Z2INT(x) → (lapack_int)(*((double*)&x )) — Definition at line 117 of file lapacke.h. ⭐
  • #define LAPACK_zbbcsd → LAPACK_GLOBAL(zbbcsd,ZBBCSD) — Definition at line 13693 of file lapacke.h. 💀
  • #define LAPACK_zbdsqr → LAPACK_GLOBAL(zbdsqr,ZBDSQR) — Definition at line 13122 of file lapacke.h. 🙈
  • #define LAPACK_zcgesv → LAPACK_GLOBAL(zcgesv,ZCGESV) — Definition at line 12934 of file lapacke.h. 🍓
  • #define LAPACK_zcposv → LAPACK_GLOBAL(zcposv,ZCPOSV) — Definition at line 12968 of file lapacke.h. 🧚
  • #define LAPACK_zgbbrd → LAPACK_GLOBAL(zgbbrd,ZGBBRD) — Definition at line 13110 of file lapacke.h. 💜
  • #define LAPACK_zgbcon → LAPACK_GLOBAL(zgbcon,ZGBCON) — Definition at line 12736 of file lapacke.h. 💖
  • #define LAPACK_zgbequ → LAPACK_GLOBAL(zgbequ,ZGBEQU) — Definition at line 12902 of file lapacke.h. ✨
  • #define LAPACK_zgbequb → LAPACK_GLOBAL(zgbequb,ZGBEQUB) — Definition at line 12905 of file lapacke.h. 🎀
  • #define LAPACK_zgbrfs → LAPACK_GLOBAL(zgbrfs,ZGBRFS) — Definition at line 12792 of file lapacke.h. 🦋
  • #define LAPACK_zgbrfsx → LAPACK_GLOBAL(zgbrfsx,ZGBRFSX) — Definition at line 12795 of file lapacke.h. 🌸
  • #define LAPACK_zgbsv → LAPACK_GLOBAL(zgbsv,ZGBSV) — Definition at line 12946 of file lapacke.h. 💅
  • #define LAPACK_zgbsvx → LAPACK_GLOBAL(zgbsvx,ZGBSVX) — Definition at line 12950 of file lapacke.h. 🫶
  • #define LAPACK_zgbsvxx → LAPACK_GLOBAL(zgbsvxx,ZGBSVXX) — Definition at line 12953 of file lapacke.h. 😭
  • #define LAPACK_zgbtrf → LAPACK_GLOBAL(zgbtrf,ZGBTRF) — Definition at line 12616 of file lapacke.h. 🔥
  • #define LAPACK_zgbtrs → LAPACK_GLOBAL(zgbtrs,ZGBTRS) — Definition at line 12674 of file lapacke.h. 👑
  • #define LAPACK_zgebak → LAPACK_GLOBAL(zgebak,ZGEBAK) — Definition at line 13220 of file lapacke.h. 🌈
  • #define LAPACK_zgebal → LAPACK_GLOBAL(zgebal,ZGEBAL) — Definition at line 13216 of file lapacke.h. ⭐
  • #define LAPACK_zgebrd → LAPACK_GLOBAL(zgebrd,ZGEBRD) — Definition at line 13106 of file lapacke.h. 💀
  • #define LAPACK_zgecon → LAPACK_GLOBAL(zgecon,ZGECON) — Definition at line 12732 of file lapacke.h. 🙈
  • #define LAPACK_zgeequ → LAPACK_GLOBAL(zgeequ,ZGEEQU) — Definition at line 12894 of file lapacke.h. 🍓
  • #define LAPACK_zgeequb → LAPACK_GLOBAL(zgeequb,ZGEEQUB) — Definition at line 12897 of file lapacke.h. 🧚
  • #define LAPACK_zgees → LAPACK_GLOBAL(zgees,ZGEES) — Definition at line 13404 of file lapacke.h. 💜
  • #define LAPACK_zgeesx → LAPACK_GLOBAL(zgeesx,ZGEESX) — Definition at line 13408 of file lapacke.h. 💖
  • #define LAPACK_zgeev → LAPACK_GLOBAL(zgeev,ZGEEV) — Definition at line 13412 of file lapacke.h. ✨
  • #define LAPACK_zgeevx → LAPACK_GLOBAL(zgeevx,ZGEEVX) — Definition at line 13416 of file lapacke.h. 🎀
  • #define LAPACK_zgehrd → LAPACK_GLOBAL(zgehrd,ZGEHRD) — Definition at line 13204 of file lapacke.h. 🦋
  • #define LAPACK_zgejsv → LAPACK_GLOBAL(zgejsv,ZGEJSV) — Definition at line 13432 of file lapacke.h. 🌸
  • #define LAPACK_zgelq → LAPACK_GLOBAL(zgelq,ZGELQ) — Definition at line 13805 of file lapacke.h. 💅
  • #define LAPACK_zgelq2 → LAPACK_GLOBAL(zgelq2,ZGELQ2) — Definition at line 13592 of file lapacke.h. 🫶
  • #define LAPACK_zgelqf → LAPACK_GLOBAL(zgelqf,ZGELQF) — Definition at line 13054 of file lapacke.h. 😭
  • #define LAPACK_zgels → LAPACK_GLOBAL(zgels,ZGELS) — Definition at line 13304 of file lapacke.h. 🔥
  • #define LAPACK_zgelsd → LAPACK_GLOBAL(zgelsd,ZGELSD) — Definition at line 13316 of file lapacke.h. 👑
  • #define LAPACK_zgelss → LAPACK_GLOBAL(zgelss,ZGELSS) — Definition at line 13312 of file lapacke.h. 🌈
  • #define LAPACK_zgelsy → LAPACK_GLOBAL(zgelsy,ZGELSY) — Definition at line 13308 of file lapacke.h. ⭐
  • #define LAPACK_zgemlq → LAPACK_GLOBAL(zgemlq,ZGEMLQ) — Definition at line 13809 of file lapacke.h. 💀
  • #define LAPACK_zgemqr → LAPACK_GLOBAL(zgemqr,ZGEMQR) — Definition at line 13817 of file lapacke.h. 🙈
  • #define LAPACK_zgemqrt → LAPACK_GLOBAL(zgemqrt,ZGEMQRT) — Definition at line 13710 of file lapacke.h. 🍓
  • #define LAPACK_zgeqlf → LAPACK_GLOBAL(zgeqlf,ZGEQLF) — Definition at line 13066 of file lapacke.h. 🧚
  • #define LAPACK_zgeqp3 → LAPACK_GLOBAL(zgeqp3,ZGEQP3) — Definition at line 13042 of file lapacke.h. 💜
  • #define LAPACK_zgeqpf → LAPACK_GLOBAL(zgeqpf,ZGEQPF) — Definition at line 13038 of file lapacke.h. 💖
  • #define LAPACK_zgeqr → LAPACK_GLOBAL(zgeqr,ZGEQR) — Definition at line 13813 of file lapacke.h. ✨
  • #define LAPACK_zgeqr2 → LAPACK_GLOBAL(zgeqr2,ZGEQR2) — Definition at line 13550 of file lapacke.h. 🎀
  • #define LAPACK_zgeqrf → LAPACK_GLOBAL(zgeqrf,ZGEQRF) — Definition at line 13034 of file lapacke.h. 🦋
  • #define LAPACK_zgeqrfp → LAPACK_GLOBAL(zgeqrfp,ZGEQRFP) — Definition at line 13540 of file lapacke.h. 🌸
  • #define LAPACK_zgeqrt → LAPACK_GLOBAL(zgeqrt,ZGEQRT) — Definition at line 13714 of file lapacke.h. 💅
  • #define LAPACK_zgeqrt2 → LAPACK_GLOBAL(zgeqrt2,ZGEQRT2) — Definition at line 13718 of file lapacke.h. 🫶

Okay so this is the part where the z-prefixed era really kicks in 💜 — every single one of these is a #define that points a LAPACKE name at a LAPACK_GLOBAL(...) pair, and the second argument is just the uppercase twin of the first. Same vibe, different casing. Slay.

  • LAPACK_zgeqrt3 — defined as LAPACK_GLOBAL(zgeqrt3,ZGEQRT3). Definition at line 13722 of file lapacke.h.
  • LAPACK_zgerfs — defined as LAPACK_GLOBAL(zgerfs,ZGERFS). Definition at line 12784 of file lapacke.h.
  • LAPACK_zgerfsx — defined as LAPACK_GLOBAL(zgerfsx,ZGERFSX). Definition at line 12787 of file lapacke.h.
  • LAPACK_zgerqf — defined as LAPACK_GLOBAL(zgerqf,ZGERQF). Definition at line 13078 of file lapacke.h.
  • LAPACK_zgesdd — defined as LAPACK_GLOBAL(zgesdd,ZGESDD). Definition at line 13428 of file lapacke.h.
  • LAPACK_zgesv — defined as LAPACK_GLOBAL(zgesv,ZGESV). Definition at line 12932 of file lapacke.h.
  • LAPACK_zgesvd — defined as LAPACK_GLOBAL(zgesvd,ZGESVD). Definition at line 13420 of file lapacke.h.
  • LAPACK_zgesvdx — defined as LAPACK_GLOBAL(zgesvdx,ZGESVDX). Definition at line 13424 of file lapacke.h.
  • LAPACK_zgesvj — defined as LAPACK_GLOBAL(zgesvj,ZGESVJ). Definition at line 13436 of file lapacke.h.
  • LAPACK_zgesvx — defined as LAPACK_GLOBAL(zgesvx,ZGESVX). Definition at line 12938 of file lapacke.h.
  • LAPACK_zgesvxx — defined as LAPACK_GLOBAL(zgesvxx,ZGESVXX). Definition at line 12941 of file lapacke.h.
  • LAPACK_zgetf2 — defined as LAPACK_GLOBAL(zgetf2,ZGETF2). Definition at line 13564 of file lapacke.h.
  • LAPACK_zgetrf — defined as LAPACK_GLOBAL(zgetrf,ZGETRF). Definition at line 12608 of file lapacke.h.
  • LAPACK_zgetrf2 — defined as LAPACK_GLOBAL(zgetrf2,ZGETRF2). Definition at line 12612 of file lapacke.h.
  • LAPACK_zgetri — defined as LAPACK_GLOBAL(zgetri,ZGETRI). Definition at line 12854 of file lapacke.h.
  • LAPACK_zgetrs — defined as LAPACK_GLOBAL(zgetrs,ZGETRS). Definition at line 12670 of file lapacke.h.
  • LAPACK_zgetsls — defined as LAPACK_GLOBAL(zgetsls,ZGETSLS). Definition at line 13821 of file lapacke.h.

Now we're sliding into the gg block 🦋 — bestie, the double-g gang is long, so buckle up:

  • LAPACK_zggbak — defined as LAPACK_GLOBAL(zggbak,ZGGBAK). Definition at line 13264 of file lapacke.h.
  • LAPACK_zggbal — defined as LAPACK_GLOBAL(zggbal,ZGGBAL). Definition at line 13260 of file lapacke.h.
  • LAPACK_zgges — defined as LAPACK_GLOBAL(zgges,ZGGES). Definition at line 13484 of file lapacke.h.
  • LAPACK_zgges3 — defined as LAPACK_GLOBAL(zgges3,ZGGES3). Definition at line 13488 of file lapacke.h.
  • LAPACK_zggesx — defined as LAPACK_GLOBAL(zggesx,ZGGESX). Definition at line 13492 of file lapacke.h.
  • LAPACK_zggev — defined as LAPACK_GLOBAL(zggev,ZGGEV). Definition at line 13496 of file lapacke.h.
  • LAPACK_zggev3 — defined as LAPACK_GLOBAL(zggev3,ZGGEV3). Definition at line 13500 of file lapacke.h.
  • LAPACK_zggevx — defined as LAPACK_GLOBAL(zggevx,ZGGEVX). Definition at line 13504 of file lapacke.h.
  • LAPACK_zggglm — defined as LAPACK_GLOBAL(zggglm,ZGGGLM). Definition at line 13324 of file lapacke.h.
  • LAPACK_zgghd3 — defined as LAPACK_GLOBAL(zgghd3,ZGGHD3). Definition at line 13256 of file lapacke.h.
  • LAPACK_zgghrd — defined as LAPACK_GLOBAL(zgghrd,ZGGHRD). Definition at line 13252 of file lapacke.h.
  • LAPACK_zgglse — defined as LAPACK_GLOBAL(zgglse,ZGGLSE). Definition at line 13320 of file lapacke.h.
  • LAPACK_zggqrf — defined as LAPACK_GLOBAL(zggqrf,ZGGQRF). Definition at line 13098 of file lapacke.h.
  • LAPACK_zggrqf — defined as LAPACK_GLOBAL(zggrqf,ZGGRQF). Definition at line 13102 of file lapacke.h.
  • LAPACK_zggsvd — defined as LAPACK_GLOBAL(zggsvd,ZGGSVD). Definition at line 13440 of file lapacke.h.
  • LAPACK_zggsvd3 — defined as LAPACK_GLOBAL(zggsvd3,ZGGSVD3). Definition at line 13751 of file lapacke.h.
  • LAPACK_zggsvp — defined as LAPACK_GLOBAL(zggsvp,ZGGSVP). Definition at line 13292 of file lapacke.h.
  • LAPACK_zggsvp3 — defined as LAPACK_GLOBAL(zggsvp3,ZGGSVP3). Definition at line 13296 of file lapacke.h.

Triangular town 🎀 — the gt cluster:

  • LAPACK_zgtcon — defined as LAPACK_GLOBAL(zgtcon,ZGTCON). Definition at line 12740 of file lapacke.h.
  • LAPACK_zgtrfs — defined as LAPACK_GLOBAL(zgtrfs,ZGTRFS). Definition at line 12800 of file lapacke.h.
  • LAPACK_zgtsv — defined as LAPACK_GLOBAL(zgtsv,ZGTSV). Definition at line 12958 of file lapacke.h.
  • LAPACK_zgtsvx — defined as LAPACK_GLOBAL(zgtsvx,ZGTSVX). Definition at line 12962 of file lapacke.h.
  • LAPACK_zgttrf — defined as LAPACK_GLOBAL(zgttrf,ZGTTRF). Definition at line 12620 of file lapacke.h.
  • LAPACK_zgttrs — defined as LAPACK_GLOBAL(zgttrs,ZGTTRS). Definition at line 12678 of file lapacke.h.

And now the herd of Hermitian band stuff 💅 — note that the _2stage ones get their own line numbers, they are not the same macro, don't get it twisted:

  • LAPACK_zhbev — defined as LAPACK_GLOBAL(zhbev,ZHBEV). Definition at line 13372 of file lapacke.h.
  • LAPACK_zhbev_2stage — defined as LAPACK_GLOBAL(zhbev_2stage,ZHBEV_2STAGE). Definition at line 13376 of file lapacke.h.
  • LAPACK_zhbevd — defined as LAPACK_GLOBAL(zhbevd,ZHBEVD). Definition at line 13380 of file lapacke.h.
  • LAPACK_zhbevd_2stage — defined as LAPACK_GLOBAL(zhbevd_2stage,ZHBEVD_2STAGE). Definition at line 13384 of file lapacke.h.
  • LAPACK_zhbevx — defined as LAPACK_GLOBAL(zhbevx,ZHBEVX). Definition at line 13388 of file lapacke.h.
  • LAPACK_zhbevx_2stage — defined as LAPACK_GLOBAL(zhbevx_2stage,ZHBEVX_2STAGE). Definition at line 13392 of file lapacke.h.
  • LAPACK_zhbgst — defined as LAPACK_GLOBAL(zhbgst,ZHBGST). Definition at line 13196 of file lapacke.h.
  • LAPACK_zhbgv — defined as LAPACK_GLOBAL(zhbgv,ZHBGV). Definition at line 13472 of file lapacke.h.
  • LAPACK_zhbgvd — defined as LAPACK_GLOBAL(zhbgvd,ZHBGVD). Definition at line 13476 of file lapacke.h.
  • LAPACK_zhbgvx — defined as LAPACK_GLOBAL(zhbgvx,ZHBGVX). Definition at line 13480 of file lapacke.h.
  • LAPACK_zhbtrd — defined as LAPACK_GLOBAL(zhbtrd,ZHBTRD). Definition at line 13154 of file lapacke.h.

Enter the he-verse 👑 — this is the big one, so many icons:

  • LAPACK_zhecon — defined as LAPACK_GLOBAL(zhecon,ZHECON). Definition at line 12762 of file lapacke.h.
  • LAPACK_zhecon_3 — defined as LAPACK_GLOBAL(zhecon_3,ZHECON_3). Definition at line 13801 of file lapacke.h.
  • LAPACK_zheequb — defined as LAPACK_GLOBAL(zheequb,ZHEEQUB). Definition at line 12927 of file lapacke.h.
  • LAPACK_zheev — defined as LAPACK_GLOBAL(zheev,ZHEEV). Definition at line 13328 of file lapacke.h.
  • LAPACK_zheev_2stage — defined as LAPACK_GLOBAL(zheev_2stage,ZHEEV_2STAGE). Definition at line 13332 of file lapacke.h.
  • LAPACK_zheevd — defined as LAPACK_GLOBAL(zheevd,ZHEEVD). Definition at line 13336 of file lapacke.h.
  • LAPACK_zheevd_2stage — defined as LAPACK_GLOBAL(zheevd_2stage,ZHEEVD_2STAGE). Definition at line 13340 of file lapacke.h.
  • LAPACK_zheevr — defined as LAPACK_GLOBAL(zheevr,ZHEEVR). Definition at line 13352 of file lapacke.h.
  • LAPACK_zheevr_2stage — defined as LAPACK_GLOBAL(zheevr_2stage,ZHEEVR_2STAGE). Definition at line 13356 of file lapacke.h.
  • LAPACK_zheevx — defined as LAPACK_GLOBAL(zheevx,ZHEEVX). Definition at line 13344 of file lapacke.h.
  • LAPACK_zheevx_2stage — defined as LAPACK_GLOBAL(zheevx_2stage,ZHEEVX_2STAGE). Definition at line 13348 of file lapacke.h.
  • LAPACK_zhegst — defined as LAPACK_GLOBAL(zhegst,ZHEGST). Definition at line 13188 of file lapacke.h.
  • LAPACK_zhegv — defined as LAPACK_GLOBAL(zhegv,ZHEGV). Definition at line 13444 of file lapacke.h.
  • LAPACK_zhegv_2stage — defined as LAPACK_GLOBAL(zhegv_2stage,ZHEGV_2STAGE). Definition at line 13448 of file lapacke.h.
  • LAPACK_zhegvd — defined as LAPACK_GLOBAL(zhegvd,ZHEGVD). Definition at line 13452 of file lapacke.h.
  • LAPACK_zhegvx — defined as LAPACK_GLOBAL(zhegvx,ZHEGVX). Definition at line 13456 of file lapacke.h.
  • LAPACK_zherfs — defined as LAPACK_GLOBAL(zherfs,ZHERFS). Definition at line 12830 of file lapacke.h.
  • LAPACK_zherfsx — defined as LAPACK_GLOBAL(zherfsx,ZHERFSX). Definition at line 12831 of file lapacke.h.
  • LAPACK_zhesv — defined as LAPACK_GLOBAL(zhesv,ZHESV). Definition at line 13014 of file lapacke.h.
  • LAPACK_zhesv_aa — defined as LAPACK_GLOBAL(zhesv_aa,ZHESV_AA). Definition at line 13758 of file lapacke.h.
  • LAPACK_zhesv_aa_2stage — defined as LAPACK_GLOBAL(zhesv_aa_2stage,ZHESV_AA_2STAGE). Definition at line 13829 of file lapacke.h. (Yeah, that one wraps onto two lines in the original — it's just a long name, she's fine.)
  • LAPACK_zhesv_rk — defined as LAPACK_GLOBAL(zhesv_rk,ZHESV_RK). Definition at line 13777 of file lapacke.h.
  • LAPACK_zhesvx — defined as LAPACK_GLOBAL(zhesvx,ZHESVX). Definition at line 13016 of file lapacke.h.
  • LAPACK_zhesvxx — defined as LAPACK_GLOBAL(zhesvxx,ZHESVXX). Definition at line 13017 of file lapacke.h.
  • LAPACK_zheswapr — defined as LAPACK_GLOBAL(zheswapr,ZHESWAPR). Definition at line 13694 of file lapacke.h.
  • LAPACK_zhetrd — defined as LAPACK_GLOBAL(zhetrd,ZHETRD). Definition at line 13134 of file lapacke.h.
  • LAPACK_zhetrf — defined as LAPACK_GLOBAL(zhetrf,ZHETRF). Definition at line 12659 of file lapacke.h.
  • LAPACK_zhetrf_aa — defined as LAPACK_GLOBAL(zhetrf_aa,ZHETRF_AA). Definition at line 13770 of file lapacke.h.
  • LAPACK_zhetrf_aa_2stage — defined as LAPACK_GLOBAL(zhetrf_aa_2stage,ZHETRF_AA_2STAGE). Definition at line 13841 of file lapacke.h. (Also a two-line situation in the source, bestie, it's just long 💀)
  • LAPACK_zhetrf_rk — defined as LAPACK_GLOBAL(zhetrf_rk,ZHETRF_RK). Definition at line 13783 of file lapacke.h.
  • LAPACK_zhetrf_rook — defined as LAPACK_GLOBAL(zhetrf_rook,ZHETRF_ROOK). Definition at line 12660 of file lapacke.h.
  • LAPACK_zhetri — defined as LAPACK_GLOBAL(zhetri,ZHETRI). Definition at line 12872 of file lapacke.h.
  • LAPACK_zhetri2 — defined as LAPACK_GLOBAL(zhetri2,ZHETRI2). Definition at line 13695 of file lapacke.h.
  • LAPACK_zhetri2x — defined as LAPACK_GLOBAL(zhetri2x,ZHETRI2X). Definition at line 13696 of file lapacke.h.
  • LAPACK_zhetri_3 — defined as LAPACK_GLOBAL(zhetri_3,ZHETRI_3). Definition at line 13795 of file lapacke.h.
  • LAPACK_zhetrs — defined as LAPACK_GLOBAL(zhetrs,ZHETRS). Definition at line 12709 of file lapacke.h.
  • LAPACK_zhetrs2 — defined as LAPACK_GLOBAL(zhetrs2,ZHETRS2). Definition at line 13697 of file lapacke.h.
  • LAPACK_zhetrs_3 — defined as LAPACK_GLOBAL(zhetrs_3,ZHETRS_3). Definition at line 13789 of file lapacke.h.
  • LAPACK_zhetrs_aa — defined as LAPACK_GLOBAL(zhetrs_aa,ZHETRS_AA). Definition at line 13764 of file lapacke.h.
  • LAPACK_zhetrs_aa_2stage — defined as LAPACK_GLOBAL(zhetrs_aa_2stage,ZHETRS_AA_2STAGE). Definition at line 13835 of file lapacke.h. (Yes, wrapped in the source too — long girl summer 🌈)
  • LAPACK_zhetrs_rook — defined as LAPACK_GLOBAL(zhetrs_rook,ZHETRS_ROOK). Definition at line 12710 of file lapacke.h.

  • LAPACK_zhfrk — defined as LAPACK_GLOBAL(zhfrk,ZHFRK). Definition at line 13507 of file lapacke.h.
  • LAPACK_zhgeqz — defined as LAPACK_GLOBAL(zhgeqz,ZHGEQZ). Definition at line 13268 of file lapacke.h.

Packed storage crew 🍓 — the hp squad, all lowercase‑h, capital‑P energy:

  • LAPACK_zhpcon — defined as LAPACK_GLOBAL(zhpcon,ZHPCON). Definition at line 12768 of file lapacke.h.
  • LAPACK_zhpev — defined as LAPACK_GLOBAL(zhpev,ZHPEV). Definition at line 13360 of file lapacke.h.
  • LAPACK_zhpevd — defined as LAPACK_GLOBAL(zhpevd,ZHPEVD). Definition at line 13364 of file lapacke.h.
  • LAPACK_zhpevx — defined as LAPACK_GLOBAL(zhpevx,ZHPEVX). Definition at line 13368 of file lapacke.h.
  • LAPACK_zhpgst — defined as LAPACK_GLOBAL(zhpgst,ZHPGST). Definition at line 13192 of file lapacke.h.
  • LAPACK_zhpgv — defined as LAPACK_GLOBAL(zhpgv,ZHPGV). Definition at line 13460 of file lapacke.h.
  • LAPACK_zhpgvd — defined as LAPACK_GLOBAL(zhpgvd,ZHPGVD). Definition at line 13464 of file lapacke.h.
  • LAPACK_zhpgvx — defined as LAPACK_GLOBAL(zhpgvx,ZHPGVX). Definition at line 13468 of file lapacke.h.
  • LAPACK_zhprfs — defined as LAPACK_GLOBAL(zhprfs,ZHPRFS). Definition at line 12838 of file lapacke.h.
  • LAPACK_zhpsv — defined as LAPACK_GLOBAL(zhpsv,ZHPSV). Definition at line 13028 of file lapacke.h.
  • LAPACK_zhpsvx — defined as LAPACK_GLOBAL(zhpsvx,ZHPSVX). Definition at line 13030 of file lapacke.h.
  • LAPACK_zhptrd — defined as LAPACK_GLOBAL(zhptrd,ZHPTRD). Definition at line 13146 of file lapacke.h.

Lowkey iconic that we got this far, and there's still more alphabet to get through 😭🫶 — next chunk incoming, don't touch that dial.

  • LAPACK_zhptrf — expands to LAPACK_GLOBAL(zhptrf,ZHPTRF), defined at line 12666 of lapacke.h.
  • LAPACK_zhptri — expands to LAPACK_GLOBAL(zhptri,ZHPTRI), defined at line 12878 of lapacke.h.
  • LAPACK_zhptrs — expands to LAPACK_GLOBAL(zhptrs,ZHPTRS), defined at line 12716 of lapacke.h.

okay bestie we're still deep in the zh* cluster and honestly? it's giving main character energy. ✨

  • LAPACK_zhsein — expands to LAPACK_GLOBAL(zhsein,ZHSEIN), defined at line 13228 of lapacke.h.
  • LAPACK_zhseqr — expands to LAPACK_GLOBAL(zhseqr,ZHSEQR), defined at line 13224 of lapacke.h.

and now we slide into the zlac* / zla* zone, which is lowkey a whole aesthetic 🦋 — every single one still just a LAPACK_GLOBAL alias, no cap:

  • LAPACK_zlacgv — expands to LAPACK_GLOBAL(zlacgv,ZLACGV), defined at line 13542 of lapacke.h.
  • LAPACK_zlacn2 — expands to LAPACK_GLOBAL(zlacn2,ZLACN2), defined at line 13554 of lapacke.h.
  • LAPACK_zlacp2 — expands to LAPACK_GLOBAL(zlacp2,ZLACP2), defined at line 13560 of lapacke.h.
  • LAPACK_zlacpy — expands to LAPACK_GLOBAL(zlacpy,ZLACPY), defined at line 13558 of lapacke.h.
  • LAPACK_zlacrm — expands to LAPACK_GLOBAL(zlacrm,ZLACRM), defined at line 13578 of lapacke.h.
  • LAPACK_zlag2c — expands to LAPACK_GLOBAL(zlag2c,ZLAG2C), defined at line 13620 of lapacke.h.
  • LAPACK_zlagge — expands to LAPACK_GLOBAL(zlagge,ZLAGGE), defined at line 13628 of lapacke.h.
  • LAPACK_zlaghe — expands to LAPACK_GLOBAL(zlaghe,ZLAGHE), defined at line 13644 of lapacke.h.
  • LAPACK_zlagsy — expands to LAPACK_GLOBAL(zlagsy,ZLAGSY), defined at line 13642 of lapacke.h.
  • LAPACK_zlange — expands to LAPACK_GLOBAL(zlange,ZLANGE), defined at line 13572 of lapacke.h.
  • LAPACK_zlanhe — expands to LAPACK_GLOBAL(zlanhe,ZLANHE), defined at line 13574 of lapacke.h.
  • LAPACK_zlansy — expands to LAPACK_GLOBAL(zlansy,ZLANSY), defined at line 13582 of lapacke.h.
  • LAPACK_zlantr — expands to LAPACK_GLOBAL(zlantr,ZLANTR), defined at line 13586 of lapacke.h.
  • LAPACK_zlapmr — expands to LAPACK_GLOBAL(zlapmr,ZLAPMR), defined at line 13648 of lapacke.h.
  • LAPACK_zlapmt — expands to LAPACK_GLOBAL(zlapmt,ZLAPMT), defined at line 13652 of lapacke.h.
  • LAPACK_zlarcm — expands to LAPACK_GLOBAL(zlarcm,ZLARCM), defined at line 13576 of lapacke.h.
  • LAPACK_zlarfb — expands to LAPACK_GLOBAL(zlarfb,ZLARFB), defined at line 13596 of lapacke.h.
  • LAPACK_zlarfg — expands to LAPACK_GLOBAL(zlarfg,ZLARFG), defined at line 13600 of lapacke.h.
  • LAPACK_zlarft — expands to LAPACK_GLOBAL(zlarft,ZLARFT), defined at line 13608 of lapacke.h.
  • LAPACK_zlarfx — expands to LAPACK_GLOBAL(zlarfx,ZLARFX), defined at line 13612 of lapacke.h.
  • LAPACK_zlarnv — expands to LAPACK_GLOBAL(zlarnv,ZLARNV), defined at line 13546 of lapacke.h.
  • LAPACK_zlascl — expands to LAPACK_GLOBAL(zlascl,ZLASCL), defined at line 13632 of lapacke.h.
  • LAPACK_zlaset — expands to LAPACK_GLOBAL(zlaset,ZLASET), defined at line 13636 of lapacke.h.
  • LAPACK_zlassq — expands to LAPACK_GLOBAL(zlassq,ZLASSQ), defined at line 13604 of lapacke.h.
  • LAPACK_zlaswp — expands to LAPACK_GLOBAL(zlaswp,ZLASWP), defined at line 13568 of lapacke.h.
  • LAPACK_zlatms — expands to LAPACK_GLOBAL(zlatms,ZLATMS), defined at line 13616 of lapacke.h.
  • LAPACK_zlauum — expands to LAPACK_GLOBAL(zlauum,ZLAUUM), defined at line 13624 of lapacke.h.

bestie we are now entering the packed-band zone and the zp* girls are all here 💅 perfectly alphabetical, perfectly defined, zero drama:

  • LAPACK_zpbcon — expands to LAPACK_GLOBAL(zpbcon,ZPBCON), defined at line 12752 of lapacke.h.
  • LAPACK_zpbequ — expands to LAPACK_GLOBAL(zpbequ,ZPBEQU), defined at line 12922 of lapacke.h.
  • LAPACK_zpbrfs — expands to LAPACK_GLOBAL(zpbrfs,ZPBRFS), defined at line 12816 of lapacke.h.
  • LAPACK_zpbstf — expands to LAPACK_GLOBAL(zpbstf,ZPBSTF), defined at line 13200 of lapacke.h.
  • LAPACK_zpbsv — expands to LAPACK_GLOBAL(zpbsv,ZPBSV), defined at line 12988 of lapacke.h.
  • LAPACK_zpbsvx — expands to LAPACK_GLOBAL(zpbsvx,ZPBSVX), defined at line 12992 of lapacke.h.
  • LAPACK_zpbtrf — expands to LAPACK_GLOBAL(zpbtrf,ZPBTRF), defined at line 12644 of lapacke.h.
  • LAPACK_zpbtrs — expands to LAPACK_GLOBAL(zpbtrs,ZPBTRS), defined at line 12694 of lapacke.h.
  • LAPACK_zpftrf — expands to LAPACK_GLOBAL(zpftrf,ZPFTRF), defined at line 12635 of lapacke.h.
  • LAPACK_zpftri — expands to LAPACK_GLOBAL(zpftri,ZPFTRI), defined at line 12861 of lapacke.h.
  • LAPACK_zpftrs — expands to LAPACK_GLOBAL(zpftrs,ZPFTRS), defined at line 12685 of lapacke.h.

okay the zpo* crew — positive-definite vibe check, everyone passed 🌸

  • LAPACK_zpocon — expands to LAPACK_GLOBAL(zpocon,ZPOCON), defined at line 12744 of lapacke.h.
  • LAPACK_zpoequ — expands to LAPACK_GLOBAL(zpoequ,ZPOEQU), defined at line 12910 of lapacke.h.
  • LAPACK_zpoequb — expands to LAPACK_GLOBAL(zpoequb,ZPOEQUB), defined at line 12913 of lapacke.h.
  • LAPACK_zporfs — expands to LAPACK_GLOBAL(zporfs,ZPORFS), defined at line 12804 of lapacke.h.
  • LAPACK_zporfsx — expands to LAPACK_GLOBAL(zporfsx,ZPORFSX), defined at line 12807 of lapacke.h.
  • LAPACK_zposv — expands to LAPACK_GLOBAL(zposv,ZPOSV), defined at line 12966 of lapacke.h.
  • LAPACK_zposvx — expands to LAPACK_GLOBAL(zposvx,ZPOSVX), defined at line 12972 of lapacke.h.
  • LAPACK_zposvxx — expands to LAPACK_GLOBAL(zposvxx,ZPOSVXX), defined at line 12975 of lapacke.h.
  • LAPACK_zpotrf — expands to LAPACK_GLOBAL(zpotrf,ZPOTRF), defined at line 12624 of lapacke.h.
  • LAPACK_zpotrf2 — expands to LAPACK_GLOBAL(zpotrf2,ZPOTRF2), defined at line 12628 of lapacke.h.
  • LAPACK_zpotri — expands to LAPACK_GLOBAL(zpotri,ZPOTRI), defined at line 12858 of lapacke.h.
  • LAPACK_zpotrs — expands to LAPACK_GLOBAL(zpotrs,ZPOTRS), defined at line 12682 of lapacke.h.
  • LAPACK_zppcon — expands to LAPACK_GLOBAL(zppcon,ZPPCON), defined at line 12748 of lapacke.h.
  • LAPACK_zppequ — expands to LAPACK_GLOBAL(zppequ,ZPPEQU), defined at line 12918 of lapacke.h.
  • LAPACK_zpprfs — expands to LAPACK_GLOBAL(zpprfs,ZPPRFS), defined at line 12812 of lapacke.h.
  • LAPACK_zppsv — expands to LAPACK_GLOBAL(zppsv,ZPPSV), defined at line 12980 of lapacke.h.
  • LAPACK_zppsvx — expands to LAPACK_GLOBAL(zppsvx,ZPPSVX), defined at line 12984 of lapacke.h.
  • LAPACK_zpptrf — expands to LAPACK_GLOBAL(zpptrf,ZPPTRF), defined at line 12640 of lapacke.h.
  • LAPACK_zpptri — expands to LAPACK_GLOBAL(zpptri,ZPPTRI), defined at line 12866 of lapacke.h.
  • LAPACK_zpptrs — expands to LAPACK_GLOBAL(zpptrs,ZPPTRS), defined at line 12690 of lapacke.h.
  • LAPACK_zpstrf — expands to LAPACK_GLOBAL(zpstrf,ZPSTRF), defined at line 12631 of lapacke.h.
  • LAPACK_zptcon — expands to LAPACK_GLOBAL(zptcon,ZPTCON), defined at line 12756 of lapacke.h.
  • LAPACK_zpteqr — expands to LAPACK_GLOBAL(zpteqr,ZPTEQR), defined at line 13176 of lapacke.h.
  • LAPACK_zptrfs — expands to LAPACK_GLOBAL(zptrfs,ZPTRFS), defined at line 12820 of lapacke.h.
  • LAPACK_zptsv — expands to LAPACK_GLOBAL(zptsv,ZPTSV), defined at line 12996 of lapacke.h.
  • LAPACK_zptsvx — expands to LAPACK_GLOBAL(zptsvx,ZPTSVX), defined at line 13000 of lapacke.h.
  • LAPACK_zpttrf — expands to LAPACK_GLOBAL(zpttrf,ZPTTRF), defined at line 12648 of lapacke.h.
  • LAPACK_zpttrs — expands to LAPACK_GLOBAL(zpttrs,ZPTTRS), defined at line 12698 of lapacke.h.

and the zs* girlies are pulling up now 🎀 same pattern, same LAPACK_GLOBAL wrapper, same little line number at the end. iconic behaviour, tbh:

  • LAPACK_zspcon — expands to LAPACK_GLOBAL(zspcon,ZSPCON), defined at line 12766 of lapacke.h.
  • LAPACK_zsprfs — expands to LAPACK_GLOBAL(zsprfs,ZSPRFS), defined at line 12836 of lapacke.h.
  • LAPACK_zspsv — expands to LAPACK_GLOBAL(zspsv,ZSPSV), defined at line 13022 of lapacke.h.
  • LAPACK_zspsvx — expands to LAPACK_GLOBAL(zspsvx,ZSPSVX), defined at line 13026 of lapacke.h.
  • LAPACK_zsptrf — expands to LAPACK_GLOBAL(zsptrf,ZSPTRF), defined at line 12664 of lapacke.h.
  • LAPACK_zsptri — expands to LAPACK_GLOBAL(zsptri,ZSPTRI), defined at line 12876 of lapacke.h.
  • LAPACK_zsptrs — expands to LAPACK_GLOBAL(zsptrs,ZSPTRS), defined at line 12714 of lapacke.h.

eigenvalue era ✨ the zst* block, all accounted for:

  • LAPACK_zstedc — expands to LAPACK_GLOBAL(zstedc,ZSTEDC), defined at line 13168 of lapacke.h.
  • LAPACK_zstegr — expands to LAPACK_GLOBAL(zstegr,ZSTEGR), defined at line 13172 of lapacke.h.
  • LAPACK_zstein — expands to LAPACK_GLOBAL(zstein,ZSTEIN), defined at line 13182 of lapacke.h.
  • LAPACK_zstemr — expands to LAPACK_GLOBAL(zstemr,ZSTEMR), defined at line 13164 of lapacke.h.
  • LAPACK_zsteqr — expands to LAPACK_GLOBAL(zsteqr,ZSTEQR), defined at line 13160 of lapacke.h.

okay now the symmetric section and bestie, it is long — stay with me, we're doing all of them 💜

  • LAPACK_zsycon — expands to LAPACK_GLOBAL(zsycon,ZSYCON), defined at line 12760 of lapacke.h.
  • LAPACK_zsycon_3 — expands to LAPACK_GLOBAL(zsycon_3,ZSYCON_3), defined at line 13799 of lapacke.h.
  • LAPACK_zsyconv — expands to LAPACK_GLOBAL(zsyconv,ZSYCONV), defined at line 13698 of lapacke.h.
  • LAPACK_zsyequb — expands to LAPACK_GLOBAL(zsyequb,ZSYEQUB), defined at line 12925 of lapacke.h.
  • LAPACK_zsyr — expands to LAPACK_GLOBAL(zsyr,ZSYR), defined at line 13745 of lapacke.h.
  • LAPACK_zsyrfs — expands to LAPACK_GLOBAL(zsyrfs,ZSYRFS), defined at line 12824 of lapacke.h.
  • LAPACK_zsyrfsx — expands to LAPACK_GLOBAL(zsyrfsx,ZSYRFSX), defined at line 12827 of lapacke.h.
  • LAPACK_zsysv — expands to LAPACK_GLOBAL(zsysv,ZSYSV), defined at line 13004 of lapacke.h.
  • LAPACK_zsysv_aa — expands to LAPACK_GLOBAL(zsysv_aa,ZSYSV_AA), defined at line 13756 of lapacke.h.
  • LAPACK_zsysv_aa_2stage — expands to LAPACK_GLOBAL(zsysv_aa_2stage,ZSYSV_AA_2STAGE), defined at line 13827 of lapacke.h.
  • LAPACK_zsysv_rk — expands to LAPACK_GLOBAL(zsysv_rk,ZSYSV_RK), defined at line 13775 of lapacke.h.
  • LAPACK_zsysv_rook — expands to LAPACK_GLOBAL(zsysv_rook,ZSYSV_ROOK), defined at line 13743 of lapacke.h.
  • LAPACK_zsysvx — expands to LAPACK_GLOBAL(zsysvx,ZSYSVX), defined at line 13008 of lapacke.h.
  • LAPACK_zsysvxx — expands to LAPACK_GLOBAL(zsysvxx,ZSYSVXX), defined at line 13011 of lapacke.h.
  • LAPACK_zsyswapr — expands to LAPACK_GLOBAL(zsyswapr,ZSYSWAPR), defined at line 13699 of lapacke.h.
  • LAPACK_zsytrf — expands to LAPACK_GLOBAL(zsytrf,ZSYTRF), defined at line 12655 of lapacke.h.
  • LAPACK_zsytrf_aa — expands to LAPACK_GLOBAL(zsytrf_aa,ZSYTRF_AA), defined at line 13768 of lapacke.h.
  • LAPACK_zsytrf_aa_2stage — expands to LAPACK_GLOBAL(zsytrf_aa_2stage,ZSYTRF_AA_2STAGE), defined at line 13839 of lapacke.h.
  • LAPACK_zsytrf_rk — expands to LAPACK_GLOBAL(zsytrf_rk,ZSYTRF_RK), defined at line 13781 of lapacke.h.
  • LAPACK_zsytrf_rook — expands to LAPACK_GLOBAL(zsytrf_rook,ZSYTRF_ROOK), defined at line 12656 of lapacke.h.
  • LAPACK_zsytri — expands to LAPACK_GLOBAL(zsytri,ZSYTRI), defined at line 12870 of lapacke.h.
  • LAPACK_zsytri2 — expands to LAPACK_GLOBAL(zsytri2,ZSYTRI2), defined at line 13700 of lapacke.h.
  • LAPACK_zsytri2x — expands to LAPACK_GLOBAL(zsytri2x,ZSYTRI2X), defined at line 13701 of lapacke.h.
  • LAPACK_zsytri_3 — expands to LAPACK_GLOBAL(zsytri_3,ZSYTRI_3), defined at line 13793 of lapacke.h.
  • LAPACK_zsytrs — expands to LAPACK_GLOBAL(zsytrs,ZSYTRS), defined at line 12705 of lapacke.h.
  • LAPACK_zsytrs2 — expands to LAPACK_GLOBAL(zsytrs2,ZSYTRS2), defined at line 13702 of lapacke.h.
ngl bestie, none of these change what the macro actually is — every single one is still just a #define aliasing the name to LAPACK_GLOBAL(...) with the exact output written character for character. The line numbers are the receipts, periodt. 🫶
  • #define LAPACK_zsytrs_3 LAPACK_GLOBAL(zsytrs_3,ZSYTRS_3) — this is the wiring that points the LAPACKE name at the Fortran ZSYTRS_3. Definition at line 13787 of file lapacke.h.
  • #define LAPACK_zsytrs_aa LAPACK_GLOBAL(zsytrs_aa,ZSYTRS_AA) — same deal, _aa flavour. Definition at line 13762 of file lapacke.h.
  • #define LAPACK_zsytrs_aa_2stage LAPACK_GLOBAL(zsytrs_aa_2stage,ZSYTRS_AA_2STAGE) — the 2stage one, all caps on the right side like it's yelling its own name. Definition at line 13833 of file lapacke.h.
  • #define LAPACK_zsytrs_rook LAPACK_GLOBAL(zsytrs_rook,ZSYTRS_ROOK) — rook variant, still just a macro doing macro things. Definition at line 12706 of file lapacke.h.
  • #define LAPACK_ztbcon LAPACK_GLOBAL(ztbcon,ZTBCON) — lowercase on the left, uppercase on the right, the classic glow-up. Definition at line 12780 of file lapacke.h.
  • #define LAPACK_ztbrfs LAPACK_GLOBAL(ztbrfs,ZTBRFS) — 💅. Definition at line 12850 of file lapacke.h.
  • #define LAPACK_ztbtrs LAPACK_GLOBAL(ztbtrs,ZTBTRS) — bestie this is literally just the name twice in different fonts. Definition at line 12728 of file lapacke.h.
  • #define LAPACK_ztfsm LAPACK_GLOBAL(ztfsm,ZTFSM) — four letters, zero notes. Definition at line 13511 of file lapacke.h.
  • #define LAPACK_ztftri LAPACK_GLOBAL(ztftri,ZTFTRI) — ✨ sparkle ✨. Definition at line 12885 of file lapacke.h.
  • #define LAPACK_ztfttp LAPACK_GLOBAL(ztfttp,ZTFTTP) — a whole lot of t's and f's, love that for us. Definition at line 13515 of file lapacke.h.
  • #define LAPACK_ztfttr LAPACK_GLOBAL(ztfttr,ZTFTTR) — one letter away from its sibling above, iconic behaviour honestly. Definition at line 13519 of file lapacke.h.
  • #define LAPACK_ztgevc LAPACK_GLOBAL(ztgevc,ZTGEVC) — definition at line 13272 of file lapacke.h.
  • #define LAPACK_ztgexc LAPACK_GLOBAL(ztgexc,ZTGEXC) — definition at line 13276 of file lapacke.h.
  • #define LAPACK_ztgsen LAPACK_GLOBAL(ztgsen,ZTGSEN) — definition at line 13280 of file lapacke.h.
  • #define LAPACK_ztgsja LAPACK_GLOBAL(ztgsja,ZTGSJA) — definition at line 13300 of file lapacke.h.
  • #define LAPACK_ztgsna LAPACK_GLOBAL(ztgsna,ZTGSNA) — definition at line 13288 of file lapacke.h.
  • #define LAPACK_ztgsyl LAPACK_GLOBAL(ztgsyl,ZTGSYL) — definition at line 13284 of file lapacke.h.
okay the ztg* clique is fully showing up together, no notes 🫶
  • #define LAPACK_ztpcon LAPACK_GLOBAL(ztpcon,ZTPCON) — definition at line 12776 of file lapacke.h.
  • #define LAPACK_ztpmqrt LAPACK_GLOBAL(ztpmqrt,ZTPMQRT) — definition at line 13726 of file lapacke.h.
  • #define LAPACK_ztpqrt LAPACK_GLOBAL(ztpqrt,ZTPQRT) — the one where you drop the m. Definition at line 13730 of file lapacke.h.
  • #define LAPACK_ztpqrt2 LAPACK_GLOBAL(ztpqrt2,ZTPQRT2) — the same but with a lil 2 on the end. Definition at line 13734 of file lapacke.h.
  • #define LAPACK_ztprfb LAPACK_GLOBAL(ztprfb,ZTPRFB) — definition at line 13738 of file lapacke.h.
  • #define LAPACK_ztprfs LAPACK_GLOBAL(ztprfs,ZTPRFS) — b versus s, the eternal struggle. Definition at line 12846 of file lapacke.h.
  • #define LAPACK_ztptri LAPACK_GLOBAL(ztptri,ZTPTRI) — definition at line 12890 of file lapacke.h.
  • #define LAPACK_ztptrs LAPACK_GLOBAL(ztptrs,ZTPTRS) — definition at line 12724 of file lapacke.h.
  • #define LAPACK_ztpttf LAPACK_GLOBAL(ztpttf,ZTPTTF) — definition at line 13523 of file lapacke.h.
  • #define LAPACK_ztpttr LAPACK_GLOBAL(ztpttr,ZTPTTR) — and the last two letters floof over. Definition at line 13527 of file lapacke.h.
  • #define LAPACK_ztrcon LAPACK_GLOBAL(ztrcon,ZTRCON) — definition at line 12772 of file lapacke.h.
  • #define LAPACK_ztrevc LAPACK_GLOBAL(ztrevc,ZTREVC) — definition at line 13232 of file lapacke.h.
  • #define LAPACK_ztrexc LAPACK_GLOBAL(ztrexc,ZTREXC) — definition at line 13240 of file lapacke.h.
  • #define LAPACK_ztrrfs LAPACK_GLOBAL(ztrrfs,ZTRRFS) — definition at line 12842 of file lapacke.h.
  • #define LAPACK_ztrsen LAPACK_GLOBAL(ztrsen,ZTRSEN) — definition at line 13244 of file lapacke.h.
  • #define LAPACK_ztrsna LAPACK_GLOBAL(ztrsna,ZTRSNA) — definition at line 13236 of file lapacke.h.
  • #define LAPACK_ztrsyl LAPACK_GLOBAL(ztrsyl,ZTRSYL) — definition at line 13248 of file lapacke.h.
  • #define LAPACK_ztrtri LAPACK_GLOBAL(ztrtri,ZTRTRI) — definition at line 12882 of file lapacke.h.
  • #define LAPACK_ztrtrs LAPACK_GLOBAL(ztrtrs,ZTRTRS) — definition at line 12720 of file lapacke.h.
  • #define LAPACK_ztrttf LAPACK_GLOBAL(ztrttf,ZTRTTF) — definition at line 13531 of file lapacke.h.
  • #define LAPACK_ztrttp LAPACK_GLOBAL(ztrttp,ZTRTTP) — definition at line 13535 of file lapacke.h.
  • #define LAPACK_ztzrzf LAPACK_GLOBAL(ztzrzf,ZTZRZF) — the whole z-alphabet decided to show up in one word. Definition at line 13090 of file lapacke.h.

  • #define LAPACK_zunbdb LAPACK_GLOBAL(zunbdb,ZUNBDB) — definition at line 13703 of file lapacke.h.
  • #define LAPACK_zuncsd LAPACK_GLOBAL(zuncsd,ZUNCSD) — definition at line 13704 of file lapacke.h.
  • #define LAPACK_zuncsd2by1 LAPACK_GLOBAL(zuncsd2by1,ZUNCSD2BY1) — "2by1" said out loud, precious. Definition at line 13705 of file lapacke.h.
  • #define LAPACK_zungbr LAPACK_GLOBAL(zungbr,ZUNGBR) — definition at line 13116 of file lapacke.h.
  • #define LAPACK_zunghr LAPACK_GLOBAL(zunghr,ZUNGHR) — definition at line 13210 of file lapacke.h.
  • #define LAPACK_zunglq LAPACK_GLOBAL(zunglq,ZUNGLQ) — definition at line 13060 of file lapacke.h.
  • #define LAPACK_zungql LAPACK_GLOBAL(zungql,ZUNGQL) — same letters, swapped, and both exist. As they should. Definition at line 13070 of file lapacke.h.
  • #define LAPACK_zungqr LAPACK_GLOBAL(zungqr,ZUNGQR) — definition at line 13048 of file lapacke.h.
  • #define LAPACK_zungrq LAPACK_GLOBAL(zungrq,ZUNGRQ) — definition at line 13082 of file lapacke.h.
  • #define LAPACK_zungtr LAPACK_GLOBAL(zungtr,ZUNGTR) — definition at line 13136 of file lapacke.h.
  • #define LAPACK_zunmbr LAPACK_GLOBAL(zunmbr,ZUNMBR) — note the m where the g was a second ago, bestie, don't mix them up. Definition at line 13118 of file lapacke.h.
  • #define LAPACK_zunmhr LAPACK_GLOBAL(zunmhr,ZUNMHR) — definition at line 13212 of file lapacke.h.
  • #define LAPACK_zunmlq LAPACK_GLOBAL(zunmlq,ZUNMLQ) — definition at line 13062 of file lapacke.h.
  • #define LAPACK_zunmql LAPACK_GLOBAL(zunmql,ZUNMQL) — definition at line 13074 of file lapacke.h.
  • #define LAPACK_zunmqr LAPACK_GLOBAL(zunmqr,ZUNMQR) — definition at line 13050 of file lapacke.h.
  • #define LAPACK_zunmrq LAPACK_GLOBAL(zunmrq,ZUNMRQ) — definition at line 13086 of file lapacke.h.
  • #define LAPACK_zunmrz LAPACK_GLOBAL(zunmrz,ZUNMRZ) — definition at line 13094 of file lapacke.h.
  • #define LAPACK_zunmtr LAPACK_GLOBAL(zunmtr,ZUNMTR) — definition at line 13138 of file lapacke.h.
  • #define LAPACK_zupgtr LAPACK_GLOBAL(zupgtr,ZUPGTR) — definition at line 13148 of file lapacke.h.
  • #define LAPACK_zupmtr LAPACK_GLOBAL(zupmtr,ZUPMTR) — and that closes out the zu* squad. Definition at line 13150 of file lapacke.h.

  • #define LAPACKE_free(p) free( p ) — okay this one's cute, it's literally just free. Pass your pointer as p and she's done. Definition at line 113 of file lapacke.h.
  • #define LAPACKE_malloc(size) malloc( size ) — same energy: it's just malloc, wearing a little LAPACKE jacket. Ask for size bytes. Definition at line 110 of file lapacke.h.
✨ these two are the whole reason your buffers don't leak, so like… respect them ✨

💖 Typedef Documentation 💖

Bestie, these are function-pointer typedefs — little named shapes for "a function that takes these pointers and hands back a lapack_logical". All of them return lapack_logical. That's the whole vibe. 👑

  • typedef lapack_logical(* LAPACK_C_SELECT1) (const lapack_complex_float *) — one single const lapack_complex_float * and nothing else. Definition at line 136 of file lapacke.h.
  • typedef lapack_logical(* LAPACK_C_SELECT2) (const lapack_complex_float *, const lapack_complex_float *) — now it takes two of them. Definition at line 138 of file lapacke.h.
  • typedef lapack_logical(* LAPACK_D_SELECT2) (const double *, const double *) — the double twin of the one above. Definition at line 132 of file lapacke.h.
  • typedef lapack_logical(* LAPACK_D_SELECT3) (const double *, const double *, const double *) — three const double *, go off. Definition at line 134 of file lapacke.h.
  • typedef lapack_logical(* LAPACK_S_SELECT2) (const float *, const float *) — it's giving float hours. Definition at line 129 of file lapacke.h.
  • typedef lapack_logical(* LAPACK_S_SELECT3) (const float *, const float *, const float *) — three const float *. Definition at line 131 of file lapacke.h.
  • typedef lapack_logical(* LAPACK_Z_SELECT1) (const lapack_complex_double *) — the double-precision complex singleton of the group. Definition at line 139 of file lapacke.h.
  • typedef lapack_logical(* LAPACK_Z_SELECT2) (const lapack_complex_double *, const lapack_complex_double *) — and the pair. Definition at line 141 of file lapacke.h.
👀 yes the SELECT1/SELECT2/SELECT3 numbering doesn't line up across the C/S/D/Z families — that's just how the list reads, so don't come for me, I'm only the messenger 🫶

LAPACK_cbbcsd

void LAPACK_cbbcsd (char * jobu1, char * jobu2, char * jobv1t, char * jobv2t, char * trans,
    lapack_int * m, lapack_int * p, lapack_int * q, float * theta, float * phi,
    lapack_complex_float * u1, lapack_int * ldu1, lapack_complex_float * u2, lapack_int * ldu2,
    lapack_complex_float * v1t, lapack_int * ldv1t, lapack_complex_float * v2t, lapack_int * ldv2t,
    float * b11d, float * b11e, float * b12d, float * b12e, float * b21d, float * b21e,
    float * b22d, float * b22e, float * rwork, lapack_int * lrwork, lapack_int * info);

okay so this is the single-precision complex bidiagonal SVD ✨ every single arg is a pointer, even the char * job flags, because that's just how LAPACK rolls 💅 theta, phi, b11d…b22e and rwork are your real-valued float stuff, u1/u2/v1t/v2t are the complex matrices, and info tells you how it went 🫶


LAPACK_cbdsqr

void LAPACK_cbdsqr (char * uplo, lapack_int * n, lapack_int * ncvt, lapack_int * nru,
    lapack_int * ncc, float * d, float * e, lapack_complex_float * vt, lapack_int * ldvt,
    lapack_complex_float * u, lapack_int * ldu, lapack_complex_float * c, lapack_int * ldc,
    float * work, lapack_int * info);

bidiagonal SVD, the OG version — d and e are real floats (the diagonal + off-diagonal, bestie 🌸), while vt, u and c are complex. uplo and all the leading dims are pointers, and work is a plain float array. info at the end, as always 🙈


LAPACK_cgbbrd

void LAPACK_cgbbrd (char * vect, lapack_int * m, lapack_int * n, lapack_int * ncc,
    lapack_int * kl, lapack_int * ku, lapack_complex_float * ab, lapack_int * ldab,
    float * d, float * e, lapack_complex_float * q, lapack_int * ldq,
    lapack_complex_float * pt, lapack_int * ldpt, lapack_complex_float * c, lapack_int * ldc,
    lapack_complex_float * work, float * rwork, lapack_int * info);

general band → bidiagonal reduction, and it's giving main character energy 🦋 you've got ab on ldab, d/e as real floats, the q and pt matrices with their own leading dims, plus c on ldc, a complex work, a float rwork, and info keeping it real 💜


LAPACK_cgbcon

void LAPACK_cgbcon (char * norm, lapack_int * n, lapack_int * kl, lapack_int * ku,
    const lapack_complex_float * ab, lapack_int * ldab, const lapack_int * ipiv,
    float * anorm, float * rcond, lapack_complex_float * work, float * rwork,
    lapack_int * info);

band matrix condition number estimator, no cap 💅 notice ab and ipiv are const (promise not to touch 🙏) but anorm, rcond, work, rwork and info are all writable, because they're the outputs, obviously ✨


LAPACK_cgbequ

void LAPACK_cgbequ (lapack_int * m, lapack_int * n, lapack_int * kl, lapack_int * ku,
    const lapack_complex_float * ab, lapack_int * ldab, float * r, float * c,
    float * rowcnd, float * colcnd, float * amax, lapack_int * info);

equilibration for a complex band matrix — rows get r, columns get c, and you find out how badly scaled everything is via rowcnd, colcnd and amax 🎀 ab is const, the rest is yours to fill, info included 🫶


LAPACK_cgbequb

void LAPACK_cgbequb (lapack_int * m, lapack_int * n, lapack_int * kl, lapack_int * ku,
    const lapack_complex_float * ab, lapack_int * ldab, float * r, float * c,
    float * rowcnd, float * colcnd, float * amax, lapack_int * info);

the b version of cgbequ 🌈 same arg list, same vibe — m, n, kl, ku, ab/ldab (const, as it should be 💅), then r, c, rowcnd, colcnd, amax and info 🍓


LAPACK_cgbrfs

void LAPACK_cgbrfs (char * trans, lapack_int * n, lapack_int * kl, lapack_int * ku,
    lapack_int * nrhs, const lapack_complex_float * ab, lapack_int * ldab,
    const lapack_complex_float * afb, lapack_int * ldafb, const lapack_int * ipiv,
    const lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
    lapack_int * ldx, float * ferr, float * berr, lapack_complex_float * work,
    float * rwork, lapack_int * info);

refine a band solve, bestie 🔥 ab, afb, ipiv and b are all const — you're just reading them — while x gets updated on ldx and the error bounds land in ferr and berr 😭 trans decides the direction, nrhs is your column count, and info reports back 👑


LAPACK_cgbrfsx

void LAPACK_cgbrfsx (char * trans, char * equed, lapack_int * n, lapack_int * kl,
    lapack_int * ku, lapack_int * nrhs, const lapack_complex_float * ab, lapack_int * ldab,
    const lapack_complex_float * afb, lapack_int * ldafb, const lapack_int * ipiv,
    const float * r, const float * c, const lapack_complex_float * b, lapack_int * ldb,
    lapack_complex_float * x, lapack_int * ldx, float * rcond, float * berr,
    lapack_int * n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
    lapack_int * nparams, float * params, lapack_complex_float * work, float * rwork,
    lapack_int * info);

the extra version, and it's lowkey a lot 🙈 equed is non-const (it gets set), r and c are const floats, and you get the whole error-bound situation: berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params ✨ plus rcond, work, rwork and info. The way this signature ate and left no crumbs 💅


LAPACK_cgbsv

void LAPACK_cgbsv (lapack_int * n, lapack_int * kl, lapack_int * ku, lapack_int * nrhs,
    lapack_complex_float * ab, lapack_int * ldab, lapack_int * ipiv,
    lapack_complex_float * b, lapack_int * ldb, lapack_int * info);

straight-up band solve 🦋 no const anywhere because everything's fair game — ab on ldab, ipiv for the pivots, b on ldb gets overwritten by the answer, and info does its thing 🌸


LAPACK_cgbsvx

void LAPACK_cgbsvx (char * fact, char * trans, lapack_int * n, lapack_int * kl,
    lapack_int * ku, lapack_int * nrhs, lapack_complex_float * ab, lapack_int * ldab,
    lapack_complex_float * afb, lapack_int * ldafb, lapack_int * ipiv, char * equed,
    float * r, float * c, lapack_complex_float * b, lapack_int * ldb,
    lapack_complex_float * x, lapack_int * ldx, float * rcond, float * ferr, float * berr,
    lapack_complex_float * work, float * rwork, lapack_int * info);

band solve plus the whole diagnostics package 💜 fact says whether you're handing it a factorization, equed comes back set, r and c are the scaling floats, x on ldx is the solution, then rcond, ferr, berr, work, rwork, info. Not a single arg missing, we love consistency 🎀


LAPACK_cgbsvxx

void LAPACK_cgbsvxx (char * fact, char * trans, lapack_int * n, lapack_int * kl,
    lapack_int * ku, lapack_int * nrhs, lapack_complex_float * ab, lapack_int * ldab,
    lapack_complex_float * afb, lapack_int * ldafb, lapack_int * ipiv, char * equed,
    float * r, float * c, lapack_complex_float * b, lapack_int * ldb,
    lapack_complex_float * x, lapack_int * ldx, float * rcond, float * rpvgrw,
    float * berr, lapack_int * n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
    lapack_int * nparams, float * params, lapack_complex_float * work, float * rwork,
    lapack_int * info);

cgbsvx but make it xx 🌈 note the new besties: rpvgrw (right there next to rcond), and the full error-bound squad — n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. Everything else is exactly as you'd expect: fact, trans, equed, r, c, x/ldx, work, rwork, info 💅


LAPACK_cgbtrf

void LAPACK_cgbtrf (lapack_int * m, lapack_int * n, lapack_int * kl, lapack_int * ku,
    lapack_complex_float * ab, lapack_int * ldab, lapack_int * ipiv, lapack_int * info);

band LU factorization, periodt 🔥 ab lives on ldab, ipiv gets the pivot indices, m/n/kl/ku describe the band, and info tells you if anything went sideways 💀


LAPACK_cgbtrs

void LAPACK_cgbtrs (char * trans, lapack_int * n, lapack_int * kl, lapack_int * ku,
    lapack_int * nrhs, const lapack_complex_float * ab, lapack_int * ldab,
    const lapack_int * ipiv, lapack_complex_float * b, lapack_int * ldb,
    lapack_int * info);

the solve step after cgbtrf ✨ ab and ipiv are const (already factored, not touching 🙏) and b on ldb is where your answers land. trans, nrhs, info — you know the drill by now, bestie 🫶


LAPACK_cgebak

void LAPACK_cgebak (char * job, char * side, lapack_int * n, lapack_int * ilo,
    lapack_int * ihi, const float * scale, lapack_int * m, lapack_complex_float * v,
    lapack_int * ldv, lapack_int * info);

balances eigenvectors back, and yes scale is a const float array while v on ldv is the complex matrix getting rewritten 🌸 job, side, ilo, ihi, m, info round it out 🎀


LAPACK_cgebal

void LAPACK_cgebal (char * job, lapack_int * n, lapack_complex_float * a, lapack_int * lda,
    lapack_int * ilo, lapack_int * ihi, float * scale, lapack_int * info);

balances a general complex matrix 🦋 a on lda, the balancing window comes out in ilo and ihi, the scaling factors in scale (floats!), and info reports. job picks how much balancing you want 💅


LAPACK_cgebrd

void LAPACK_cgebrd (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda,
    float * d, float * e, lapack_complex_float * tauq, lapack_complex_float * taup,
    lapack_complex_float * work, lapack_int * lwork, lapack_int * info);

general → bidiagonal, and the way it splits real from complex is honestly iconic 👑 d and e are plain floats, tauq and taup are complex, work is complex with lwork telling it how big, and info is... info 😭


LAPACK_cgecon

void LAPACK_cgecon (char * norm, lapack_int * n, const lapack_complex_float * a,
    lapack_int * lda, float * anorm, float * rcond, lapack_complex_float * work,
    float * rwork, lapack_int * info);

condition number, general complex matrix ✨ a is const (read-only era 💅), anorm goes in, rcond comes out, work/rwork are scratch, info is info 🍓


LAPACK_cgeequ

void LAPACK_cgeequ (lapack_int * m, lapack_int * n, const lapack_complex_float * a,
    lapack_int * lda, float * r, float * c, float * rowcnd, float * colcnd, float * amax,
    lapack_int * info);

equilibrate a general complex matrix 🌸 a stays const, r and c get the row/column scaling, rowcnd, colcnd and amax hand you the scaling info, info at the end 🫶


LAPACK_cgeequb

void LAPACK_cgeequb (lapack_int * m, lapack_int * n, const lapack_complex_float * a,
    lapack_int * lda, float * r, float * c, float * rowcnd, float * colcnd, float * amax,
    lapack_int * info);

cgeequ but with a b 🌈 identical signature, identical arg order — a const, everything else writable, info last. Copy, paste, slay 💅


LAPACK_cgees

void LAPACK_cgees (char * jobvs, char * sort, LAPACK_C_SELECT1 select, lapack_int * n,
    lapack_complex_float * a, lapack_int * lda, lapack_int * sdim, lapack_complex_float * w,
    lapack_complex_float * vs, lapack_int * ldvs, lapack_complex_float * work,
    lapack_int * lwork, float * rwork, lapack_logical * bwork, lapack_int * info);

Schur factorization, complex edition 👑 and look at that — a function pointer in the wild! select is a LAPACK_C_SELECT1, bwork is lapack_logical *, rwork is floats, everything else is complex. jobvs, sort, sdim, vs/ldvs, work/lwork, info — the whole crew is here 💖


LAPACK_cgeesx

void LAPACK_cgeesx (char * jobvs, char * sort, LAPACK_C_SELECT1 select, char * sense,
    lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_int * sdim,
    lapack_complex_float * w, lapack_complex_float * vs, lapack_int * ldvs,
    float * rconde, float * rcondv, lapack_complex_float * work, lapack_int * lwork,
    float * rwork, lapack_logical * bwork, lapack_int * info);

cgees with sense bolted on and two extra reciprocal-condition outputs, rconde and rcondv 💜 everything else matches: select of type LAPACK_C_SELECT1, bwork as lapack_logical *, rwork floats, info 🎀


LAPACK_cgeev

void LAPACK_cgeev (char * jobvl, char * jobvr, lapack_int * n, lapack_complex_float * a,
    lapack_int * lda, lapack_complex_float * w, lapack_complex_float * vl,
    lapack_int * ldvl, lapack_complex_float * vr, lapack_int * ldvr,
    lapack_complex_float * work, lapack_int * lwork, float * rwork, lapack_int * info);

eigenvalues and eigenvectors, the classic 🌈 w is the eigenvalues, vl/vr are left and right eigenvectors on ldvl/ldvr, jobvl and jobvr say which ones you actually want, and yes — rwork is still a float array because LAPACK said so 💅


LAPACK_cgeevx

void LAPACK_cgeevx (char * balanc, char * jobvl, char * jobvr, char * sense, lapack_int * n,
    lapack_complex_float * a, lapack_int * lda, lapack_complex_float * w,
    lapack_complex_float * vl, lapack_int * ldvl, lapack_complex_float * vr, lapack_int * ldvr,
    lapack_int * ilo, lapack_int * ihi, float * scale, float * abnrm, float * rconde,
    float * rcondv, lapack_complex_float * work, lapack_int * lwork, float * rwork,
    lapack_int * info);

the deluxe eigen-solver 😭 balanc and sense join the party, ilo/ihi and scale come from balancing, abnrm is there, plus rconde and rcondv. Same w, vl, vr, work, rwork, info core, just dressed up 💖


LAPACK_cgehrd

void LAPACK_cgehrd (lapack_int * n, lapack_int * ilo, lapack_int * ihi,
    lapack_complex_float * a, lapack_int * lda, lapack_complex_float * tau,
    lapack_complex_float * work, lapack_int * lwork, lapack_int * info);

general → Hessenberg reduction ✨ ilo/ihi mark the active window, tau holds the reflectors, a on lda gets overwritten, work/lwork do the scratch thing, info reports 🌸


LAPACK_cgejsv

void LAPACK_cgejsv (char * joba, char * jobu, char * jobv, char * jobr, char * jobt,
    char * jobp, lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda,
    float * sva, lapack_complex_float * u, lapack_int * ldu, lapack_complex_float * v,
    lapack_int * ldv, lapack_complex_float * cwork, lapack_int * lwork, float * work,
    lapack_int * lrwork, lapack_int * iwork, lapack_int * info);

six — count 'em, six — job flags: joba, jobu, jobv, jobr, jobt, jobp 💅 then sva for the singular values (floats), u/v complex on ldu/ldv, a complex cwork with lwork, a float work with lrwork, plus iwork and info. This one is carrying the whole toolbox 🧚


LAPACK_cgelq

void LAPACK_cgelq (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda,
    lapack_complex_float * t, lapack_int * tsize, lapack_complex_float * work,
    lapack_int * lwork, lapack_int * info);

LQ factorization with an explicit t / tsize representation 🦋 a on lda, work with lwork, info at the end. Short, sweet, iconic 🎀


LAPACK_cgelq2

void LAPACK_cgelq2 (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda,
    lapack_complex_float * tau, lapack_complex_float * work, lapack_int * info);

the unblocked LQ2, no lwork in sight 🙈 just a, lda, tau, work and info. Baby version, still slays ✨


LAPACK_cgelqf

void LAPACK_cgelqf (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda,
    lapack_complex_float * tau, lapack_complex_float * work, lapack_int * lwork,
    lapack_int * info);

blocked LQ factorization — same args as cgelq2 but now work brought lwork along 💅 tau collects the reflectors, info reports, done 🫶


LAPACK_cgels

void LAPACK_cgels (char * trans, lapack_int * m, lapack_int * n, lapack_int * nrhs,
    lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb,
    lapack_complex_float * work, lapack_int * lwork, lapack_int * info);

least squares, bestie 🌸 trans picks the problem shape, a on lda, b on ldb gets the solution, work/lwork scratch, info reports. No rwork here — look at that, a complex function that doesn't need floats 👑 (well, this one at least 😭)


LAPACK_cgelsd

void LAPACK_cgelsd (lapack_int * m, lapack_int * n, lapack_int * nrhs,
    lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb,
    float * s, float * rcond, lapack_int * rank, lapack_complex_float * work,
    lapack_int * lwork, float * rwork, lapack_int * iwork, lapack_int * info);

least squares via SVD, and it brought everything 🍓 s for singular values (float), rcond in, rank out, rwork floats, iwork ints, work complex, info last. Full squad assembled 💜


LAPACK_cgelss

void LAPACK_cgelss (lapack_int * m, lapack_int * n, lapack_int * nrhs,
    lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb,
    float * s, float * rcond, lapack_int * rank, lapack_complex_float * work,
    lapack_int * lwork, float * rwork, lapack_int * info);

same job as cgelsd minus the iwork 💅 s, rcond, rank, complex work/lwork, float rwork, info. Sometimes less is more, periodt ✨


LAPACK_cgelsy

void LAPACK_cgelsy (lapack_int * m, lapack_int * n, lapack_int * nrhs,
    lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb,
    lapack_int * jpvt, float * rcond, lapack_int * rank, lapack_complex_float * work,
    lapack_int * lwork, float * rwork, lapack_int * info);

least squares with column pivoting 🦋 jpvt is the pivot int array (not const — it gets written 💀), rcond and rank are the truncation pair, and then the usual work, lwork, rwork, info. No s array, because different algorithm, different vibe 🌸


LAPACK_cgemlq

void LAPACK_cgemlq (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k,
    const lapack_complex_float * a, lapack_int * lda, const lapack_complex_float * t,
    lapack_int * tsize, lapack_complex_float * c, lapack_int * ldc,
    lapack_complex_float * work, lapack_int * lwork, lapack_int * info);

multiply by Q from an LQ factorization 🎀 a and t are both const (they're the representation, we're just vibing off them 💅), c on ldc is what gets multiplied, side and trans decide which side and whether it's Q or Q-transposed, tsize, work, lwork, info 🫶


LAPACK_cgemqr

void LAPACK_cgemqr (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k,
    const lapack_complex_float * a, lapack_int * lda, const lapack_complex_float * t,
    lapack_int * tsize, lapack_complex_float * c, lapack_int * ldc,
    lapack_complex_float * work, lapack_int * lwork, lapack_int * info);

exact same shape as cgemlq but for Q out of a QR factorization ✨ const a and t, writable c, tsize, work, lwork, info. If you've read one you've basically read the other, but they are Not The Same Function, ok 😤


LAPACK_cgemqrt

void LAPACK_cgemqrt (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k,
    lapack_int * nb, const lapack_complex_float * v, lapack_int * ldv,
    const lapack_complex_float * t, lapack_int * ldt, lapack_complex_float * c,
    lapack_int * ldc, lapack_complex_float * work, lapack_int * info);

the blocked one — extra nb for block size, and the representation is v (ldv) + t (ldt) 🦋 both const, c on ldc is the thing being multiplied, work is there but there's no lwork and honestly? slay 💅 info finishes it off 🍓


LAPACK_cgeqlf

void LAPACK_cgeqlf (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda,
    lapack_complex_float * tau, lapack_complex_float * work, lapack_int * lwork,
    lapack_int * info);

QL factorization 🎀 a on lda, tau gets the elementary reflectors, work with lwork, info reports. Note the name: geqlf — QL, not LQ, don't mix them up bestie 😭


LAPACK_cgeqp3

void LAPACK_cgeqp3 (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda,
    lapack_int * jpvt, lapack_complex_float * tau, lapack_complex_float * work,
    lapack_int * lwork, float * rwork, lapack_int * info);

QR with column pivoting, the iconic version 👑 jpvt on entry says what's fixed, comes back as the pivots, tau gets the reflectors, complex work with lwork, and — surprise! — a float rwork too, plus info 💖


and that's this chunk 🌈 the pattern kinda writes itself at this point: job flags and descriptors first, matrices and their leading dims next, scratch (work/rwork/iwork/lwork/lrwork/tsize) after, and info always bringing up the rear 💅 next batch incoming 🫶

Okay so these next ones are all the c-flavoured prototypes, still marching along alphabetically, and honestly? The way this list just keeps going is giving "the compiler's gonna need a snack" energy. Every signature below is verbatim, pointers and all — I'm not touching a single asterisk. 💅

  • LAPACK_cgeqpf
void LAPACK_cgeqpf (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_int * jpvt, lapack_complex_float * tau, lapack_complex_float * work, float * rwork, lapack_int * info)

Nine-ish args, one lonely float * tucked in among all the lapack_complex_float — she's got a little rwork sidekick and we respect it. 🫶

  • LAPACK_cgeqr
void LAPACK_cgeqr (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * t, lapack_int * tsize, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

Not me spotting both tsize and lwork in here — two sizes, two mood boards, zero notes. ✨

  • LAPACK_cgeqr2
void LAPACK_cgeqr2 (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * tau, lapack_complex_float * work, lapack_int * info)

The 2 version, lowkey shorter — no lwork bestie on this one, work just shows up uninvited and we love that for her.

  • LAPACK_cgeqrf
void LAPACK_cgeqrf (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * tau, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

The classic. Same roster as cgeqr2 but now lwork pulled up, main character energy fr fr.

  • LAPACK_cgeqrfp
void LAPACK_cgeqrfp (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * tau, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

cgeqrf with one extra letter stapled on the end and the exact same parameter list — the twin that showed up in a slightly different outfit. 💀

  • LAPACK_cgeqrt
void LAPACK_cgeqrt (lapack_int * m, lapack_int * n, lapack_int * nb, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * t, lapack_int * ldt, lapack_complex_float * work, lapack_int * info)

Hiiii nb and ldt, newcomers, love the confidence. Iconic of them to just squeeze into the argument list like they own the place.

  • LAPACK_cgeqrt2
void LAPACK_cgeqrt2 (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * t, lapack_int * ldt, lapack_int * info)

Minimalist queen — work didn't even get an invite, info is literally the last one standing. 🌸

  • LAPACK_cgeqrt3
void LAPACK_cgeqrt3 (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * t, lapack_int * ldt, lapack_int * info)

Same lineup as cgeqrt2, different number, different plot twist. Not me double-checking that character by character — I did, diva, I did. 😭

  • LAPACK_cgerfs
void LAPACK_cgerfs (char * trans, lapack_int * n, lapack_int * nrhs, const lapack_complex_float * a, lapack_int * lda, const lapack_complex_float * af, lapack_int * ldaf, const lapack_int * ipiv, const lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x, lapack_int * ldx, float * ferr, float * berr, lapack_complex_float * work, float * rwork, lapack_int * info)

Oh she's fancy — const all over the inputs like a bouncer at the club, and both ferr and berr showed up to the function. Spoiled tbh. 🔥

  • LAPACK_cgerfsx
void LAPACK_cgerfsx (char * trans, char * equed, lapack_int * n, lapack_int * nrhs, const lapack_complex_float * a, lapack_int * lda, const lapack_complex_float * af, lapack_int * ldaf, const lapack_int * ipiv, const float * r, const float * c, const lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x, lapack_int * ldx, float * rcond, float * berr, lapack_int * n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int * nparams, float * params, lapack_complex_float * work, float * rwork, lapack_int * info)

The x suffix ate so hard on the parameter count — equed, r, c, rcond, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params… bestie this is a whole guest list, not a function signature. 🎀

  • LAPACK_cgerqf
void LAPACK_cgerqf (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * tau, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

Note the r and the f did a little swap-dance compared to cgeqrf — same args, different name, and I'm obsessed that they just did that. 🦋

  • LAPACK_cgesdd
void LAPACK_cgesdd (char * jobz, lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, float * s, lapack_complex_float * u, lapack_int * ldu, lapack_complex_float * vt, lapack_int * ldvt, lapack_complex_float * work, lapack_int * lwork, float * rwork, lapack_int * iwork, lapack_int * info)

jobz, s, u, vt — she brought the whole ensemble cast, including an iwork that's lapack_int not float, tyvm. ⭐

  • LAPACK_cgesv
void LAPACK_cgesv (lapack_int * n, lapack_int * nrhs, lapack_complex_float * a, lapack_int * lda, lapack_int * ipiv, lapack_complex_float * b, lapack_int * ldb, lapack_int * info)

Short, sweet, eight args, no work, no nonsense. A little palate cleanser after cgesdd, honestly. 🌈

  • LAPACK_cgesvd
void LAPACK_cgesvd (char * jobu, char * jobvt, lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, float * s, lapack_complex_float * u, lapack_int * ldu, lapack_complex_float * vt, lapack_int * ldvt, lapack_complex_float * work, lapack_int * lwork, float * rwork, lapack_int * info)

Two separate job chars here (jobu and jobvt) instead of one jobz — different vibe, same icon behaviour. 💜

  • LAPACK_cgesvdx
void LAPACK_cgesvdx (char * jobu, char * jobvt, char * range, lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, float * vl, float * vu, lapack_int * il, lapack_int * iu, lapack_int * ns, float * s, lapack_complex_float * u, lapack_int * ldu, lapack_complex_float * vt, lapack_int * ldvt, lapack_complex_float * work, lapack_int * lwork, float * rwork, lapack_int * iwork, lapack_int * info)

range, vl, vu, il, iu, ns — she said "I want options" and honestly? She got them. Not a single lwork-less thought in that head. 🔥

  • LAPACK_cgesvj
void LAPACK_cgesvj (char * joba, char * jobu, char * jobv, lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, float * sva, lapack_int * mv, lapack_complex_float * v, lapack_int * ldv, lapack_complex_float * cwork, lapack_int * lwork, float * rwork, lapack_int * lrwork, lapack_int * info)

THREE job chars (joba, jobu, jobv) and a cwork instead of a plain old work?? She's extra and she's earned it. lrwork is there too, matching rwork. 💅

  • LAPACK_cgesvx
void LAPACK_cgesvx (char * fact, char * trans, lapack_int * n, lapack_int * nrhs, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * af, lapack_int * ldaf, lapack_int * ipiv, char * equed, float * r, float * c, lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x, lapack_int * ldx, float * rcond, float * ferr, float * berr, lapack_complex_float * work, float * rwork, lapack_int * info)

fact and trans and equed — three chars before we even hit the numbers, it's giving opening credits sequence. 🎬

  • LAPACK_cgesvxx
void LAPACK_cgesvxx (char * fact, char * trans, lapack_int * n, lapack_int * nrhs, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * af, lapack_int * ldaf, lapack_int * ipiv, char * equed, float * r, float * c, lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x, lapack_int * ldx, float * rcond, float * rpvgrw, float * berr, lapack_int * n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int * nparams, float * params, lapack_complex_float * work, float * rwork, lapack_int * info)

Double-x means double trouble: rpvgrw slid in where ferr used to be, plus the whole err_bnds/params entourage. She's the loud one and she's thriving. 😭

  • LAPACK_cgetf2
void LAPACK_cgetf2 (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_int * ipiv, lapack_int * info)

Six args, tiny, adorable, gets the job done. A snack. 🍓

  • LAPACK_cgetrf
void LAPACK_cgetrf (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_int * ipiv, lapack_int * info)

Character-for-character the same as cgetf2 above, and no I will not be normal about two differently-named things having identical signatures. 🦋

  • LAPACK_cgetrf2
void LAPACK_cgetrf2 (lapack_int * m, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_int * ipiv, lapack_int * info)

Three of a kind, all with m, n, a, lda, ipiv, info. The matching-set energy is immaculate. ✨

  • LAPACK_cgetri
void LAPACK_cgetri (lapack_int * n, lapack_complex_float * a, lapack_int * lda, const lapack_int * ipiv, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

Hiii const lapack_int * ipiv — she's read-only now, boundaries set, work and lwork back on the roster. We stan a growth arc. 🌱

  • LAPACK_cgetrs
void LAPACK_cgetrs (char * trans, lapack_int * n, lapack_int * nrhs, const lapack_complex_float * a, lapack_int * lda, const lapack_int * ipiv, lapack_complex_float * b, lapack_int * ldb, lapack_int * info)

No work, no lwork, no problems. Just trans, n, nrhs, and a deeply const-coded cast. Clean. 🌸

  • LAPACK_cgetsls
void LAPACK_cgetsls (char * trans, lapack_int * m, lapack_int * n, lapack_int * nrhs, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

She's got m and n and nrhs — the full trio — and none of them are const. Bold. We respect it. 💜

  • LAPACK_cggbak
void LAPACK_cggbak (char * job, char * side, lapack_int * n, lapack_int * ilo, lapack_int * ihi, const float * lscale, const float * rscale, lapack_int * m, lapack_complex_float * v, lapack_int * ldv, lapack_int * info)

Oh we've hit the cgg era, besties — and she starts it with job, side, ilo, ihi, plus two const scales (lscale, rscale). Symmetry, my beloved. ⚖️

  • LAPACK_cggbal
void LAPACK_cggbal (char * job, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_int * ilo, lapack_int * ihi, float * lscale, float * rscale, float * work, lapack_int * info)

Same lscale/rscale duo but not const this time — the glow-up is them becoming writable. Also ilo/ihi are back, hi angels. 🎀

  • LAPACK_cgges
void LAPACK_cgges (char * jobvsl, char * jobvsr, char * sort, LAPACK_C_SELECT2 selctg, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_int * sdim, lapack_complex_float * alpha, lapack_complex_float * beta, lapack_complex_float * vsl, lapack_int * ldvsl, lapack_complex_float * vsr, lapack_int * ldvsr, lapack_complex_float * work, lapack_int * lwork, float * rwork, lapack_logical * bwork, lapack_int * info)

BIG one. We got jobvsl, jobvsr, sort, a whole LAPACK_C_SELECT2 selctg passed by value, the alpha/beta twins, vsl/vsr, and — plot twist — a lapack_logical * bwork. Bookmark this lineup, the next two are variations on it. 👑

  • LAPACK_cgges3
void LAPACK_cgges3 (char * jobvsl, char * jobvsr, char * sort, LAPACK_C_SELECT2 selctg, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_int * sdim, lapack_complex_float * alpha, lapack_complex_float * beta, lapack_complex_float * vsl, lapack_int * ldvsl, lapack_complex_float * vsr, lapack_int * ldvsr, lapack_complex_float * work, lapack_int * lwork, float * rwork, lapack_logical * bwork, lapack_int * info)

Identical parameter-for-parameter to cgges — the 3 is doing all the differentiating work here and honestly, same. 😭

  • LAPACK_cggesx
void LAPACK_cggesx (char * jobvsl, char * jobvsr, char * sort, LAPACK_C_SELECT2 selctg, char * sense, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_int * sdim, lapack_complex_float * alpha, lapack_complex_float * beta, lapack_complex_float * vsl, lapack_int * ldvsl, lapack_complex_float * vsr, lapack_int * ldvsr, float * rconde, float * rcondv, lapack_complex_float * work, lapack_int * lwork, float * rwork, lapack_int * iwork, lapack_int * liwork, lapack_logical * bwork, lapack_int * info)

The x version said "add sense" and then also "add rconde, rcondv, iwork, and liwork" — ma'am that's not a tweak, that's a renovation. 💀

  • LAPACK_cggev
void LAPACK_cggev (char * jobvl, char * jobvr, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * alpha, lapack_complex_float * beta, lapack_complex_float * vl, lapack_int * ldvl, lapack_complex_float * vr, lapack_int * ldvr, lapack_complex_float * work, lapack_int * lwork, float * rwork, lapack_int * info)

Swapped the vsl/vsr naming for vl/vr, dropped sort/selctg/sdim/bwork entirely. A whole new era, a whole new silhouette. 🦋

  • LAPACK_cggev3
void LAPACK_cggev3 (char * jobvl, char * jobvr, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * alpha, lapack_complex_float * beta, lapack_complex_float * vl, lapack_int * ldvl, lapack_complex_float * vr, lapack_int * ldvr, lapack_complex_float * work, lapack_int * lwork, float * rwork, lapack_int * info)

Yup, exactly cggev with a 3 on the name. The LAPACK naming committee was like "close enough" and honestly? Same. 💅

  • LAPACK_cggevx
void LAPACK_cggevx (char * balanc, char * jobvl, char * jobvr, char * sense, lapack_int * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * alpha, lapack_complex_float * beta, lapack_complex_float * vl, lapack_int * ldvl, lapack_complex_float * vr, lapack_int * ldvr, lapack_int * ilo, lapack_int * ihi, float * lscale, float * rscale, float * abnrm, float * bbnrm, float * rconde, float * rcondv, lapack_complex_float * work, lapack_int * lwork, float * rwork, lapack_int * iwork, lapack_logical * bwork, lapack_int * info)

FOUR leading chars (balanc, jobvl, jobvr, sense) and then ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv… she is the longest girl here and she knows it. Absolute unit. 🔥

  • LAPACK_cggglm
void LAPACK_cggglm (lapack_int * n, lapack_int * m, lapack_int * p, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * d, lapack_complex_float * x, lapack_complex_float * y, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

⚠️ PSA bestie: this one starts with n, then m, then p — not m, n. Order matters, don't get cute with it, copy it exactly. 🙈

  • LAPACK_cgghd3
void LAPACK_cgghd3 (char * compq, char * compz, lapack_int * n, lapack_int * ilo, lapack_int * ihi, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * q, lapack_int * ldq, lapack_complex_float * z, lapack_int * ldz, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

compq + compz + q + z — she really said "what if there were two of everything" and honestly the ldq/ldz matching pair is so satisfying. 😌

  • LAPACK_cgghrd
void LAPACK_cgghrd (char * compq, char * compz, lapack_int * n, lapack_int * ilo, lapack_int * ihi, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * q, lapack_int * ldq, lapack_complex_float * z, lapack_int * ldz, lapack_int * info)

cgghd3 minus work, minus lwork — the stripped-down edit of the same fit. Still serving. 🧚

  • LAPACK_cgglse
void LAPACK_cgglse (lapack_int * m, lapack_int * n, lapack_int * p, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * c, lapack_complex_float * d, lapack_complex_float * x, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

Okay and here the order is m, n, p — so yes, cgglse and cggglm really do flip those first two around, which is exactly the kind of chaos that makes you triple-check before you press enter. 🌈

  • LAPACK_cggqrf
void LAPACK_cggqrf (lapack_int * n, lapack_int * m, lapack_int * p, lapack_complex_float * a, lapack_int * lda, lapack_complex_float * taua, lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * taub,

And we end the chunk on a cliffhanger — taub's line literally trails off mid-sentence, no info, no closing paren, nothing. 😭 She's mid-tau, bestie. The rest of her is waiting in the next bit, so hold that thought and don't you dare close the paren for her. 🫶

okay bestie we're still deep in the prototype list and honestly? iconic of us. these are all void-returning, all pointer-argument, all lapack_int-coded — so keep your eyes on the stars and your info pointer close. 💫

   void LAPACK_cggrqf (lapack_int * m, lapack_int * p, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * taua,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * taub,
       lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

cggrqf said "I contain multitudes" and honestly it does — m, p, n, two matrices, two tau vectors. we love a maximalist. 💅

   void LAPACK_cggsvd (char * jobu, char * jobv, char * jobq, lapack_int * m,
       lapack_int * n, lapack_int * p, lapack_int * k, lapack_int * l,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b,
       lapack_int * ldb, float * alpha, float * beta, lapack_complex_float * u,
       lapack_int * ldu, lapack_complex_float * v, lapack_int * ldv,
       lapack_complex_float * q, lapack_int * ldq, lapack_complex_float * work,
       float * rwork, lapack_int * iwork, lapack_int * info)

the OG gsvd — alpha, beta, three job chars, and yes we're still mad about k and l both existing. no notes, just vibes. 🌸

   void LAPACK_cggsvd3 (char * jobu, char * jobv, char * jobq, lapack_int * m,
       lapack_int * n, lapack_int * p, lapack_int * k, lapack_int * l,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b,
       lapack_int * ldb, float * alpha, float * beta, lapack_complex_float * u,
       lapack_int * ldu, lapack_complex_float * v, lapack_int * ldv,
       lapack_complex_float * q, lapack_int * ldq, lapack_complex_float * work,
       lapack_int * lwork, float * rwork, lapack_int * iwork, lapack_int *
       info)

same energy, but bestie got an upgrade — lwork has entered the chat. glow-up era. ✨

   void LAPACK_cggsvp (char * jobu, char * jobv, char * jobq, lapack_int * m,
       lapack_int * p, lapack_int * n, lapack_complex_float * a, lapack_int *
       lda, lapack_complex_float * b, lapack_int * ldb, float * tola, float *
       tolb, lapack_int * k, lapack_int * l, lapack_complex_float * u,
       lapack_int * ldu, lapack_complex_float * v, lapack_int * ldv,
       lapack_complex_float * q, lapack_int * ldq, lapack_int * iwork, float *
       rwork, lapack_complex_float * tau, lapack_complex_float * work,
       lapack_int * info)

tola and tolb said "we're the tolerance girlies" and stepped out. twelve-plus args, zero regrets. 🎀

   void LAPACK_cggsvp3 (char * jobu, char * jobv, char * jobq, lapack_int * m,
       lapack_int * p, lapack_int * n, lapack_complex_float * a, lapack_int *
       lda, lapack_complex_float * b, lapack_int * ldb, float * tola, float *
       tolb, lapack_int * k, lapack_int * l, lapack_complex_float * u,
       lapack_int * ldu, lapack_complex_float * v, lapack_int * ldv,
       lapack_complex_float * q, lapack_int * ldq, lapack_int * iwork, float *
       rwork, lapack_complex_float * tau, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

bestie got the lwork treatment too. cggsvp3 walked so the rest of the …3 variants could RUN. 🏃‍♀️


now we're in tridiagonal territory and the names start getting cozy with each other:

   void LAPACK_cgtcon (char * norm, lapack_int * n, const lapack_complex_float
       * dl, const lapack_complex_float * d, const lapack_complex_float * du,
       const lapack_complex_float * du2, const lapack_int * ipiv, float *
       anorm, float * rcond, lapack_complex_float * work, lapack_int * info)

dl, d, du, du2 — a whole little tridiagonal family reunion, plus ipiv being the main character as always. ✨

   void LAPACK_cgtrfs (char * trans, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * dl, const lapack_complex_float * d, const
       lapack_complex_float * du, const lapack_complex_float * dlf, const
       lapack_complex_float * df, const lapack_complex_float * duf, const
       lapack_complex_float * du2, const lapack_int * ipiv, const
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * ferr, float * berr, lapack_complex_float *
       work, float * rwork, lapack_int * info)

the f suffix crew (dlf, df, duf) said "we're the factorized versions, say my name" and honestly? they ate. ferr and berr are the error-estimator besties. 🫶

   void LAPACK_cgtsv (lapack_int * n, lapack_int * nrhs, lapack_complex_float *
       dl, lapack_complex_float * d, lapack_complex_float * du,
       lapack_complex_float * b, lapack_int * ldb, lapack_int * info)

short, sweet, no lwork in sight — a minimalist queen. lowkey refreshing tbh. 💜

   void LAPACK_cgtsvx (char * fact, char * trans, lapack_int * n, lapack_int *
       nrhs, const lapack_complex_float * dl, const lapack_complex_float * d,
       const lapack_complex_float * du, lapack_complex_float * dlf,
       lapack_complex_float * df, lapack_complex_float * duf,
       lapack_complex_float * du2, lapack_int * ipiv, const
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * rcond, float * ferr, float * berr,
       lapack_complex_float * work, float * rwork, lapack_int * info)

the expert driver (the x at the end is literally giving "I did my homework"). fact, trans, rcond, ferr, berr — a whole entourage. 💅

   void LAPACK_cgttrf (lapack_int * n, lapack_complex_float * dl,
       lapack_complex_float * d, lapack_complex_float * du,
       lapack_complex_float * du2, lapack_int * ipiv, lapack_int * info)

factorization time!! note that dl, d, du, du2 and ipiv are all not const here — they get written to, bestie, that's the whole point. 👑

   void LAPACK_cgttrs (char * trans, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * dl, const lapack_complex_float * d, const
       lapack_complex_float * du, const lapack_complex_float * du2, const
       lapack_int * ipiv, lapack_complex_float * b, lapack_int * ldb,
       lapack_int * info)

and now everything's const because the solve step is a read-only queen. b and ldb are the only ones getting touched. 🙈


okay band-matrix arc, let's go. hbev means Hermitian band eigenvalues and the _2stage girlies are here too:

   void LAPACK_chbev (char * jobz, char * uplo, lapack_int * n, lapack_int *
       kd, lapack_complex_float * ab, lapack_int * ldab, float * w,
       lapack_complex_float * z, lapack_int * ldz, lapack_complex_float * work,
       float * rwork, lapack_int * info)

kd = the bandwidth, ab = the band storage, w = the eigenvalues, z = the eigenvectors. a classic lineup we stan. 🌟

   void LAPACK_chbev_2stage (char * jobz, char * uplo, lapack_int * n,
       lapack_int * kd, lapack_complex_float * ab, lapack_int * ldab, float *
       w, lapack_complex_float * z, lapack_int * ldz, lapack_complex_float *
       work, lapack_int * lwork, float * rwork, lapack_int * info)

two-stage version said "I need lwork actually" and we respect a girl who knows her needs. ✨

   void LAPACK_chbevd (char * jobz, char * uplo, lapack_int * n, lapack_int *
       kd, lapack_complex_float * ab, lapack_int * ldab, float * w,
       lapack_complex_float * z, lapack_int * ldz, lapack_complex_float * work,
       lapack_int * lwork, float * rwork, lapack_int * lrwork, lapack_int *
       iwork, lapack_int * liwork, lapack_int * info)

the d means divide-and-conquer and the workspace count DOUBLES: lwork, lrwork, liwork. she brought luggage. 🧳

   void LAPACK_chbevd_2stage (char * jobz, char * uplo, lapack_int * n,
       lapack_int * kd, lapack_complex_float * ab, lapack_int * ldab, float *
       w, lapack_complex_float * z, lapack_int * ldz, lapack_complex_float *
       work, lapack_int * lwork, float * rwork, lapack_int * lrwork, lapack_int
       * iwork, lapack_int * liwork, lapack_int * info)

same luggage, extra stage. truly the "and I took that personally" of eigenvalue routines. 💀

   void LAPACK_chbevx (char * jobz, char * range, char * uplo, lapack_int * n,
       lapack_int * kd, lapack_complex_float * ab, lapack_int * ldab,
       lapack_complex_float * q, lapack_int * ldq, float * vl, float * vu,
       lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float
       * w, lapack_complex_float * z, lapack_int * ldz, lapack_complex_float *
       work, float * rwork, lapack_int * iwork, lapack_int * ifail, lapack_int
       * info)

range, vl, vu, il, iu, abstol, m, ifail — this one is the full expert-driver deluxe package with a side of ifail. that's a lot of lowercase letters and every single one matters. 🎯

   void LAPACK_chbevx_2stage (char * jobz, char * range, char * uplo,
       lapack_int * n, lapack_int * kd, lapack_complex_float * ab, lapack_int *
       ldab, lapack_complex_float * q, lapack_int * ldq, float * vl, float *
       vu, lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m,
       float * w, lapack_complex_float * z, lapack_int * ldz,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * iwork, lapack_int * ifail, lapack_int * info)

same deluxe package, plus lwork because of course. the two-stage girlies never travel light. 👜


generalized band problems now, so obviously there's bb (the B matrix) in the mix:

   void LAPACK_chbgst (char * vect, char * uplo, lapack_int * n, lapack_int *
       ka, lapack_int * kb, lapack_complex_float * ab, lapack_int * ldab, const
       lapack_complex_float * bb, lapack_int * ldbb, lapack_complex_float * x,
       lapack_int * ldx, lapack_complex_float * work, float * rwork, lapack_int
       * info)

two bandwidths ka and kb, two leading dimensions ldab and ldbb — and note bb is const while ab is not. she's reading from B and writing to A, iykyk. 📚

   void LAPACK_chbgv (char * jobz, char * uplo, lapack_int * n, lapack_int *
       ka, lapack_int * kb, lapack_complex_float * ab, lapack_int * ldab,
       lapack_complex_float * bb, lapack_int * ldbb, float * w,
       lapack_complex_float * z, lapack_int * ldz, lapack_complex_float * work,
       float * rwork, lapack_int * info)

eigenvalues AND eigenvectors for the generalized band problem, no lwork though — old-school and unbothered. 🦋

   void LAPACK_chbgvd (char * jobz, char * uplo, lapack_int * n, lapack_int *
       ka, lapack_int * kb, lapack_complex_float * ab, lapack_int * ldab,
       lapack_complex_float * bb, lapack_int * ldbb, float * w,
       lapack_complex_float * z, lapack_int * ldz, lapack_complex_float * work,
       lapack_int * lwork, float * rwork, lapack_int * lrwork, lapack_int *
       iwork, lapack_int * liwork, lapack_int * info)

divide-and-conquer generalized band edition. four workspace pointers: work, lwork, rwork, lrwork, iwork, liwork — okay that's six, she's highkey extra and we love her for it. 🌈

   void LAPACK_chbgvx (char * jobz, char * range, char * uplo, lapack_int * n,
       lapack_int * ka, lapack_int * kb, lapack_complex_float * ab, lapack_int
       * ldab, lapack_complex_float * bb, lapack_int * ldbb,
       lapack_complex_float * q, lapack_int * ldq, float * vl, float * vu,
       lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float
       * w, lapack_complex_float * z, lapack_int * ldz, lapack_complex_float *
       work, float * rwork, lapack_int * iwork, lapack_int * ifail, lapack_int
       * info)

the full expert generalized band driver. q, ldq, ifail — it's giving "I have every parameter and I'm not sorry". 🔥

   void LAPACK_chbtrd (char * vect, char * uplo, lapack_int * n, lapack_int *
       kd, lapack_complex_float * ab, lapack_int * ldab, float * d, float * e,
       lapack_complex_float * q, lapack_int * ldq, lapack_complex_float * work,
       lapack_int * info)

d and e — the diagonal and off-diagonal girlies — plus q for the orthogonal factor if vect says so. no lwork, just vibes. 🍓


and now the he* section, aka Hermitian full-storage, aka my personal fave:

   void LAPACK_checon (char * uplo, lapack_int * n, const lapack_complex_float
       * a, lapack_int * lda, const lapack_int * ipiv, float * anorm, float *
       rcond, lapack_complex_float * work, lapack_int * info)

condition-number estimator. anorm and rcond in, rcond out. a and ipiv are const — she's just looking, not touching. 👀

   void LAPACK_checon_3 (char * uplo, lapack_int * n, const
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       e, const lapack_int * ipiv, float * anorm, float * rcond,
       lapack_complex_float * work, lapack_int * info)

the _3 variant brought a whole extra const lapack_complex_float * e to the function. upgrades, bestie. ✨

   void LAPACK_cheequb (char * uplo, lapack_int * n, const lapack_complex_float
       * a, lapack_int * lda, float * s, float * scond, float * amax,
       lapack_complex_float * work, lapack_int * info)

equb = equilibration, and it hands you s, scond, and amax. scaling queen behavior, honestly. 🎀

   void LAPACK_cheev (char * jobz, char * uplo, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, float * w,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * info)

the classic. jobz, uplo, a, lda, w, work, lwork, rwork, info. she's simple, she's reliable, she's iconic. 👑

   void LAPACK_cheev_2stage (char * jobz, char * uplo, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, float * w,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * info)

wait. same signature?? yes bestie, the two-stage magic is internal. no cap. 🪄

   void LAPACK_cheevd (char * jobz, char * uplo, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, float * w,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * lrwork, lapack_int * iwork, lapack_int * liwork, lapack_int
       * info)

divide-and-conquer: add lrwork, iwork, liwork to the guest list. the party got bigger and the workspace got real. 🎉

   void LAPACK_cheevd_2stage (char * jobz, char * uplo, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, float * w,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * lrwork, lapack_int * iwork, lapack_int * liwork, lapack_int
       * info)

again, identical signature to its non-2stage sibling. the difference lives under the hood and honestly? mysterious. we love a private life. 🤫

   void LAPACK_cheevr (char * jobz, char * range, char * uplo, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, float * vl, float * vu,
       lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float
       * w, lapack_complex_float * z, lapack_int * ldz, lapack_int * isuppz,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * lrwork, lapack_int * iwork, lapack_int * liwork, lapack_int
       * info)

MRRR algorithm checkpoint!! note isuppz — that's the support array and it is literally the main character of this signature. range, vl, vu, il, iu, abstol, m — the whole selection crew is present. 🌟

   void LAPACK_cheevr_2stage (char * jobz, char * range, char * uplo,
       lapack_int * n, lapack_complex_float * a, lapack_int * lda, float * vl,
       float * vu, lapack_int * il, lapack_int * iu, float * abstol, lapack_int
       * m, float * w, lapack_complex_float * z, lapack_int * ldz, lapack_int *
       isuppz, lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * lrwork, lapack_int * iwork, lapack_int * liwork, lapack_int
       * info)

same deal, extra stage, isuppz still holding it down. periodt. 💅

   void LAPACK_cheevx (char * jobz, char * range, char * uplo, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, float * vl, float * vu,
       lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float
       * w, lapack_complex_float * z, lapack_int * ldz, lapack_complex_float *
       work, lapack_int * lwork, float * rwork, lapack_int * iwork, lapack_int

okay that one's signature is literally still typing, so we're gonna let her finish her sentence in the next part — no spoilers, no guessing, we do NOT invent parameters in this house. 🫶 waiting patiently like a good bestie.


reminder for the girlies: every one of these is void, every array argument is a raw pointer, and every one of them has a trailing lapack_int * info — except when a signature is mid-cut, in which case we just wait. do not assume, do not fill in blanks, do not pass NULL to something you didn't read the rest of. love u, mean it. 💖

still going, obviously. next part continues right where cheevx left off — no goodbyes. 🦋

...and we're back, mid-signature, no shame 💅 the last one from before wraps up like this:

       * ifail, lapack_int * info)

okay now the new stuff, and bestie, it's giving two-stage energy:

   void LAPACK_cheevx_2stage (char * jobz, char * range, char * uplo,
       lapack_int * n, lapack_complex_float * a, lapack_int * lda, float * vl,
       float * vu, lapack_int * il, lapack_int * iu, float * abstol, lapack_int
       * m, float * w, lapack_complex_float * z, lapack_int * ldz,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * iwork, lapack_int * ifail, lapack_int * info)

look at that parameter list. jobz, range, uplo, then vl, vu, il, iu, abstol. it's literally the whole squad: job, range, triangle, bounds, tolerance, output count m, the works. and then rwork, iwork, ifail, info holding down the end like the last three friends squeezing into a photo 📸


🦋 the cheg era (generalized, obviously)

next up, the cheg-prefixed gang — chegst, chegv, chegv_2stage, chegvd, chegvx. note the itype at the front of most of them, and that chegst is the chill one that just takes a, b and dips 🫶

   void LAPACK_chegst (lapack_int * itype, char * uplo, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       b, lapack_int * ldb, lapack_int * info)
   void LAPACK_chegv (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float *
       b, lapack_int * ldb, float * w, lapack_complex_float * work, lapack_int
       * lwork, float * rwork, lapack_int * info)
   void LAPACK_chegv_2stage (lapack_int * itype, char * jobz, char * uplo,
       lapack_int * n, lapack_complex_float * a, lapack_int * lda,
       lapack_complex_float * b, lapack_int * ldb, float * w,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * info)
   void LAPACK_chegvd (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, lapack_complex_float * a, lapack_int * lda, lapack_complex_float *
       b, lapack_int * ldb, float * w, lapack_complex_float * work, lapack_int
       * lwork, float * rwork, lapack_int * lrwork, lapack_int * iwork,
       lapack_int * liwork, lapack_int * info)
   void LAPACK_chegvx (lapack_int * itype, char * jobz, char * range, char *
       uplo, lapack_int * n, lapack_complex_float * a, lapack_int * lda,
       lapack_complex_float * b, lapack_int * ldb, float * vl, float * vu,
       lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float
       * w, lapack_complex_float * z, lapack_int * ldz, lapack_complex_float *
       work, lapack_int * lwork, float * rwork, lapack_int * iwork, lapack_int
       * ifail, lapack_int * info)

see how chegvd is the extra one? it's got lrwork AND liwork in there — double the bookkeeping, double the fun ✨ and chegvx is out here with twenty-two parameters, which is a lot of params but she's slaying regardless.


🌸 cherfs + cherfsx (the refinement twins)

   void LAPACK_cherfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       af, lapack_int * ldaf, const lapack_int * ipiv, const
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * ferr, float * berr, lapack_complex_float *
       work, float * rwork, lapack_int * info)
   void LAPACK_cherfsx (char * uplo, char * equed, lapack_int * n, lapack_int *
       nrhs, const lapack_complex_float * a, lapack_int * lda, const
       lapack_complex_float * af, lapack_int * ldaf, const lapack_int * ipiv,
       const float * s, const lapack_complex_float * b, lapack_int * ldb,
       lapack_complex_float * x, lapack_int * ldx, float * rcond, float * berr,
       lapack_int * n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
       lapack_int * nparams, float * params, lapack_complex_float * work, float
       * rwork, lapack_int * info)

cherfsx said "i heard you like error bounds" and brought n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params. plus equed and s for the scaling girlies. also note rcond shows up here. the const qualifiers are doing their thing on a, af, ipiv, s and b — those inputs are not getting touched, periodt 🎀


⭐ the solver section: chesv and all her cousins

okay this is a whole family tree and every branch is iconic in her own way. we got the plain chesv, then chesv_aa, chesv_aa_2stage, chesv_rk, chesvx, chesvxx:

   void LAPACK_chesv (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * a, lapack_int * lda, lapack_int * ipiv,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)
   void LAPACK_chesv_aa (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * a, lapack_int * lda, lapack_int * ipiv,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)
   void LAPACK_chesv_aa_2stage (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * tb,
       lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)
   void LAPACK_chesv_rk (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * e,
       lapack_int * ipiv, lapack_complex_float * b, lapack_int * ldb,
       lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

the _aa_2stage one is lowkey the main character here — she's the only one with tb + ltb AND two pivot arrays, ipiv and ipiv2. two pivots. TWO. she's not like other girls 💅 and chesv_rk swaps in e where the others don't have it, which is very her.

then the x variants go full data-collection mode:

   void LAPACK_chesvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, const lapack_complex_float * a, lapack_int * lda,
       lapack_complex_float * af, lapack_int * ldaf, lapack_int * ipiv, const
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * rcond, float * ferr, float * berr,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * info)
   void LAPACK_chesvxx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, lapack_complex_float * a, lapack_int * lda, lapack_complex_float *
       af, lapack_int * ldaf, lapack_int * ipiv, char * equed, float * s,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * rcond, float * rpvgrw, float * berr,
       lapack_int * n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
       lapack_int * nparams, float * params, lapack_complex_float * work, float
       * rwork, lapack_int * info)

chesvxx has rpvgrw in addition to rcond, plus equed, s and the whole err-bnds ensemble. she's the one who shows up with a spreadsheet and honestly? respect 🫶


🧚 cheswapr through chetrd (short + sweet era)

   void LAPACK_cheswapr (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, lapack_int * i1, lapack_int * i2)
   void LAPACK_chetrd (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, float * d, float * e, lapack_complex_float * tau,
       lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

okay note this one: cheswapr has no info parameter. i repeat, no info. it just takes uplo, n, a, lda, i1, i2 and leaves. she said "i don't do error reporting" and honestly, icon behaviour 🌈 everything else on this page gets an info; she simply declined.

chetrd meanwhile has no ipiv at all, but it does have d, e and tau. different vibe entirely.


🍓 the chetrf cinematic universe

   void LAPACK_chetrf (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)
   void LAPACK_chetrf_aa (char * uplo, lapack_int * n, lapack_complex_float *
       a, lapack_int * lda, lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)
   void LAPACK_chetrf_aa_2stage (char * uplo, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * tb,
       lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,
       lapack_complex_float * work, lapack_int * lwork, lapack_int * info)
   void LAPACK_chetrf_rk (char * uplo, lapack_int * n, lapack_complex_float *
       a, lapack_int * lda, lapack_complex_float * e, lapack_int * ipiv,
       lapack_complex_float * work, lapack_int * lwork, lapack_int * info)
   void LAPACK_chetrf_rook (char * uplo, lapack_int * n, lapack_complex_float *
       a, lapack_int * lda, lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

five flavours of the same idea and every single one is valid 💖 _aa_2stage brings tb, ltb, ipiv and ipiv2; _rk brings e; _rook brings... vibes. and the plain one is there being the blueprint.


🎀 chetri and friends (the inverse girlies)

   void LAPACK_chetri (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, const lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * info)
   void LAPACK_chetri2 (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, const lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)
   void LAPACK_chetri2x (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, const lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * nb, lapack_int * info)
   void LAPACK_chetri_3 (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, const lapack_complex_float * e, const lapack_int *
       ipiv, lapack_complex_float * work, lapack_int * lwork, lapack_int *
       info)

quick vibe check bestie: chetri has work but no lwork. chetri2 adds lwork. chetri2x has neither lwork nor... wait, it has nb instead of lwork. and chetri_3 grabs both e and ipiv (both const, we love a read-only moment). they're all different, and that's fine, that's growth 🌱


💜 the chetrs cluster

   void LAPACK_chetrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_float * b, lapack_int * ldb, lapack_int * info)
   void LAPACK_chetrs2 (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * info)
   void LAPACK_chetrs_3 (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       e, const lapack_int * ipiv, lapack_complex_float * b, lapack_int * ldb,
       lapack_int * info)
   void LAPACK_chetrs_aa (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)
   void LAPACK_chetrs_aa_2stage (char * uplo, lapack_int * n, lapack_int *
       nrhs, lapack_complex_float * a, lapack_int * lda, lapack_complex_float *
       tb, lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,
       lapack_complex_float * b, lapack_int * ldb, lapack_int * info)
   void LAPACK_chetrs_rook (char * uplo, lapack_int * n, lapack_int * nrhs,
       const lapack_complex_float * a, lapack_int * lda, const lapack_int *
       ipiv, lapack_complex_float * b, lapack_int * ldb, lapack_int * info)

six of them. six!! and they all want uplo, n, nrhs, a, lda, a pivot array and b, ldb, info. the differences: chetrs is bare, chetrs2 adds work, chetrs_3 adds e, chetrs_aa adds work + lwork, chetrs_aa_2stage adds tb, ltb, ipiv, ipiv2, and chetrs_rook stays minimal like her cousin chetrs but with a whole different name. also clock the const on a/ipiv in most of them, but chetrs_aa_2stage takes its a and tb non-const. little details, but they're the moment 👑


🔥 chfrk + chgeqz (the glow-up duo)

   void LAPACK_chfrk (char * transr, char * uplo, char * trans, lapack_int * n,
       lapack_int * k, float * alpha, const lapack_complex_float * a,
       lapack_int * lda, float * beta, lapack_complex_float * c)

chfrk has no info either — so she's out here with transr, uplo, trans, n, k, alpha, a, lda, beta, c and zero error reporting. no info, no problems, no notes 😌

   void LAPACK_chgeqz (char * job, char * compq, char * compz, lapack_int * n,
       lapack_int * ilo, lapack_int * ihi, lapack_complex_float * h, lapack_int
       * ldh, lapack_complex_float * t, lapack_int * ldt, lapack_complex_float
       * alpha, lapack_complex_float * beta, lapack_complex_float * q,
       lapack_int * ldq, lapack_complex_float * z, lapack_int * ldz,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * info)

okay chgeqz ate. job, compq, compz, n, ilo, ihi, then h/ldh, t/ldt, alpha, beta, q/ldq, z/ldz, work/lwork, rwork, info. note both alpha and beta are lapack_complex_float here, and there are two separate char * flags compq and compz. she's thorough and we're obsessed 💅


🌺 the packed chp family (yes, packed, we're still doing these)

heading into packed-storage territory now — everything's ap/bp instead of a/b. buckle up 🦋

   void LAPACK_chpcon (char * uplo, lapack_int * n, const lapack_complex_float
       * ap, const lapack_int * ipiv, float * anorm, float * rcond,
       lapack_complex_float * work, lapack_int * info)
   void LAPACK_chpev (char * jobz, char * uplo, lapack_int * n,
       lapack_complex_float * ap, float * w, lapack_complex_float * z,
       lapack_int * ldz, lapack_complex_float * work, float * rwork, lapack_int
       * info)
   void LAPACK_chpevd (char * jobz, char * uplo, lapack_int * n,
       lapack_complex_float * ap, float * w, lapack_complex_float * z,
       lapack_int * ldz, lapack_complex_float * work, lapack_int * lwork, float
       * rwork, lapack_int * lrwork, lapack_int * iwork, lapack_int * liwork,
       lapack_int * info)
   void LAPACK_chpevx (char * jobz, char * range, char * uplo, lapack_int * n,
       lapack_complex_float * ap, float * vl, float * vu, lapack_int * il,
       lapack_int * iu, float * abstol, lapack_int * m, float * w,
       lapack_complex_float * z, lapack_int * ldz, lapack_complex_float * work,
       float * rwork, lapack_int * iwork, lapack_int * ifail, lapack_int *
       info)

chpcon is bringing anorm and rcond and also a const on both ap and ipiv. meanwhile chpev keeps it simpler — no lwork, just work and rwork. and chpevd + chpevx are back with the full lwork/lrwork/iwork/liwork spreadsheet (well, chpevx has iwork and ifail but no lrwork/liwork — she's a different shape, ok). ✨


🍨 last but not least: chpgst → chpgvx

   void LAPACK_chpgst (lapack_int * itype, char * uplo, lapack_int * n,
       lapack_complex_float * ap, const lapack_complex_float * bp, lapack_int *
       info)
   void LAPACK_chpgv (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, lapack_complex_float * ap, lapack_complex_float * bp, float * w,
       lapack_complex_float * z, lapack_int * ldz, lapack_complex_float * work,
       float * rwork, lapack_int * info)
   void LAPACK_chpgvd (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, lapack_complex_float * ap, lapack_complex_float * bp, float * w,
       lapack_complex_float * z, lapack_int * ldz, lapack_complex_float * work,
       lapack_int * lwork, float * rwork, lapack_int * lrwork, lapack_int *
       iwork, lapack_int * liwork, lapack_int * info)
   void LAPACK_chpgvx (lapack_int * itype, char * jobz, char * range, char *
       uplo, lapack_int * n, lapack_complex_float * ap, lapack_complex_float *

and that's where this part runs out of page 😭 chpgvx is literally mid-parameter-list — we got as far as lapack_complex_float * and then the man page said "to be continued." classic.

so to recap where we're at: chpgst (short king, itype + uplo + n + ap + bp + info, and note bp is const here), chpgv (adds jobz, w, z, ldz, work, rwork), chpgvd (adds the full lwork/lrwork/iwork/liwork set), and chpgvx (all the range/vl/vu/il/iu/abstol action, cut off mid-signature).

catch you in the next chunk bestie, we're so close to finishing this run of prototypes 🫶💖

...and the last one was still typing, so here's the rest of its tail 💀 — no cap, this is the wrap-up of the previous signature:

bp, float * vl, float * vu, lapack_int * il, lapack_int * iu, float *
abstol, lapack_int * m, float * w, lapack_complex_float * z, lapack_int
* ldz, lapack_complex_float * work, float * rwork, lapack_int * iwork,
lapack_int * ifail, lapack_int * info)

LAPACK_chprfs 🫶 — refines a solution for a complex single-precision Hermitian packed system. The whole squad shows up: uplo, n, nrhs, the original ap, the factored afp, ipiv, b with its ldb, x with its ldx, plus ferr, berr, work, rwork, and info carrying the gossip at the end.

void LAPACK_chprfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
    lapack_complex_float * ap, const lapack_complex_float * afp, const
    lapack_int * ipiv, const lapack_complex_float * b, lapack_int * ldb,
    lapack_complex_float * x, lapack_int * ldx, float * ferr, float * berr,
    lapack_complex_float * work, float * rwork, lapack_int * info)

LAPACK_chpsv ✨ — solves it outright, no refinement arc. uplo, n, nrhs, ap, ipiv, b, ldb, info. Short, sweet, slays.

void LAPACK_chpsv (char * uplo, lapack_int * n, lapack_int * nrhs,
    lapack_complex_float * ap, lapack_int * ipiv, lapack_complex_float * b,
    lapack_int * ldb, lapack_int * info)

LAPACK_chpsvx 🎀 — the full-glow-up version: fact, uplo, n, nrhs, ap, afp, ipiv, b, ldb, x, ldx, then rcond, ferr, berr, work, rwork, info. It's giving thorough. Obsessed.

void LAPACK_chpsvx (char * fact, char * uplo, lapack_int * n, lapack_int *
    nrhs, const lapack_complex_float * ap, lapack_complex_float * afp,
    lapack_int * ipiv, const lapack_complex_float * b, lapack_int * ldb,
    lapack_complex_float * x, lapack_int * ldx, float * rcond, float * ferr,
    float * berr, lapack_complex_float * work, float * rwork, lapack_int *
    info)

LAPACK_chptrd 🦋 — tridiagonal reduction of a complex Hermitian packed matrix. Takes uplo, n, ap, hands you d, e, tau, and reports through info.

void LAPACK_chptrd (char * uplo, lapack_int * n, lapack_complex_float * ap,
    float * d, float * e, lapack_complex_float * tau, lapack_int * info)

LAPACK_chptrf 🌸 — the factorization step for packed Hermitian. uplo, n, ap, ipiv, info — the core four plus the pivot homie.

void LAPACK_chptrf (char * uplo, lapack_int * n, lapack_complex_float * ap,
    lapack_int * ipiv, lapack_int * info)

LAPACK_chptri 💅 — inverse arc. uplo, n, ap, the ipiv from before, a work scratch, and info for the vibes check.

void LAPACK_chptri (char * uplo, lapack_int * n, lapack_complex_float * ap,
    const lapack_int * ipiv, lapack_complex_float * work, lapack_int * info)

LAPACK_chptrs 🔥 — solves using the thing you already factored. uplo, n, nrhs, ap, ipiv, b, ldb, info — it's the payoff of the factorization storyline, periodt.

void LAPACK_chptrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
    lapack_complex_float * ap, const lapack_int * ipiv, lapack_complex_float
    * b, lapack_int * ldb, lapack_int * info)

LAPACK_chsein 👑 — the eigenvectors-of-Hessenberg one, and she is stacked: job, eigsrc, initv, the select array, n, h, ldh, w, vl/ldvl, vr/ldvr, mm, m, work, rwork, ifaill, ifailr, info. Main character energy fr fr 😭

void LAPACK_chsein (char * job, char * eigsrc, char * initv, const
    lapack_logical * select, lapack_int * n, const lapack_complex_float * h,
    lapack_int * ldh, lapack_complex_float * w, lapack_complex_float * vl,
    lapack_int * ldvl, lapack_complex_float * vr, lapack_int * ldvr,
    lapack_int * mm, lapack_int * m, lapack_complex_float * work, float *
    rwork, lapack_int * ifaill, lapack_int * ifailr, lapack_int * info)

LAPACK_chseqr ⭐ — Schur factorization of a Hessenberg matrix. job, compz, n, ilo, ihi, h, ldh, w, z, ldz, work, lwork, info. Note lwork is in there — that's a real query-able size, so don't sleep on it 💜

void LAPACK_chseqr (char * job, char * compz, lapack_int * n, lapack_int *
    ilo, lapack_int * ihi, lapack_complex_float * h, lapack_int * ldh,
    lapack_complex_float * w, lapack_complex_float * z, lapack_int * ldz,
    lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

LAPACK_clacgv 🧚 — conjures conjugates in x with n and incx. Tiny icon, does the "flip the imaginary sign" thing iykyk.

void LAPACK_clacgv (lapack_int * n, lapack_complex_float * x, lapack_int *
    incx)

LAPACK_clacn2 🌈 — the 1-norm estimator loop. n, v, x, est, kase, isave. Lowkey one of my faves because kase and isave mean you get called back — it's a whole "call me back" situation 💀

void LAPACK_clacn2 (lapack_int * n, lapack_complex_float * v,
    lapack_complex_float * x, float * est, lapack_int * kase, lapack_int *
    isave)

LAPACK_clacp2 🎀 — copies real a into complex b. uplo, m, n, a, lda, b, ldb. Glow-up by type conversion, honestly iconic.

void LAPACK_clacp2 (char * uplo, lapack_int * m, lapack_int * n, const float
    * a, lapack_int * lda, lapack_complex_float * b, lapack_int * ldb)

LAPACK_clacpy 🦋 — same-type copy, the classic. uplo, m, n, a, lda, b, ldb. No notes, she just works.

void LAPACK_clacpy (char * uplo, lapack_int * m, lapack_int * n, const
    lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b,
    lapack_int * ldb)

LAPACK_clacrm ✨ — complex a times real b into complex c, with work along for the ride. m, n, a, lda, b, ldb, c, ldc, work.

void LAPACK_clacrm (lapack_int * m, lapack_int * n, const
    lapack_complex_float * a, lapack_int * lda, const float * b, lapack_int
    * ldb, lapack_complex_float * c, lapack_int * ldc, float * work)

LAPACK_clag2z 💖 — single-precision complex IN, double-precision complex OUT. The sa→a glow-up with m, n, ldsa, lda, and info. Leveling up fr fr.

void LAPACK_clag2z (lapack_int * m, lapack_int * n, const
    lapack_complex_float * sa, lapack_int * ldsa, lapack_complex_double * a,
    lapack_int * lda, lapack_int * info)

LAPACK_clagge 🌸 — generates a general band matrix from d as the diagonal seeds. m, n, kl, ku, d, a, lda, iseed (the RNG state, don't touch it weirdly), work, info.

void LAPACK_clagge (lapack_int * m, lapack_int * n, lapack_int * kl,
    lapack_int * ku, const float * d, lapack_complex_float * a, lapack_int *
    lda, lapack_int * iseed, lapack_complex_float * work, lapack_int * info)

LAPACK_claghe 🫶 — same generator energy but Hermitian flavored: n, k, d, a, lda, iseed, work, info.

void LAPACK_claghe (lapack_int * n, lapack_int * k, const float * d,
    lapack_complex_float * a, lapack_int * lda, lapack_int * iseed,
    lapack_complex_float * work, lapack_int * info)

LAPACK_clagsy 🔥 — and the symmetric twin: n, k, d, a, lda, iseed, work, info. Same cast, different symmetry aesthetic.

void LAPACK_clagsy (lapack_int * n, lapack_int * k, const float * d,
    lapack_complex_float * a, lapack_int * lda, lapack_int * iseed,
    lapack_complex_float * work, lapack_int * info)

LAPACK_clange 💜 — returns a float, and it's a norm. norm picks the flavor, m, n, a, lda, work. A queen that gives you a number back instead of writing into info — respect.

float LAPACK_clange (char * norm, lapack_int * m, lapack_int * n, const
    lapack_complex_float * a, lapack_int * lda, float * work)

LAPACK_clanhe 🎀 — Hermitian norm, same shape of deal: norm, uplo, n, a, lda, work, returns float.

float LAPACK_clanhe (char * norm, char * uplo, lapack_int * n, const
    lapack_complex_float * a, lapack_int * lda, float * work)

LAPACK_clansy 🌈 — symmetric norm, identical posse: norm, uplo, n, a, lda, work → float.

float LAPACK_clansy (char * norm, char * uplo, lapack_int * n, const
    lapack_complex_float * a, lapack_int * lda, float * work)

LAPACK_clantr 👑 — trapezoidal norm, so she needs the whole trio: norm, uplo, diag, plus m, n, a, lda, work, and yes she returns float. Three char pointers, absolutely eating.

float LAPACK_clantr (char * norm, char * uplo, char * diag, lapack_int * m,
    lapack_int * n, const lapack_complex_float * a, lapack_int * lda, float
    * work)

LAPACK_clapmr 🦋 — permutes the rows of x. Note forwrd is a lapack_logical * (a pointer, bestie, not a plain value), then m, n, x, ldx, and k (the permutation indices live at the end, no separate array param 🙈).

void LAPACK_clapmr (lapack_logical * forwrd, lapack_int * m, lapack_int * n,
    lapack_complex_float * x, lapack_int * ldx, lapack_int * k)

LAPACK_clapmt 💫 — the columns version. Same signature, forwrd, m, n, x, ldx, k. Only the letter changed and that's the whole bit 💀

void LAPACK_clapmt (lapack_logical * forwrd, lapack_int * m, lapack_int * n,
    lapack_complex_float * x, lapack_int * ldx, lapack_int * k)

LAPACK_clarcm 🍓 — real a times complex b into complex c, with work holding it down. m, n, a, lda, b, ldb, c, ldc, work. The mirror-image of LAPACK_clacrm and she knows it.

void LAPACK_clarcm (lapack_int * m, lapack_int * n, const float * a,
    lapack_int * lda, const lapack_complex_float * b, lapack_int * ldb,
    lapack_complex_float * c, lapack_int * ldc, float * work)

LAPACK_clarfb ⭐ — applies a block reflector. Nine-ish params deep: side, trans, direct, storev, m, n, k, v/ldv, t/ldt, c/ldc, and work with its own ldwork. It's giving "I have a lot going on but I'm handling it" 💅

void LAPACK_clarfb (char * side, char * trans, char * direct, char * storev,
    lapack_int * m, lapack_int * n, lapack_int * k, const
    lapack_complex_float * v, lapack_int * ldv, const lapack_complex_float *
    t, lapack_int * ldt, lapack_complex_float * c, lapack_int * ldc,
    lapack_complex_float * work, lapack_int * ldwork)

LAPACK_clarfg 🧚 — generates a single Householder reflector. n, alpha (gets overwritten, mind you), x, incx, tau. Short and powerful, tiny icon behavior.

void LAPACK_clarfg (lapack_int * n, lapack_complex_float * alpha,
    lapack_complex_float * x, lapack_int * incx, lapack_complex_float * tau)

LAPACK_clarft 💖 — forms the triangular factor t of a block reflector. direct, storev, n, k, v, ldv, tau, t, ldt. No info, she just does the thing and dips.

void LAPACK_clarft (char * direct, char * storev, lapack_int * n, lapack_int
    * k, const lapack_complex_float * v, lapack_int * ldv, const
    lapack_complex_float * tau, lapack_complex_float * t, lapack_int * ldt)

LAPACK_clarfx 🌸 — applies a single Householder reflector to c. side, m, n, v, tau, c, ldc, work. Note tau is passed as a pointer here, not a scalar — don't let anyone gaslight you otherwise 🫶

void LAPACK_clarfx (char * side, lapack_int * m, lapack_int * n, const
    lapack_complex_float * v, lapack_complex_float * tau,
    lapack_complex_float * c, lapack_int * ldc, lapack_complex_float * work)

Okay so we're deep in the LAPACK_ function prototypes now — this stretch is all c-prefixed (that's lapack_complex_float, single-precision complex, she's fancy 💅) and it's giving "the whole alphabet of matrix storage formats" energy. Same deal as before: signature goes in verbatim, the commentary is just me hyping you up. Keep your info pointer close, bestie 🫶


LAPACK_clarnv

   void LAPACK_clarnv (lapack_int * idist, lapack_int * iseed, lapack_int * n,
       lapack_complex_float * x)

idist, iseed, n, x — four args, zero drama. The iseed is a pointer, so she's writing back to you, keep that array alive ok 😭

LAPACK_clascl

   void LAPACK_clascl (char * type, lapack_int * kl, lapack_int * ku, float *
       cfrom, float * cto, lapack_int * m, lapack_int * n, lapack_complex_float
       * a, lapack_int * lda, lapack_int * info)

Ten arguments. TEN. And cfrom + cto are both float *, not lapack_complex_float * — do not come for me, that's literally what the header says 🌸

LAPACK_claset

   void LAPACK_claset (char * uplo, lapack_int * m, lapack_int * n,
       lapack_complex_float * alpha, lapack_complex_float * beta,
       lapack_complex_float * a, lapack_int * lda)

Look at her — no info at all. Not every routine needs to snitch about its status, some just vibe ✨

LAPACK_classq

   void LAPACK_classq (lapack_int * n, lapack_complex_float * x, lapack_int *
       incx, float * scale, float * sumsq)

incx is hanging out on its own line up there with the * — that's just the wrapping, don't panic, it's still a lapack_int * 🎀

LAPACK_claswp

   void LAPACK_claswp (lapack_int * n, lapack_complex_float * a, lapack_int *
       lda, lapack_int * k1, lapack_int * k2, const lapack_int * ipiv,
       lapack_int * incx)

Bestie this one's got const on the ipiv — she's reading your pivot indices, not touching them. Respectful queen 👑

LAPACK_clatms

   void LAPACK_clatms (lapack_int * m, lapack_int * n, char * dist, lapack_int
       * iseed, char * sym, float * d, lapack_int * mode, float * cond, float *
       dmax, lapack_int * kl, lapack_int * ku, char * pack,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * work,
       lapack_int * info)

Fifteen arguments, three char *s, and a partridge in a pear tree 🍓 This is the longest signature in this whole stretch and honestly? Main character energy. Type it exact or don't type it at all.

LAPACK_clauum

   void LAPACK_clauum (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, lapack_int * info)

Short, sweet, uplo-first. We love a tidy five-arg queen 💖

LAPACK_cpbcon

   void LAPACK_cpbcon (char * uplo, lapack_int * n, lapack_int * kd, const
       lapack_complex_float * ab, lapack_int * ldab, float * anorm, float *
       rcond, lapack_complex_float * work, float * rwork, lapack_int * info)

Note the ab / ldab pair — and ab is const while work and rwork are not. Also she brought both a complex work and a real rwork. Two works, one routine 😤

LAPACK_cpbequ

   void LAPACK_cpbequ (char * uplo, lapack_int * n, lapack_int * kd, const
       lapack_complex_float * ab, lapack_int * ldab, float * s, float * scond,
       float * amax, lapack_int * info)

s, scond, amax — the three float * girlies. No work array here, she travels light ✨

LAPACK_cpbrfs

   void LAPACK_cpbrfs (char * uplo, lapack_int * n, lapack_int * kd, lapack_int
       * nrhs, const lapack_complex_float * ab, lapack_int * ldab, const
       lapack_complex_float * afb, lapack_int * ldafb, const
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * ferr, float * berr, lapack_complex_float *
       work, float * rwork, lapack_int * info)

Okay the arg count is unwell. kd? also nrhs? and ldab + ldafb + ldb + ldx?? Every leading dimension got an invite to the party 🎉

LAPACK_cpbstf

   void LAPACK_cpbstf (char * uplo, lapack_int * n, lapack_int * kb,
       lapack_complex_float * bb, lapack_int * ldbb, lapack_int * info)

kb and bb, not kd and ab — yes the letters differ from her sisters above, no that's not a typo, that's the header 🤡

LAPACK_cpbsv

   void LAPACK_cpbsv (char * uplo, lapack_int * n, lapack_int * kd, lapack_int
       * nrhs, lapack_complex_float * ab, lapack_int * ldab,
       lapack_complex_float * b, lapack_int * ldb, lapack_int * info)

Nine args, back to kd/ab. See? Consistency is a spectrum 💀

LAPACK_cpbsvx

   void LAPACK_cpbsvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       kd, lapack_int * nrhs, lapack_complex_float * ab, lapack_int * ldab,
       lapack_complex_float * afb, lapack_int * ldafb, char * equed, float * s,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * rcond, float * ferr, float * berr,
       lapack_complex_float * work, float * rwork, lapack_int * info)

fact, uplo, equed — three char *s and twenty args total. She's the "expert" variant, obviously she's extra 👑

LAPACK_cpbtrf

   void LAPACK_cpbtrf (char * uplo, lapack_int * n, lapack_int * kd,
       lapack_complex_float * ab, lapack_int * ldab, lapack_int * info)

Six args. A palate cleanser after cpbsvx. Thank you for your service 🫶

LAPACK_cpbtrs

   void LAPACK_cpbtrs (char * uplo, lapack_int * n, lapack_int * kd, lapack_int
       * nrhs, const lapack_complex_float * ab, lapack_int * ldab,
       lapack_complex_float * b, lapack_int * ldb, lapack_int * info)

Same as cpbsv but ab is const and there's no info-adjacent chaos. Copy, paste, but make it const 💅

LAPACK_cpftrf

   void LAPACK_cpftrf (char * transr, char * uplo, lapack_int * n,
       lapack_complex_float * a, lapack_int * info)

New letters unlocked: transr. Different from plain trans, ok? Don't @ me, write it exactly 🔥

LAPACK_cpftri

   void LAPACK_cpftri (char * transr, char * uplo, lapack_int * n,
       lapack_complex_float * a, lapack_int * info)

Literally identical signature to cpftrf above — yes bestie, that happens, the C name is the difference, not the args 🌈

LAPACK_cpftrs

   void LAPACK_cpftrs (char * transr, char * uplo, lapack_int * n, lapack_int *
       nrhs, const lapack_complex_float * a, lapack_complex_float * b,
       lapack_int * ldb, lapack_int * info)

Now with nrhs and a const a. The "s" at the end means she brought friends 🎀

LAPACK_cpocon

   void LAPACK_cpocon (char * uplo, lapack_int * n, const lapack_complex_float
       * a, lapack_int * lda, float * anorm, float * rcond,
       lapack_complex_float * work, float * rwork, lapack_int * info)

const lapack_complex_float with the * wrapped onto the next line — that's the original's line break, keep the spelling const lapack_complex_float 💜

LAPACK_cpoequ

   void LAPACK_cpoequ (lapack_int * n, const lapack_complex_float * a,
       lapack_int * lda, float * s, float * scond, float * amax, lapack_int *
       info)

No uplo! First one in a while with no uplo. Change is good, growth is good 🌱

LAPACK_cpoequb

   void LAPACK_cpoequb (lapack_int * n, const lapack_complex_float * a,
       lapack_int * lda, float * s, float * scond, float * amax, lapack_int *
       info)

Exact same as cpoequ plus a b on the end. That b is doing so much heavy lifting and honestly? She's slaying it ⭐

LAPACK_cporfs

   void LAPACK_cporfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       af, lapack_int * ldaf, const lapack_complex_float * b, lapack_int * ldb,
       lapack_complex_float * x, lapack_int * ldx, float * ferr, float * berr,
       lapack_complex_float * work, float * rwork, lapack_int * info)

Three consts in a row (a, af, b) and then x unapologetically mutable. The accuracy check goes into x, bestie, that's the whole point 😌

LAPACK_cporfsx

   void LAPACK_cporfsx (char * uplo, char * equed, lapack_int * n, lapack_int *
       nrhs, const lapack_complex_float * a, lapack_int * lda, const
       lapack_complex_float * af, lapack_int * ldaf, const float * s, const
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * rcond, float * berr, lapack_int * n_err_bnds,
       float * err_bnds_norm, float * err_bnds_comp, lapack_int * nparams,
       float * params, lapack_complex_float * work, float * rwork, lapack_int *
       info)

TWENTY-THREE ARGUMENTS. err_bnds_norm, err_bnds_comp, n_err_bnds, nparams, params — she's the extended one, the deluxe edition, the ✨director's cut✨. Type her slow 😭

LAPACK_cposv

   void LAPACK_cposv (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b,
       lapack_int * ldb, lapack_int * info)

Eight args, clean lines, no notes. The reliable friend of the group chat 💖

LAPACK_cposvx

   void LAPACK_cposvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, lapack_complex_float * a, lapack_int * lda, lapack_complex_float *
       af, lapack_int * ldaf, char * equed, float * s, lapack_complex_float *
       b, lapack_int * ldb, lapack_complex_float * x, lapack_int * ldx, float *
       rcond, float * ferr, float * berr, lapack_complex_float * work, float *
       rwork, lapack_int * info)

Same skeleton as cpbsvx up there but without the kd. See the family resemblance? That's the *svx bloodline 🔥

LAPACK_cposvxx

   void LAPACK_cposvxx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, lapack_complex_float * a, lapack_int * lda, lapack_complex_float *
       af, lapack_int * ldaf, char * equed, float * s, lapack_complex_float *
       b, lapack_int * ldb, lapack_complex_float * x, lapack_int * ldx, float *
       rcond, float * rpvgrw, float * berr, lapack_int * n_err_bnds, float *
       err_bnds_norm, float * err_bnds_comp, lapack_int * nparams, float *
       params, lapack_complex_float * work, float * rwork, lapack_int * info)

Twenty-three again, but she's got rpvgrw and drops ferr — compare carefully with cposvx above, do not assume. Double-x means extra credit, obviously 🎓

LAPACK_cpotrf

   void LAPACK_cpotrf (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, lapack_int * info)

The classic. The blueprint. Five args and a dream 🦋

LAPACK_cpotrf2

   void LAPACK_cpotrf2 (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, lapack_int * info)

Identical to cpotrf — the 2 is in the name, not the signature. Sneaky but valid 💀

LAPACK_cpotri

   void LAPACK_cpotri (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, lapack_int * info)

Also identical! Three routines, one signature, three little letters on the end doing all the differentiation. Iconic honestly 👑

LAPACK_cpotrs

   void LAPACK_cpotrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b,
       lapack_int * ldb, lapack_int * info)

Here's the s — and of course she's the one with const a. The solver never messes with your factorization, bestie, she's respectful 🫶

LAPACK_cppcon

   void LAPACK_cppcon (char * uplo, lapack_int * n, const lapack_complex_float
       * ap, float * anorm, float * rcond, lapack_complex_float * work, float *
       rwork, lapack_int * info)

Note: ap, not a — the packed girlies get their own letter and their own lda-free life. No leading dimension required 🎀

LAPACK_cppequ

   void LAPACK_cppequ (char * uplo, lapack_int * n, const lapack_complex_float
       * ap, float * s, float * scond, float * amax, lapack_int * info)

ap, s, scond, amax, info. Seven args, packed life, zero work. So tidy ✨

LAPACK_cpprfs

   void LAPACK_cpprfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * ap, const lapack_complex_float * afp, const
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * ferr, float * berr, lapack_complex_float *
       work, float * rwork, lapack_int * info)

ap AND afp, both const. And yes, nrhs sits there even though... anyway, that's the signature, type it 💅

LAPACK_cppsv

   void LAPACK_cppsv (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * ap, lapack_complex_float * b, lapack_int * ldb,
       lapack_int * info)

No lda because packed, and look — ap is not const here. That distinction matters, don't get cute and add a const 🙈

LAPACK_cppsvx

   void LAPACK_cppsvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, lapack_complex_float * ap, lapack_complex_float * afp, char *
       equed, float * s, lapack_complex_float * b, lapack_int * ldb,
       lapack_complex_float * x, lapack_int * ldx, float * rcond, float * ferr,
       float * berr, lapack_complex_float * work, float * rwork, lapack_int *
       info)

Nineteen args, fact + equed + the whole ferr/berr duo. The packed expert variant showed UP 🌟

LAPACK_cpptrf

   void LAPACK_cpptrf (char * uplo, lapack_int * n, lapack_complex_float * ap,
       lapack_int * info)

Four arguments. Four. That's it. That's the whole routine. Minimalist queen 🎀

LAPACK_cpptri

   void LAPACK_cpptri (char * uplo, lapack_int * n, lapack_complex_float * ap,
       lapack_int * info)

Also four, also identical to the one above. The f and the i are the only thing telling them apart, iykyk 👀

LAPACK_cpptrs

   void LAPACK_cpptrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * ap, lapack_complex_float * b, lapack_int * ldb,
       lapack_int * info)

The s returns, the nrhs returns, the const ap returns. Truly the reunion tour 😭

LAPACK_cpstrf

   void LAPACK_cpstrf (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, lapack_int * piv, lapack_int * rank, float * tol,
       float * work, lapack_int * info)

Ooh she's got piv and rank as lapack_int *s and a tol that's a float *. Nine args, pivot-flavoured. Also — that's cpstrf, with an s, not cpp anything. Eyes on the prize bestie 🔍

LAPACK_cptcon

   void LAPACK_cptcon (lapack_int * n, const float * d, const
       lapack_complex_float * e, float * anorm, float * rcond, float * work,
       lapack_int * info)

d is const float * (real!) and e is const lapack_complex_float * (complex!) — and work is float *, no rwork in sight. Truly a mixed-media moment 🎨

LAPACK_cpteqr

   void LAPACK_cpteqr (char * compz, lapack_int * n, float * d, float * e,
       lapack_complex_float * z, lapack_int * ldz, float * work, lapack_int *
       info)

First compz of this batch 🦋 And here d and e are not const — non-const float * the both of them. Details matter, bestie.

LAPACK_cptrfs

   void LAPACK_cptrfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       float * d, const lapack_complex_float * e, const float * df, const
       lapack_complex_float * ef, const lapack_complex_float * b, lapack_int *
       ldb, lapack_complex_float * x, lapack_int * ldx, float * ferr, float *
       berr, lapack_complex_float * work, float * rwork, lapack_int * info)

Okay this one's a whole meal: d/e/df/ef — real, complex, real, complex — it's giving 🎀 alternating 🎀 and d is const here even though it wasn't in cpteqr. Yes. Really. Write what you see 💀

LAPACK_cptsv

   void LAPACK_cptsv (lapack_int * n, lapack_int * nrhs, float * d,
       lapack_complex_float * e, lapack_complex_float * b, lapack_int * ldb,
       lapack_int * info)

Seven args, no uplo, no lda. She's the tridiagonal simplicity icon we deserve 🌸

LAPACK_cptsvx

   void LAPACK_cptsvx (char * fact, lapack_int * n, lapack_int * nrhs, const
       float * d, const lapack_complex_float * e, float * df,
       lapack_complex_float * ef, const lapack_complex_float * b, lapack_int *
       ldb, lapack_complex_float * x, lapack_int * ldx, float * rcond, float *
       ferr, float * berr, lapack_complex_float * work, float * rwork,
       lapack_int * info)

See it? const on d/e/b, but df and ef are mutable — those are the OUTPUT copies, she's writing your factored version back out 😤 Eighteen args, no notes.

LAPACK_cpttrf

   void LAPACK_cpttrf (lapack_int * n, float * d, lapack_complex_float * e,
       lapack_int * info)

Four args. n, d, e, info. No uplo because tridiagonal doesn't need to pick a side, and I'm obsessed with the restraint ✨

LAPACK_cpttrs

   void LAPACK_cpttrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       float * d, const lapack_complex_float * e, lapack_complex_float * b,
       lapack_int * ldb, lapack_int * info)

Wait — uplo came back for the solve! And d/e are const here. Compare with cpttrf above and don't get them mixed up bestie 🫶

LAPACK_cspcon

   void LAPACK_cspcon (char * uplo, lapack_int * n, const lapack_complex_float
       * ap, const lapack_int * ipiv, float * anorm, float * rcond,
       lapack_complex_float * work, lapack_int * info)

const lapack_int * ipiv and no rwork — the cs* family travels with one less work array than the cp* girlies. Little differences, big vibes 💜

LAPACK_csprfs

   void LAPACK_csprfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * ap, const lapack_complex_float * afp, const
       lapack_int * ipiv, const lapack_complex_float * b, lapack_int * ldb,
       lapack_complex_float * x, lapack_int * ldx, float * ferr, float * berr,
       lapack_complex_float * work, float * rwork, lapack_int * info)

Fifteen args and she does have rwork. So cspcon skipped it and csprfs brought it. Correct. That's the header. We don't question the header 🔥

LAPACK_cspsv

   void LAPACK_cspsv (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * ap, lapack_int * ipiv, lapack_complex_float * b,
       lapack_int * ldb, lapack_int * info)

Eight args, ipiv in the middle, ap non-const. She's the solver, she's allowed to modify things 👑💅

LAPACK_cspsvx

   void LAPACK_cspsvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, const lapack_complex_float * ap, lapack_complex_float * afp,
       lapack_int * ipiv, const lapack_complex_float * b, lapack_int * ldb,
       lapack_complex_float * x, lapack_int * ldx, float * rcond, float * ferr,
       float * berr, lapack_complex_float * work, float * rwork, lapack_int *
       info)

ap is const, afp is not, ipiv is not const here (unlike cspcon, careful!), and the ferr/berr duo is present. Eighteen args of pure ✨pedigree✨

LAPACK_csptrf

   void LAPACK_csptrf (char * uplo, lapack_int * n, lapack_complex_float * ap,
       lapack_int * ipiv, lapack_int * info)

Five args. Nobody's const. She's here to factor and she will be touching your memory, bestie 😌

LAPACK_csptri

   void LAPACK_csptri (char * uplo, lapack_int * n, lapack_complex_float * ap,
       const lapack_int * ipiv, lapack_complex_float * work, lapack_int * info)

Look at this — ipiv IS const here, and there's a work that csptrf didn't have. The inverse routine is a whole different creature. Slay 💖


And that's where this chunk cuts off — mid-cs-family, of course, because the manpage loves a cliffhanger 😭 Keep your prototypes in order and I'll see you in the next one 🫶✨

   void LAPACK_csptrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * ap, const lapack_int * ipiv, lapack_complex_float
       * b, lapack_int * ldb, lapack_int * info)

okay so LAPACK_csptrs 💅 the ap-packed bestie with an ipiv in hand, solving for b and reporting back through info. we love a queen who keeps her uplo close and her ldb closer.


   void LAPACK_cstedc (char * compz, lapack_int * n, float * d, float * e,
       lapack_complex_float * z, lapack_int * ldz, lapack_complex_float * work,
       lapack_int * lwork, float * rwork, lapack_int * lrwork, lapack_int *
       iwork, lapack_int * liwork, lapack_int * info)

LAPACK_cstedc is genuinely the overachiever 😭 look at that argument list! compz, d, e, z, ldz, work, lwork, rwork, lrwork, iwork, liwork, info — she brought a whole carry-on luggage of workspaces. two of them are float work arrays and two are int ones, and honestly? iconic. bring your lwork, lrwork, and liwork or don't come at all 🎀


   void LAPACK_cstegr (char * jobz, char * range, lapack_int * n, float * d,
       float * e, float * vl, float * vu, lapack_int * il, lapack_int * iu,
       float * abstol, lapack_int * m, float * w, lapack_complex_float * z,
       lapack_int * ldz, lapack_int * isuppz, float * work, lapack_int * lwork,
       lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_cstegr saying hi with jobz AND range AND vl, vu, il, iu — she simply gives you options, bestie 🦋 abstol is there, m and w are there, isuppz is doing her little thing, and don't forget the work/lwork/iwork/liwork quartet. no cap, that's a lot of pointers and every single one matters.


   void LAPACK_cstein (lapack_int * n, const float * d, const float * e,
       lapack_int * m, const float * w, const lapack_int * iblock, const
       lapack_int * isplit, lapack_complex_float * z, lapack_int * ldz, float *
       work, lapack_int * iwork, lapack_int * ifailv, lapack_int * info)

LAPACK_cstein 🫶 notice how d, e, w, iblock, isplit are all const — she is not touching your data, she's just reading, periodt. the outputs go into z (with ldz), plus work, iwork, ifailv and info. respectful queen.


   void LAPACK_cstemr (char * jobz, char * range, lapack_int * n, float * d,
       float * e, float * vl, float * vu, lapack_int * il, lapack_int * iu,
       lapack_int * m, float * w, lapack_complex_float * z, lapack_int * ldz,
       lapack_int * nzc, lapack_int * isuppz, lapack_logical * tryrac, float *
       work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork,
       lapack_int * info)

LAPACK_cstemr is the deluxe version of the vibe above ✨ she's got everything cstegr has plus nzc and a whole lapack_logical * tryrac — yes bestie, tryrac is a lapack_logical pointer, not a regular int, watch your types 🙈 still bringing work, lwork, iwork, liwork, and info obviously.


   void LAPACK_csteqr (char * compz, lapack_int * n, float * d, float * e,
       lapack_complex_float * z, lapack_int * ldz, float * work, lapack_int *
       info)

LAPACK_csteqr — short, sweet, compz + n + d + e + z + ldz + work + info. sometimes less is more and that's her main character energy 💖


   void LAPACK_csycon (char * uplo, lapack_int * n, const lapack_complex_float
       * a, lapack_int * lda, const lapack_int * ipiv, float * anorm, float *
       rcond, lapack_complex_float * work, lapack_int * info)

LAPACK_csycon slides in with uplo, n, the const a at lda, the const ipiv, and then anorm and rcond as float pointers 👑 work and info round it out. note that a and ipiv are const — she's a reader, not a hater.


   void LAPACK_csycon_3 (char * uplo, lapack_int * n, const
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       e, const lapack_int * ipiv, float * anorm, float * rcond,
       lapack_complex_float * work, lapack_int * info)

the _3 variant, LAPACK_csycon_3 🧚 same energy but now there's a const lapack_complex_float * e wedged in between lda and ipiv. trust, it's there. anorm, rcond, work, info — everything else identical, bestie.


   void LAPACK_csyconv (char * uplo, char * way, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_float * e, lapack_int * info)

LAPACK_csyconv has a char * way and honestly that's such a mood 🌈 uplo, n, a, lda, const ipiv, e, info — and yes, a and e are not const here, she's allowed to write to them. slay.


   void LAPACK_csyequb (char * uplo, lapack_int * n, const lapack_complex_float
       * a, lapack_int * lda, float * s, float * scond, float * amax,
       lapack_complex_float * work, lapack_int * info)

LAPACK_csyequb handing you s, scond, and amax — all three are plain float * 🌸 a is const at lda, work is a lapack_complex_float *, and info is waiting at the end like always.


   void LAPACK_csyr (char * uplo, lapack_int * n, lapack_complex_float * alpha,
       const lapack_complex_float * x, lapack_int * incx, lapack_complex_float
       * a, lapack_int * lda)

LAPACK_csyr is the one who doesn't take an info 💀 look at her! just uplo, n, alpha, const x with incx, a, lda, and she's out. no info, no work, no drama. and honestly? refreshing.


   void LAPACK_csyrfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       af, lapack_int * ldaf, const lapack_int * ipiv, const
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * ferr, float * berr, lapack_complex_float *
       work, float * rwork, lapack_int * info)

LAPACK_csyrfs is the referee of the group 🔥 a/lda, af/ldaf, const ipiv, b/ldb go in, x/ldx comes out, and ferr + berr tell you how it went. she takes both a work (lapack_complex_float *) and an rwork (float *) — two different work flavours, don't mix them up 💅


   void LAPACK_csyrfsx (char * uplo, char * equed, lapack_int * n, lapack_int *
       nrhs, const lapack_complex_float * a, lapack_int * lda, const
       lapack_complex_float * af, lapack_int * ldaf, const lapack_int * ipiv,
       const float * s, const lapack_complex_float * b, lapack_int * ldb,
       lapack_complex_float * x, lapack_int * ldx, float * rcond, float * berr,
       lapack_int * n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
       lapack_int * nparams, float * params, lapack_complex_float * work, float
       * rwork, lapack_int * info)

LAPACK_csyrfsx — the extended cut, the director's version, the one with equed and a const float * s 😭 she's got everything: rcond, berr, n_err_bnds, and then BOTH err_bnds_norm and err_bnds_comp (float * each, naturally), plus nparams and params. plus work, rwork, info. she's giving error-bound realness and we respect it 🎀


   void LAPACK_csysv (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * a, lapack_int * lda, lapack_int * ipiv,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_csysv — the classic 🦋 uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info. no const in sight on a or b, because she's overwriting them and she is not sorry.


   void LAPACK_csysv_aa (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * a, lapack_int * lda, lapack_int * ipiv,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_csysv_aa — literally the same list as csysv, bestie: uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info. the _aa is in the name, that's the whole difference on this page. periodt.


   void LAPACK_csysv_aa_2stage (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * tb,
       lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_csysv_aa_2stage came with TWO pivots, ipiv AND ipiv2 🤯 plus a tb at ltb before them. then b, ldb, work, lwork, info. two-stage queen, two pivot energy, one legend 👑


   void LAPACK_csysv_rk (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * e,
       lapack_int * ipiv, lapack_complex_float * b, lapack_int * ldb,
       lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

LAPACK_csysv_rk sneaks an e in right after lda and before ipiv 🧚 then it's the usual b, ldb, work, lwork, info. keep your eyes on that e, she's small but she's there.


   void LAPACK_csysv_rook (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_float * a, lapack_int * lda, lapack_int * ipiv,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_csysv_rook — same shape as the original csysv: uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info ⭐ different name, same gorgeous argument list.


   void LAPACK_csysvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, const lapack_complex_float * a, lapack_int * lda,
       lapack_complex_float * af, lapack_int * ldaf, lapack_int * ipiv, const
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * rcond, float * ferr, float * berr,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * info)

LAPACK_csysvx starts with char * fact — the first argument, front and center, and she means it 💅 a and b are const, af and x are not, and you're getting rcond, ferr, berr, work, lwork, rwork, info on the way out. the full experience.


   void LAPACK_csysvxx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, lapack_complex_float * a, lapack_int * lda, lapack_complex_float *
       af, lapack_int * ldaf, lapack_int * ipiv, char * equed, float * s,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * x,
       lapack_int * ldx, float * rcond, float * rpvgrw, float * berr,
       lapack_int * n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
       lapack_int * nparams, float * params, lapack_complex_float * work, float
       * rwork, lapack_int * info)

LAPACK_csysvxx is the final boss of the csysv family 😭 fact AND equed as char *, a and b here are not const (unlike her little sister csysvx — read carefully bestie), and she throws in rpvgrw alongside rcond and berr, then the whole n_err_bnds / err_bnds_norm / err_bnds_comp / nparams / params situation, plus work, rwork, info. girl brought the entire group chat. 🔥


   void LAPACK_csyswapr (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, lapack_int * i1, lapack_int * i2)

LAPACK_csyswapr keeps it tight — uplo, n, a, lda, i1, i2, done. no info, no work, no thoughts, head empty, swap complete 🌸


   void LAPACK_csytrf (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_csytrf — uplo, n, a, lda, ipiv, work, lwork, info 🎀 the factory setting, the blueprint, the one everyone else in the csytrf extended universe is built on.


   void LAPACK_csytrf_aa (char * uplo, lapack_int * n, lapack_complex_float *
       a, lapack_int * lda, lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_csytrf_aa — identical: uplo, n, a, lda, ipiv, work, lwork, info. the _aa is doing literally all the heavy lifting in the name department 🦋


   void LAPACK_csytrf_aa_2stage (char * uplo, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * tb,
       lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,
       lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

LAPACK_csytrf_aa_2stage — two-stage, two-pivot, tb at ltb 😤 ipiv and ipiv2 both in the building, plus work, lwork, info. she's not like the other csytrf girls, she brought extra.


   void LAPACK_csytrf_rk (char * uplo, lapack_int * n, lapack_complex_float *
       a, lapack_int * lda, lapack_complex_float * e, lapack_int * ipiv,
       lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

LAPACK_csytrf_rk with the signature e 🧚 sitting right between lda and ipiv where she belongs. work, lwork, info — you know the drill by now, bestie.


   void LAPACK_csytrf_rook (char * uplo, lapack_int * n, lapack_complex_float *
       a, lapack_int * lda, lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_csytrf_rook — uplo, n, a, lda, ipiv, work, lwork, info ⭐ same as base csytrf, different surname, still slaying.


   void LAPACK_csytri (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, const lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * info)

LAPACK_csytri inverts with grace 💖 uplo, n, a, lda, const ipiv (she read it, she didn't change it, respectfully), work, info.


   void LAPACK_csytri2 (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, const lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_csytri2 — the sequel! 🎬 same as csytri but work now has a lwork bestie next to her. iconic evolution.


   void LAPACK_csytri2x (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, const lapack_int * ipiv, lapack_complex_float * work,
       lapack_int * nb, lapack_int * info)

LAPACK_csytri2x says "no lwork for me actually" 🙈 instead there's a lapack_int * nb after work. that's the whole plot twist. uplo, n, a, lda, const ipiv, work, nb, info.


   void LAPACK_csytri_3 (char * uplo, lapack_int * n, lapack_complex_float * a,
       lapack_int * lda, const lapack_complex_float * e, const lapack_int *
       ipiv, lapack_complex_float * work, lapack_int * lwork, lapack_int *
       info)

LAPACK_csytri_3 brings a const lapack_complex_float * e to the party 🫶 it sits after lda and before the const ipiv. then work, lwork, info. note that BOTH e and ipiv are const — she's a perfect gentlewoman.


   void LAPACK_csytrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_float * b, lapack_int * ldb, lapack_int * info)

LAPACK_csytrs solves for you 🌈 const a, const ipiv, and a very not-const b that she's about to rewrite. uplo, n, nrhs, lda, ldb, info — all present, all accounted for.


   void LAPACK_csytrs2 (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * info)

LAPACK_csytrs2 — same as csytrs but she asked for a work array first 💅 honestly, boundaries. we love to see it.


   void LAPACK_csytrs_3 (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       e, const lapack_int * ipiv, lapack_complex_float * b, lapack_int * ldb,
       lapack_int * info)

LAPACK_csytrs_3 with const e and const ipiv both chilling in the middle, and no work in sight 😌 uplo, n, nrhs, a, lda, b, ldb, info — clean, efficient, booked and busy.


   void LAPACK_csytrs_aa (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_float * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_csytrs_aa 👑 const a, const ipiv, then b, ldb, and a work/lwork combo before info. she came prepared with the full toolkit.


   void LAPACK_csytrs_aa_2stage (char * uplo, lapack_int * n, lapack_int *
       nrhs, lapack_complex_float * a, lapack_int * lda, lapack_complex_float *
       tb, lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,
       lapack_complex_float * b, lapack_int * ldb, lapack_int * info)

LAPACK_csytrs_aa_2stage — two-stage to the very end 😤 tb/ltb, ipiv, ipiv2, then b/ldb and info. and notice: a is not const here, and there's no work/lwork at all. different girl, different rules.


   void LAPACK_csytrs_rook (char * uplo, lapack_int * n, lapack_int * nrhs,
       const lapack_complex_float * a, lapack_int * lda, const lapack_int *
       ipiv, lapack_complex_float * b, lapack_int * ldb, lapack_int * info)

LAPACK_csytrs_rook — const a, const ipiv, mutable b, no work 💖 literally csytrs with a different last name and the exact same guest list.


   void LAPACK_ctbcon (char * norm, char * uplo, char * diag, lapack_int * n,
       lapack_int * kd, const lapack_complex_float * ab, lapack_int * ldab,
       float * rcond, lapack_complex_float * work, float * rwork, lapack_int *
       info)

moving into the ctb era and we're starting with THREE char * in a row — norm, uplo, diag 🌟 LAPACK_ctbcon also wants n, kd, const ab at ldab, then hands you rcond, and takes both a work (lapack_complex_float *) and an rwork (float *). plus info. she's thorough and we stan.


   void LAPACK_ctbrfs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * kd, lapack_int * nrhs, const lapack_complex_float * ab,
       lapack_int * ldab, const lapack_complex_float * b, lapack_int * ldb,
       const lapack_complex_float * x, lapack_int * ldx, float * ferr, float *
       berr, lapack_complex_float * work, float * rwork, lapack_int * info)

LAPACK_ctbrfs — three char * again but this time it's uplo, trans, diag 🦋 then n, kd, nrhs, const ab/ldab, const b/ldb, const x/ldx, and out come ferr and berr. work, rwork, info close the show. so many consts, so much respect for your data.


   void LAPACK_ctbtrs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * kd, lapack_int * nrhs, const lapack_complex_float * ab,
       lapack_int * ldab, lapack_complex_float * b, lapack_int * ldb,
       lapack_int * info)

LAPACK_ctbtrs keeps it cute and short 🎀 uplo, trans, diag, n, kd, nrhs, const ab/ldab, b/ldb, info. no work, no rwork, no extra credit — she did the assignment and went home.


   void LAPACK_ctfsm (char * transr, char * side, char * uplo, char * trans,
       char * diag, lapack_int * m, lapack_int * n, lapack_complex_float *
       alpha, const lapack_complex_float * a, lapack_complex_float * b,
       lapack_int * ldb)

FOUR char * in a row, bestie. FOUR. 😭 LAPACK_ctfsm is giving transr, side, uplo, trans, diag and honestly she earned the right. then m, n, alpha, const a, b at ldb, and NO info — she's confident, she doesn't need the feedback.


   void LAPACK_ctftri (char * transr, char * uplo, char * diag, lapack_int * n,
       lapack_complex_float * a, lapack_int * info)

LAPACK_ctftri — two lines, six args, zero notes 🌸 transr, uplo, diag, n, a, info. a minimalist icon.


   void LAPACK_ctfttp (char * transr, char * uplo, lapack_int * n, const
       lapack_complex_float * arf, lapack_complex_float * ap, lapack_int *
       info)

LAPACK_ctfttp — note it's transr, uplo, n (no diag this time!) 🧚 then const arf goes in and ap comes out, with info watching from the corner.


   void LAPACK_ctfttr (char * transr, char * uplo, lapack_int * n, const
       lapack_complex_float * arf, lapack_complex_float * a, lapack_int * lda,
       lapack_int * info)

LAPACK_ctfttr is ctfttp's sibling who insists on an lda 💅 transr, uplo, n, const arf, a, lda, info. same vibe, extra pointer, no regrets.


   void LAPACK_ctgevc (char * side, char * howmny, const lapack_logical *
       select, lapack_int * n, const lapack_complex_float * s, lapack_int *
       lds, const lapack_complex_float * p, lapack_int * ldp,
       lapack_complex_float * vl, lapack_int * ldvl, lapack_complex_float * vr,
       lapack_int * ldvr, lapack_int * mm, lapack_int * m, lapack_complex_float
       * work, float * rwork, lapack_int * info)

and to close this chunk out: LAPACK_ctgevc 🔥⚠️ bestie, take a breath. side, howmny, a const lapack_logical * select, n, then const s/lds and const p/ldp, then vl/ldvl AND vr/ldvr (left and right, both living their truth), then mm and m — yes, TWO different ms, do not confuse them — and finally work, rwork, info. iykyk 💜

more coming, don't go anywhere 🫶

okay we're still deep in the function docs and this stretch is all c-prefixed, all single-precision complex 💅 like, every single one. it's giving "we committed to the bit." every prototype below is the exact signature from the header, char * option args and lapack_int * info and all. slay.

🌸 LAPACK_ctgexc

   void LAPACK_ctgexc (lapack_logical * wantq, lapack_logical * wantz,
       lapack_int * n, lapack_complex_float * a, lapack_int * lda,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * q,
       lapack_int * ldq, lapack_complex_float * z, lapack_int * ldz, lapack_int
       * ifst, lapack_int * ilst, lapack_int * info)

two lapack_logical flags up front (wantq, wantz) deciding whether you even get the q and z matrices, then the a/b pair with their very own lda/ldb, the q/z duo with ldq/ldz, the two index args ifst and ilst, and info closing it out. very "everybody gets a pointer." ✨

💜 LAPACK_ctgsen

   void LAPACK_ctgsen (lapack_int * ijob, lapack_logical * wantq,
       lapack_logical * wantz, const lapack_logical * select, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b,
       lapack_int * ldb, lapack_complex_float * alpha, lapack_complex_float *
       beta, lapack_complex_float * q, lapack_int * ldq, lapack_complex_float *
       z, lapack_int * ldz, lapack_int * m, float * pl, float * pr, float *
       dif, lapack_complex_float * work, lapack_int * lwork, lapack_int *
       iwork, lapack_int * liwork, lapack_int * info)

okay this one ate, honestly — ijob chooses the flavour, wantq/wantz gate the matrices, select is the only const thing in the whole first half (respect), then alpha, beta, q, z, the output m, and the trio pl, pr, dif all as plain float * 🍓 note the two workspaces: work/lwork and iwork/liwork, plus info at the end, always.

🦋 LAPACK_ctgsja

   void LAPACK_ctgsja (char * jobu, char * jobv, char * jobq, lapack_int * m,
       lapack_int * p, lapack_int * n, lapack_int * k, lapack_int * l,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b,
       lapack_int * ldb, float * tola, float * tolb, float * alpha, float *
       beta, lapack_complex_float * u, lapack_int * ldu, lapack_complex_float *
       v, lapack_int * ldv, lapack_complex_float * q, lapack_int * ldq,
       lapack_complex_float * work, lapack_int * ncycle, lapack_int * info)

three whole char * job args — jobu, jobv, jobq — because of course there are three matrices to build. then the dimensional squad m, p, n, k, l, the a/b pair, tolerances tola/tolb, alpha/beta, the outputs u, v, q each with their own ld*, one work array, ncycle, and info. no cap, this is a whole ecosystem. 👑

🎀 LAPACK_ctgsna

   void LAPACK_ctgsna (char * job, char * howmny, const lapack_logical *
       select, lapack_int * n, const lapack_complex_float * a, lapack_int *
       lda, const lapack_complex_float * b, lapack_int * ldb, const
       lapack_complex_float * vl, lapack_int * ldvl, const lapack_complex_float
       * vr, lapack_int * ldvr, float * s, float * dif, lapack_int * mm,
       lapack_int * m, lapack_complex_float * work, lapack_int * lwork,
       lapack_int * iwork, lapack_int * info)

look at all those consts — select, a, b, vl, vr are all read-only, so the compiler has your back 🫶 job and howmny are the classic char * pair, mm goes in, m comes out, s and dif are plain float *, and yes there's work/lwork, iwork, and info.

🔥 LAPACK_ctgsyl

   void LAPACK_ctgsyl (char * trans, lapack_int * ijob, lapack_int * m,
       lapack_int * n, const lapack_complex_float * a, lapack_int * lda, const
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * c,
       lapack_int * ldc, const lapack_complex_float * d, lapack_int * ldd,
       const lapack_complex_float * e, lapack_int * lde, lapack_complex_float *
       f, lapack_int * ldf, float * scale, float * dif, lapack_complex_float *
       work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)

trans plus ijob — two ways to tell it what you want before you even get to the data 😭 then m, n, and five matrices a, b, c, d, e, f... okay six, each chained to its own ld*. c and f are writable, the rest are const. scale and dif both come out as float *, and the usual work/lwork, iwork, info send-off. 💜

⭐ LAPACK_ctpcon

   void LAPACK_ctpcon (char * norm, char * uplo, char * diag, lapack_int * n,
       const lapack_complex_float * ap, float * rcond, lapack_complex_float *
       work, float * rwork, lapack_int * info)

short and sweet for once 💖 three char * args (norm, uplo, diag — the holy trinity of packed triangular routines), n, a const packed array ap, the output rcond as float *, then both a complex work and a real rwork, and info. the packed-storage life chose us.

🌈 LAPACK_ctpmqrt

   void LAPACK_ctpmqrt (char * side, char * trans, lapack_int * m, lapack_int *
       n, lapack_int * k, lapack_int * l, lapack_int * nb, const
       lapack_complex_float * v, lapack_int * ldv, const lapack_complex_float *
       t, lapack_int * ldt, lapack_complex_float * a, lapack_int * lda,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * info)

side and trans (both char *, naturally), then a whole parade of ints — m, n, k, l, nb — before you even reach the arrays 🌸 v and t are const (read-only kings), a and b get written to with lda/ldb, one work, and info to finish. the block size nb is right there front and centre, iykyk.

🧚 LAPACK_ctpqrt

   void LAPACK_ctpqrt (lapack_int * m, lapack_int * n, lapack_int * l,
       lapack_int * nb, lapack_complex_float * a, lapack_int * lda,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * t,
       lapack_int * ldt, lapack_complex_float * work, lapack_int * info)

no char * args at all?? a rarity, we love to see it ✨ just m, n, l, nb, then a, b, t — all writable this time, no const in sight — their ld* buddies, work, and info.

💀 LAPACK_ctpqrt2

   void LAPACK_ctpqrt2 (lapack_int * m, lapack_int * n, lapack_int * l,
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * b,
       lapack_int * ldb, lapack_complex_float * t, lapack_int * ldt, lapack_int
       * info)

the 2 version ✨ spot the difference: no nb, no work. literally that's it, ctpqrt minus two args. minimalism is so in right now. the rest is identical — m, n, l, a/lda, b/ldb, t/ldt, info.

🍓 LAPACK_ctprfb

   void LAPACK_ctprfb (char * side, char * trans, char * direct, char * storev,
       lapack_int * m, lapack_int * n, lapack_int * k, lapack_int * l, const
       lapack_complex_float * v, lapack_int * ldv, const lapack_complex_float *
       t, lapack_int * ldt, lapack_complex_float * a, lapack_int * lda,
       lapack_complex_float * b, lapack_int * ldb, lapack_complex_float * work,
       lapack_int * ldwork)

FOUR char * args — side, trans, direct, storev — a full personality quiz before the math 😭 then m, n, k, l, const v with ldv, const t with ldt, writable a/b with their ld*, and work/ldwork. and guess what — no info. iconic deviation, honestly. 🙈

🫶 LAPACK_ctprfs

   void LAPACK_ctprfs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * nrhs, const lapack_complex_float * ap, const
       lapack_complex_float * b, lapack_int * ldb, const lapack_complex_float *
       x, lapack_int * ldx, float * ferr, float * berr, lapack_complex_float *
       work, float * rwork, lapack_int * info)

uplo/trans/diag back again, n and nrhs, then three const inputs — ap, b, x — with ldb and ldx on the latter two 💜 the error outputs ferr and berr are both float *, followed by complex work and real rwork, then info. the const-correctness here is lowkey aspirational.

👑 LAPACK_ctptri

   void LAPACK_ctptri (char * uplo, char * diag, lapack_int * n,
       lapack_complex_float * ap, lapack_int * info)

five args. FIVE. 🎀 uplo, diag, n, the packed ap (writable — it gets overwritten), and info. after the monster signatures above this feels like a lil snack and i'm obsessed.

🦋 LAPACK_ctptrs

   void LAPACK_ctptrs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * nrhs, const lapack_complex_float * ap, lapack_complex_float
       * b, lapack_int * ldb, lapack_int * info)

three char * options, n, nrhs, const ap, then the writable b with ldb, and info. notice ap is const here but not in ctptri right above — that's the whole difference between solving with it and inverting it, bestie 💅

🌸 LAPACK_ctpttf

   void LAPACK_ctpttf (char * transr, char * uplo, lapack_int * n, const
       lapack_complex_float * ap, lapack_complex_float * arf, lapack_int *
       info)

transr and uplo (yes, transr with the r, not trans — spell it right 😤), n, const ap going in, arf coming out, info. packed ➡️ rectangular full, one array to the other.

⭐ LAPACK_ctpttr

   void LAPACK_ctpttr (char * uplo, lapack_int * n, const lapack_complex_float
       * ap, lapack_complex_float * a, lapack_int * lda, lapack_int * info)

uplo, n, const ap in, a with lda out, info. another packed-to-full glow-up, no transr this time because there's only one direction to go 🫶

💜 LAPACK_ctrcon

   void LAPACK_ctrcon (char * norm, char * uplo, char * diag, lapack_int * n,
       const lapack_complex_float * a, lapack_int * lda, float * rcond,
       lapack_complex_float * work, float * rwork, lapack_int * info)

the full-storage sibling of ctpcon: same norm/uplo/diag trio, but a comes with an lda instead of being packed 🌈 then rcond, complex work, real rwork, info. same energy, different storage.

🔥 LAPACK_ctrevc

   void LAPACK_ctrevc (char * side, char * howmny, const lapack_logical *
       select, lapack_int * n, lapack_complex_float * t, lapack_int * ldt,
       lapack_complex_float * vl, lapack_int * ldvl, lapack_complex_float * vr,
       lapack_int * ldvr, lapack_int * mm, lapack_int * m, lapack_complex_float
       * work, float * rwork, lapack_int * info)

side + howmny + const select, n, then t, vl, vr — all writable, each with an ld* — then mm in, m out, complex work, real rwork, info. the vectors are getting computed, no cap. 💅

🎀 LAPACK_ctrexc

   void LAPACK_ctrexc (char * compq, lapack_int * n, lapack_complex_float * t,
       lapack_int * ldt, lapack_complex_float * q, lapack_int * ldq, lapack_int
       * ifst, lapack_int * ilst, lapack_int * info)

compq (the char * that decides whether q is even touched), n, t/ldt, q/ldq, the two indices ifst/ilst, info. neat, tidy, no rwork in sight. we stan a low-maintenance signature. ✨

🧚 LAPACK_ctrrfs

   void LAPACK_ctrrfs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * nrhs, const lapack_complex_float * a, lapack_int * lda,
       const lapack_complex_float * b, lapack_int * ldb, const
       lapack_complex_float * x, lapack_int * ldx, float * ferr, float * berr,
       lapack_complex_float * work, float * rwork, lapack_int * info)

basically ctprfs but with full storage — uplo/trans/diag, n, nrhs, three const arrays a, b, x each with an ld*, the float * error outputs ferr/berr, complex work, real rwork, info. copy-paste energy but make it full. 🍓

💀 LAPACK_ctrsen

   void LAPACK_ctrsen (char * job, char * compq, const lapack_logical * select,
       lapack_int * n, lapack_complex_float * t, lapack_int * ldt,
       lapack_complex_float * q, lapack_int * ldq, lapack_complex_float * w,
       lapack_int * m, float * s, float * sep, lapack_complex_float * work,
       lapack_int * lwork, lapack_int * info)

job and compq are char *, select is the lone const, then n, t/ldt, q/ldq, the eigenvalue output w, the count m, the two float * condition numbers s and sep, work/lwork, info. only one workspace pair here — no iwork, we're travelling light 🦋

🌈 LAPACK_ctrsna

   void LAPACK_ctrsna (char * job, char * howmny, const lapack_logical *
       select, lapack_int * n, const lapack_complex_float * t, lapack_int *
       ldt, const lapack_complex_float * vl, lapack_int * ldvl, const
       lapack_complex_float * vr, lapack_int * ldvr, float * s, float * sep,
       lapack_int * mm, lapack_int * m, lapack_complex_float * work, lapack_int
       * ldwork, float * rwork, lapack_int * info)

the select-ing sibling: job, howmny, const select, n, then t, vl, vr all const with their ld*, outputs s/sep, mm in and m out, work/ldwork (note: ldwork, not lwork 👀), real rwork, and info.

👑 LAPACK_ctrsyl

   void LAPACK_ctrsyl (char * trana, char * tranb, lapack_int * isgn,
       lapack_int * m, lapack_int * n, const lapack_complex_float * a,
       lapack_int * lda, const lapack_complex_float * b, lapack_int * ldb,
       lapack_complex_float * c, lapack_int * ldc, float * scale, lapack_int *
       info)

two transposes (trana, tranb — one for each matrix, obviously), then isgn, m, n, the two const inputs a and b with lda/ldb, the writable c with ldc, the float * scale, and info. no workspace arrays, no rwork — lean machine ✨

🎀 LAPACK_ctrtri

   void LAPACK_ctrtri (char * uplo, char * diag, lapack_int * n,
       lapack_complex_float * a, lapack_int * lda, lapack_int * info)

six args, that's the whole thing 💖 uplo, diag, n, a, lda, info. the packed version ctptri has one fewer because the leading dimension is implied. love a consistent design.

🫶 LAPACK_ctrtrs

   void LAPACK_ctrtrs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * nrhs, const lapack_complex_float * a, lapack_int * lda,
       lapack_complex_float * b, lapack_int * ldb, lapack_int * info)

uplo, trans, diag, n, nrhs, const a with lda, writable b with ldb, info. the full-storage twin of ctptrs, and yes a is const here too. consistent kings. 👑

🌸 LAPACK_ctrttf

   void LAPACK_ctrttf (char * transr, char * uplo, lapack_int * n, const
       lapack_complex_float * a, lapack_int * lda, lapack_complex_float * arf,
       lapack_int * info)

transr/uplo, n, const a + lda in, arf out, info. full ➡️ rectangular-full. the mirror image of ctpttf, and it's giving symmetry. 🦋

🍓 LAPACK_ctrttp

   void LAPACK_ctrttp (char * uplo, lapack_int * n, const lapack_complex_float
       * a, lapack_int * lda, lapack_complex_float * ap, lapack_int * info)

uplo, n, const a + lda, then the packed output ap, then info. full ➡️ packed. packs it up and sends it off. 🎀

🔥 LAPACK_ctzrzf

   void LAPACK_ctzrzf (lapack_int * m, lapack_int * n, lapack_complex_float *
       a, lapack_int * lda, lapack_complex_float * tau, lapack_complex_float *
       work, lapack_int * lwork, lapack_int * info)

no char * args here, it's a choose-your-own-nothing situation ✨ m, n, a/lda, the output tau, work/lwork, info. clean, no options, just vibes.

💜 LAPACK_cunbdb

   void LAPACK_cunbdb (char * trans, char * signs, lapack_int * m, lapack_int *
       p, lapack_int * q, lapack_complex_float * x11, lapack_int * ldx11,
       lapack_complex_float * x12, lapack_int * ldx12, lapack_complex_float *
       x21, lapack_int * ldx21, lapack_complex_float * x22, lapack_int * ldx22,
       float * theta, float * phi, lapack_complex_float * taup1,
       lapack_complex_float * taup2, lapack_complex_float * tauq1,
       lapack_complex_float * tauq2, lapack_complex_float * work, lapack_int *
       lwork, lapack_int * info)

okay this is THE big one — trans and signs, then m, p, q, then the four quadrants x11, x12, x21, x22 each with their own ldx11/ldx12/ldx21/ldx22 (the naming?? immaculate consistency 😭), the real outputs theta and phi, four taus — taup1, taup2, tauq1, tauq2 — then work/lwork and info. a whole grid, bestie. 🍓

🧚 LAPACK_cuncsd

   void LAPACK_cuncsd (char * jobu1, char * jobu2, char * jobv1t, char *
       jobv2t, char * trans, char * signs, lapack_int * m, lapack_int * p,
       lapack_int * q, lapack_complex_float * x11, lapack_int * ldx11,
       lapack_complex_float * x12, lapack_int * ldx12, lapack_complex_float *
       x21, lapack_int * ldx21, lapack_complex_float * x22, lapack_int * ldx22,
       float * theta, lapack_complex_float * u1, lapack_int * ldu1,
       lapack_complex_float * u2, lapack_int * ldu2, lapack_complex_float *
       v1t, lapack_int * ldv1t, lapack_complex_float * v2t, lapack_int * ldv2t,
       lapack_complex_float * work, lapack_int * lwork, float * rwork,
       lapack_int * lrwork, lapack_int * iwork, lapack_int * info)

FIVE char * option args (jobu1, jobu2, jobv1t, jobv2t, trans, signs — okay that's six, i miscounted, it's six 💀) then m, p, q, the quadrant quartet with all four ldx args, theta, the four outputs u1/u2/v1t/v2t with ldu1/ldu2/ldv1t/ldv2t, and three whole workspaces: work/lwork, rwork/lrwork, and iwork. info at the very end holding it all together. this signature is a masterpiece honestly. 😭

⭐ LAPACK_cuncsd2by1

   void LAPACK_cuncsd2by1 (char * jobu1, char * jobu2, char * jobv1t,
       lapack_int * m, lapack_int * p, lapack_int * q, lapack_complex_float *
       x11, lapack_int * ldx11, lapack_complex_float * x21, lapack_int * ldx21,
       float * theta, lapack_complex_float * u1, lapack_int * ldu1,
       lapack_complex_float * u2, lapack_int * ldu2, lapack_complex_float *
       v1t, lapack_int * ldv1t, lapack_complex_float * work, lapack_int *
       lwork, float * rwork, lapack_int * lrwork, lapack_int * iwork,
       lapack_int * info)

the 2by1 version and look how much shorter it is 💅 only three char * args (jobu1, jobu2, jobv1t), and only two quadrants — x11 and x21 — so just ldx11 and ldx21. still m, p, q, still theta, still u1/u2/v1t with ldu1/ldu2/ldv1t, and still the triple workspace work/lwork, rwork/lrwork, iwork. info closes. fewer pieces, same energy. 🔥

🫶 LAPACK_cungbr

   void LAPACK_cungbr (char * vect, lapack_int * m, lapack_int * n, lapack_int
       * k, lapack_complex_float * a, lapack_int * lda, const
       lapack_complex_float * tau, lapack_complex_float * work, lapack_int *
       lwork, lapack_int * info)

vect picks which thing you're generating, then m, n, k, the in-place a with lda, the const tau (read-only, don't you dare), work/lwork, info. solid middleweight. ✨

🎀 LAPACK_cunghr

   void LAPACK_cunghr (lapack_int * n, lapack_int * ilo, lapack_int * ihi,
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       tau, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

no char * at all — just n, the index pair ilo/ihi, a/lda, const tau, work/lwork, info. nine args of pure purpose. 🌸

💜 LAPACK_cunglq

   void LAPACK_cunglq (lapack_int * m, lapack_int * n, lapack_int * k,
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       tau, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

m, n, k, a/lda, const tau, work/lwork, info. and yes — the header literally puts a blank line after this one, so we're honouring the blank line. 🦋

🌈 LAPACK_cungql

   void LAPACK_cungql (lapack_int * m, lapack_int * n, lapack_int * k,
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       tau, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

hey bestie, it's character-for-character the same signature as cunglq — the only difference is the q vs l in the name 🔥 same m, n, k, a/lda, const tau, work/lwork, info. copy-paste with confidence.

🍓 LAPACK_cungqr

   void LAPACK_cungqr (lapack_int * m, lapack_int * n, lapack_int * k,
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       tau, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

aaaand again 💅 cungqr, same nine args, same order, m, n, k, a/lda, const tau, work/lwork, info. the ung-family really said "one signature, multiple interpretations."

⭐ LAPACK_cungrq

   void LAPACK_cungrq (lapack_int * m, lapack_int * n, lapack_int * k,
       lapack_complex_float * a, lapack_int * lda, const lapack_complex_float *
       tau, lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

last one in this batch and it's the same shape yet again — m, n, k, a/lda, const tau, work/lwork, info ✨ if you learned one of these four you learned all four, and that's the beauty of a well-designed family. 🫶

  • LAPACK_cungtr ✨ — the first of the c-crew, bestie. Signature goes like this:
void LAPACK_cungtr (char * uplo, lapack_int * n, lapack_complex_float * a,
    lapack_int * lda, const lapack_complex_float * tau,
    lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

Look at her. uplo, n, a, lda, tau, work, lwork, info — the whole iconic lineup. 💅

  • LAPACK_cunmbr 🦋 — six string-ish args deep, and honestly it's giving "I have a lot going on but I'm thriving":
void LAPACK_cunmbr (char * vect, char * side, char * trans, lapack_int * m,
    lapack_int * n, lapack_int * k, const lapack_complex_float * a,
    lapack_int * lda, const lapack_complex_float * tau,
    lapack_complex_float * c, lapack_int * ldc,
    lapack_complex_float * work, lapack_int * lwork, lapack_int * info)

vect AND side AND trans? main character energy fr fr 👑

  • LAPACK_cunmhr 🎀 — the unmhr girlie. Same shape as her sisters, side and trans leading the parade, and yes ilo + ihi are in there doing their thing:
void LAPACK_cunmhr (char * side, char * trans, lapack_int * m, lapack_int * n,
    lapack_int * ilo, lapack_int * ihi, const lapack_complex_float * a,
    lapack_int * lda, const lapack_complex_float * tau,
    lapack_complex_float * c, lapack_int * ldc,
    lapack_complex_float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_cunmlq 🌸 — lq hanging off the end of the name like a little bow:
void LAPACK_cunmlq (char * side, char * trans, lapack_int * m, lapack_int * n,
    lapack_int * k, const lapack_complex_float * a, lapack_int * lda,
    const lapack_complex_float * tau, lapack_complex_float * c,
    lapack_int * ldc, lapack_complex_float * work, lapack_int * lwork,
    lapack_int * info)
  • LAPACK_cunmql 💜 — miss ql. Yes she has the exact same parameter list as LAPACK_cunmlq and no I will not be apologising for pointing that out 💀:
void LAPACK_cunmql (char * side, char * trans, lapack_int * m, lapack_int * n,
    lapack_int * k, const lapack_complex_float * a, lapack_int * lda,
    const lapack_complex_float * tau, lapack_complex_float * c,
    lapack_int * ldc, lapack_complex_float * work, lapack_int * lwork,
    lapack_int * info)
  • LAPACK_cunmqr 🔥 — the qr one, arguably the most famous of the cunm family, and she knows it:
void LAPACK_cunmqr (char * side, char * trans, lapack_int * m, lapack_int * n,
    lapack_int * k, const lapack_complex_float * a, lapack_int * lda,
    const lapack_complex_float * tau, lapack_complex_float * c,
    lapack_int * ldc, lapack_complex_float * work, lapack_int * lwork,
    lapack_int * info)
  • LAPACK_cunmrq 🧚 — rq this time. Same crew, same outfit. Slay:
void LAPACK_cunmrq (char * side, char * trans, lapack_int * m, lapack_int * n,
    lapack_int * k, const lapack_complex_float * a, lapack_int * lda,
    const lapack_complex_float * tau, lapack_complex_float * c,
    lapack_int * ldc, lapack_complex_float * work, lapack_int * lwork,
    lapack_int * info)
  • LAPACK_cunmrz 🍓 — okay she's different!! She has BOTH k and l in there, so she ate and left no crumbs:
void LAPACK_cunmrz (char * side, char * trans, lapack_int * m, lapack_int * n,
    lapack_int * k, lapack_int * l, const lapack_complex_float * a,
    lapack_int * lda, const lapack_complex_float * tau,
    lapack_complex_float * c, lapack_int * ldc,
    lapack_complex_float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_cunmtr 🌈 — we're back to the two-char-arg lifestyle: side and uplo and trans, oh my:
void LAPACK_cunmtr (char * side, char * uplo, char * trans, lapack_int * m,
    lapack_int * n, const lapack_complex_float * a, lapack_int * lda,
    const lapack_complex_float * tau, lapack_complex_float * c,
    lapack_int * ldc, lapack_complex_float * work, lapack_int * lwork,
    lapack_int * info)
  • LAPACK_cupgtr ⭐ — no side, no trans, just uplo, n, ap, tau, q, ldq, work, info. Minimalist queen 💅 note the ap (packed!) and the q + ldq combo:
void LAPACK_cupgtr (char * uplo, lapack_int * n,
    const lapack_complex_float * ap, const lapack_complex_float * tau,
    lapack_complex_float * q, lapack_int * ldq,
    lapack_complex_float * work, lapack_int * info)
  • LAPACK_cupmtr 🫶 — and here's cupgtr's extroverted sibling with the full side/uplo/trans trio:
void LAPACK_cupmtr (char * side, char * uplo, char * trans, lapack_int * m,
    lapack_int * n, const lapack_complex_float * ap,
    const lapack_complex_float * tau, lapack_complex_float * c,
    lapack_int * ldc, lapack_complex_float * work, lapack_int * info)

okay we're switching teams — it's d hours now, double precision girlies rise 🙈

  • LAPACK_dbbcsd 💖 — hold on, she is LONG. Like, count-the-arguments long. jobu1, jobu2, jobv1t, jobv2t, trans, then m p q, the theta/phi duo, u1/ldu1, u2/ldu2, v1t/ldv1t, v2t/ldv2t, and then the b-squad: b11d, b11e, b12d, b12e, b21d, b21e, b22d, b22e. Iconic. No notes:
void LAPACK_dbbcsd (char * jobu1, char * jobu2, char * jobv1t, char * jobv2t,
    char * trans, lapack_int * m, lapack_int * p, lapack_int * q,
    double * theta, double * phi, double * u1, lapack_int * ldu1, double * u2,
    lapack_int * ldu2, double * v1t, lapack_int * ldv1t, double * v2t,
    lapack_int * ldv2t, double * b11d, double * b11e, double * b12d,
    double * b12e, double * b21d, double * b21e, double * b22d, double * b22e,
    double * work, lapack_int * lwork, lapack_int * info)
bestie if you're calling this one, count your args twice. trust. 😭
  • LAPACK_dbdsdc 🎀 — uplo + compq, then n, d, e, u/ldu, vt/ldvt, and the chaotic q + iq pair, plus BOTH work and iwork before info:
void LAPACK_dbdsdc (char * uplo, char * compq, lapack_int * n,
    double * d, double * e, double * u, lapack_int * ldu, double * vt,
    lapack_int * ldvt, double * q, lapack_int * iq, double * work,
    lapack_int * iwork, lapack_int * info)

work AND iwork? she brought both bags 💅

  • LAPACK_dbdsqr 💀 — the bdsqr classics: uplo, n, then the trio ncvt, nru, ncc, and the data girlies d, e, vt, ldvt, u, ldu, c, ldc, wrapping up with work + info:
void LAPACK_dbdsqr (char * uplo, lapack_int * n, lapack_int * ncvt,
    lapack_int * nru, lapack_int * ncc, double * d, double * e, double * vt,
    lapack_int * ldvt, double * u, lapack_int * ldu, double * c,
    lapack_int * ldc, double * work, lapack_int * info)
  • LAPACK_dbdsvdx 🦋 — okay range queen!! uplo, jobz, range, n, d, e, vl, vu, il, iu, ns, s, z, ldz, and yes both work and iwork:
void LAPACK_dbdsvdx (char * uplo, char * jobz, char * range, lapack_int * n,
    double * d, double * e, double * vl, double * vu, lapack_int * il,
    lapack_int * iu, lapack_int * ns, double * s, double * z, lapack_int * ldz,
    double * work, lapack_int * iwork, lapack_int * info)

vl, vu, il, iu — the whole bounds situation, we love to see it ✨

  • LAPACK_ddisna 🌸 — short and sweet for once! job, m, n, d, sep, info. That's it. That's the whole girlie. Obsessed with the restraint:
void LAPACK_ddisna (char * job, lapack_int * m, lapack_int * n,
    const double * d, double * sep, lapack_int * info)
  • LAPACK_dgbbrd 🔥 — the gb band chapter begins. vect, m, n, ncc, kl, ku, then ab/ldab, d, e, q/ldq, pt/ldpt, c/ldc, work, info:
void LAPACK_dgbbrd (char * vect, lapack_int * m, lapack_int * n,
    lapack_int * ncc, lapack_int * kl, lapack_int * ku, double * ab,
    lapack_int * ldab, double * d, double * e, double * q, lapack_int * ldq,
    double * pt, lapack_int * ldpt, double * c, lapack_int * ldc,
    double * work, lapack_int * info)
  • LAPACK_dgbcon 💜 — norm, n, kl, ku, ab/ldab, ipiv, anorm, rcond, work, iwork, info. The ipiv girlies are here and they brought iwork:
void LAPACK_dgbcon (char * norm, lapack_int * n, lapack_int * kl,
    lapack_int * ku, const double * ab, lapack_int * ldab,
    const lapack_int * ipiv, double * anorm, double * rcond, double * work,
    lapack_int * iwork, lapack_int * info)
  • LAPACK_dgbequ 🎀 — no job/norm/trans in sight, just m, n, kl, ku, the matrix, then the scaling cuties r, c, rowcnd, colcnd, amax, info:
void LAPACK_dgbequ (lapack_int * m, lapack_int * n, lapack_int * kl,
    lapack_int * ku, const double * ab, lapack_int * ldab, double * r,
    double * c, double * rowcnd, double * colcnd, double * amax,
    lapack_int * info)
  • LAPACK_dgbequb ✨ — literally dgbequ with a b on the end, matching parameter list and all. She's the remix:
void LAPACK_dgbequb (lapack_int * m, lapack_int * n, lapack_int * kl,
    lapack_int * ku, const double * ab, lapack_int * ldab, double * r,
    double * c, double * rowcnd, double * colcnd, double * amax,
    lapack_int * info)
  • LAPACK_dgbrfs 🧚 — the rfs girlies!! trans, n, kl, ku, nrhs, then the ab/afb duo (both with their own ld), ipiv, b/ldb, x/ldx, and the error twins ferr + berr:
void LAPACK_dgbrfs (char * trans, lapack_int * n, lapack_int * kl,
    lapack_int * ku, lapack_int * nrhs, const double * ab, lapack_int * ldab,
    const double * afb, lapack_int * ldafb, const lapack_int * ipiv,
    const double * b, lapack_int * ldb, double * x, lapack_int * ldx,
    double * ferr, double * berr, double * work, lapack_int * iwork,
    lapack_int * info)

ferr and berr bestie duo, we stan 🫶

  • LAPACK_dgbrfsx ⭐ — the x means she's extra and she EARNED it. Same start, but then we get equed, r, c, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork, info. It's giving "I have options and I'm using all of them":
void LAPACK_dgbrfsx (char * trans, char * equed, lapack_int * n,
    lapack_int * kl, lapack_int * ku, lapack_int * nrhs, const double * ab,
    lapack_int * ldab, const double * afb, lapack_int * ldafb,
    const lapack_int * ipiv, const double * r, const double * c,
    const double * b, lapack_int * ldb, double * x, lapack_int * ldx,
    double * rcond, double * berr, lapack_int * n_err_bnds,
    double * err_bnds_norm, double * err_bnds_comp, lapack_int * nparams,
    double * params, double * work, lapack_int * iwork, lapack_int * info)
  • LAPACK_dgbsv 🌈 — the solver, and look how chill she is: n, kl, ku, nrhs, ab/ldab, ipiv, b/ldb, info. No work, no lwork, no drama 💅:
void LAPACK_dgbsv (lapack_int * n, lapack_int * kl, lapack_int * ku,
    lapack_int * nrhs, double * ab, lapack_int * ldab, lapack_int * ipiv,
    double * b, lapack_int * ldb, lapack_int * info)
  • LAPACK_dgbsvx 💖 — the x version said "and I took that personally". fact, trans, n, kl, ku, nrhs, ab/ldab, afb/ldafb, ipiv, equed, r, c, b/ldb, x/ldx, rcond, ferr, berr, work, iwork, info:
void LAPACK_dgbsvx (char * fact, char * trans, lapack_int * n, lapack_int * kl,
    lapack_int * ku, lapack_int * nrhs, double * ab, lapack_int * ldab,
    double * afb, lapack_int * ldafb, lapack_int * ipiv, char * equed,
    double * r, double * c, double * b, lapack_int * ldb, double * x,
    lapack_int * ldx, double * rcond, double * ferr, double * berr,
    double * work, lapack_int * iwork, lapack_int * info)
  • LAPACK_dgbsvxx 👑 — DOUBLE x. DOUBLE. She's the final boss of the gbsv line and she has rpvgrw which nobody else has, plus berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork:
void LAPACK_dgbsvxx (char * fact, char * trans, lapack_int * n,
    lapack_int * kl, lapack_int * ku, lapack_int * nrhs, double * ab,
    lapack_int * ldab, double * afb, lapack_int * ldafb, lapack_int * ipiv,
    char * equed, double * r, double * c, double * b, lapack_int * ldb,
    double * x, lapack_int * ldx, double * rcond, double * rpvgrw,
    double * berr, lapack_int * n_err_bnds, double * err_bnds_norm,
    double * err_bnds_comp, lapack_int * nparams, double * params,
    double * work, lapack_int * iwork, lapack_int * info)
rpvgrw my beloved 😭 she's only here for the xx girlies, iykyk
  • LAPACK_dgbtrf 🍓 — the trf! small cast, big responsibility: m, n, kl, ku, ab, ldab, ipiv, info:
void LAPACK_dgbtrf (lapack_int * m, lapack_int * n, lapack_int * kl,
    lapack_int * ku, double * ab, lapack_int * ldab, lapack_int * ipiv,
    lapack_int * info)
  • LAPACK_dgbtrs 🌸 — trs has trans and no ldab-less nonsense; n, kl, ku, nrhs, ab/ldab, ipiv, b/ldb, info:
void LAPACK_dgbtrs (char * trans, lapack_int * n, lapack_int * kl,
    lapack_int * ku, lapack_int * nrhs, const double * ab, lapack_int * ldab,
    const lapack_int * ipiv, double * b, lapack_int * ldb, lapack_int * info)

moving on to the ge girlies, they're a whole vibe 🦋

  • LAPACK_dgebak 🎀 — job, side, n, ilo, ihi, scale, m, v/ldv, info. The balancing-adjacent family starts here and yes ilo+ihi are back:
void LAPACK_dgebak (char * job, char * side, lapack_int * n, lapack_int * ilo,
    lapack_int * ihi, const double * scale, lapack_int * m, double * v,
    lapack_int * ldv, lapack_int * info)
  • LAPACK_dgebal 💜 — same job, ilo, ihi, scale energy but she works on a/lda directly and has no m, no v, no ldv:
void LAPACK_dgebal (char * job, lapack_int * n, double * a, lapack_int * lda,
    lapack_int * ilo, lapack_int * ihi, double * scale, lapack_int * info)
  • LAPACK_dgebrd 🔥 — brd girlie: m, n, a/lda, d, e, and the iconic tauq + taup double act, then work/lwork, info:
void LAPACK_dgebrd (lapack_int * m, lapack_int * n, double * a,
    lapack_int * lda, double * d, double * e, double * tauq, double * taup,
    double * work, lapack_int * lwork, lapack_int * info)

tauq and taup must be protected at all costs 🫶

  • LAPACK_dgecon 💀 — norm, n, a/lda, anorm, rcond, work, iwork, info. anorm and rcond together again, and yes iwork came along:
void LAPACK_dgecon (char * norm, lapack_int * n, const double * a,
    lapack_int * lda, double * anorm, double * rcond, double * work,
    lapack_int * iwork, lapack_int * info)
  • LAPACK_dgeequ ✨ — m, n, a/lda, r, c, rowcnd, colcnd, amax, info. Equilibration crew, no job, no work, just vibes:
void LAPACK_dgeequ (lapack_int * m, lapack_int * n, const double * a,
    lapack_int * lda, double * r, double * c, double * rowcnd,
    double * colcnd, double * amax, lapack_int * info)
  • LAPACK_dgeequb 🌈 — and the b remix, identical parameter list, no notes:
void LAPACK_dgeequb (lapack_int * m, lapack_int * n, const double * a,
    lapack_int * lda, double * r, double * c, double * rowcnd,
    double * colcnd, double * amax, lapack_int * info)
  • LAPACK_dgees ⭐ — okay she's fancy!! jobvs, sort, and a whole LAPACK_D_SELECT2 select callback in the middle, then n, a/lda, sdim, wr, wi, vs/ldvs, work/lwork, and bwork (a lapack_logical *, note the type!) before info:
void LAPACK_dgees (char * jobvs, char * sort, LAPACK_D_SELECT2 select,
    lapack_int * n, double * a, lapack_int * lda, lapack_int * sdim,
    double * wr, double * wi, double * vs, lapack_int * ldvs, double * work,
    lapack_int * lwork, lapack_logical * bwork, lapack_int * info)

callback + bwork? she's not like other routines 💅

  • LAPACK_dgeesx 💖 — dgees but x, so add sense, rconde, rcondv, and both work/lwork AND iwork/liwork. Look at her go:
void LAPACK_dgeesx (char * jobvs, char * sort, LAPACK_D_SELECT2 select,
    char * sense, lapack_int * n, double * a, lapack_int * lda,
    lapack_int * sdim, double * wr, double * wi, double * vs, lapack_int * ldvs,
    double * rconde, double * rcondv, double * work, lapack_int * lwork,
    lapack_int * iwork, lapack_int * liwork, lapack_logical * bwork,
    lapack_int * info)
  • LAPACK_dgeev 🧚 — the celebrity. jobvl, jobvr, n, a/lda, wr, wi, vl/ldvl, vr/ldvr, work/lwork, info. Left AND right vectors, she's ambidextrous:
void LAPACK_dgeev (char * jobvl, char * jobvr, lapack_int * n, double * a,
    lapack_int * lda, double * wr, double * wi, double * vl, lapack_int * ldvl,
    double * vr, lapack_int * ldvr, double * work, lapack_int * lwork,
    lapack_int * info)
  • LAPACK_dgeevx 🔥 — the extended cut, and there's a LOT: balanc up front, jobvl, jobvr, sense, n, a/lda, wr, wi, vl/ldvl, vr/ldvr, ilo, ihi, scale, abnrm, rconde, rcondv, work/lwork, iwork, info:
void LAPACK_dgeevx (char * balanc, char * jobvl, char * jobvr, char * sense,
    lapack_int * n, double * a, lapack_int * lda, double * wr, double * wi,
    double * vl, lapack_int * ldvl, double * vr, lapack_int * ldvr,
    lapack_int * ilo, lapack_int * ihi, double * scale, double * abnrm,
    double * rconde, double * rcondv, double * work, lapack_int * lwork,
    lapack_int * iwork, lapack_int * info)

not abnrm AND scale AND ilo/ihi in one signature 😭 she contains multitudes

  • LAPACK_dgehrd 🎀 — n, ilo, ihi, a/lda, tau, work/lwork, info. Short, sweet, tau-having:
void LAPACK_dgehrd (lapack_int * n, lapack_int * ilo, lapack_int * ihi,
    double * a, lapack_int * lda, double * tau, double * work,
    lapack_int * lwork, lapack_int * info)
  • LAPACK_dgejsv 👑 — the job-heavy one!! FIVE job args (joba, jobu, jobv, jobr, jobt, jobp — okay six, I miscounted, that's literally six 💀), then m, n, a/lda, sva, u/ldu, v/ldv, work/lwork, iwork, info:
void LAPACK_dgejsv (char * joba, char * jobu, char * jobv, char * jobr,
    char * jobt, char * jobp, lapack_int * m, lapack_int * n, double * a,
    lapack_int * lda, double * sva, double * u, lapack_int * ldu, double * v,
    lapack_int * ldv, double * work, lapack_int * lwork, lapack_int * iwork,
    lapack_int * info)

six char args before you even get to the numbers. respecting the hustle 🫡

  • LAPACK_dgelq 🌸 — LQ era begins! m, n, a/lda, t, tsize, work/lwork, info. Note tsize — she's special:
void LAPACK_dgelq (lapack_int * m, lapack_int * n, double * a,
    lapack_int * lda, double * t, lapack_int * tsize, double * work,
    lapack_int * lwork, lapack_int * info)
  • LAPACK_dgelq2 🦋 — the 2 version, no t/tsize, back to the classic tau:
void LAPACK_dgelq2 (lapack_int * m, lapack_int * n, double * a,
    lapack_int * lda, double * tau, double * work, lapack_int * info)
  • LAPACK_dgelqf 💜 — and the f!! m, n, a/lda, tau, work/lwork, info. She's got the lwork that dgelq2 doesn't, periodt:
void LAPACK_dgelqf (lapack_int * m, lapack_int * n, double * a,
    lapack_int * lda, double * tau, double * work, lapack_int * lwork,
    lapack_int * info)

and that's where this part wraps, bestie — the gelq fam is only just getting started and there is SO much more d-crew to go 🌟

okay so quick vibe check before we dive in, bestie: this stretch of the page is just declarations. No prose, no lore, no "returns 0 on success" essay — just the raw signatures, one after another, like a receipts folder. And that's honestly fine!! because every single one of them is void, every single one of them takes pointers (yes, even the scalars, we don't make the rules), and the d up front means double precision, periodt. 💅

the least-squares lineup — four ways to solve the same "this system has too many equations and not enough answers" situation, and the page gives you zero hints about which to pick, so I'm just gonna hand you the signatures with love 🫶

void LAPACK_dgels (char * trans, lapack_int * m, lapack_int * n, lapack_int
    * nrhs, double * a, lapack_int * lda, double * b, lapack_int * ldb,
    double * work, lapack_int * lwork, lapack_int * info)
void LAPACK_dgelsd (lapack_int * m, lapack_int * n, lapack_int * nrhs,
    double * a, lapack_int * lda, double * b, lapack_int * ldb, double * s,
    double * rcond, lapack_int * rank, double * work, lapack_int * lwork,
    lapack_int * iwork, lapack_int * info)
void LAPACK_dgelss (lapack_int * m, lapack_int * n, lapack_int * nrhs,
    double * a, lapack_int * lda, double * b, lapack_int * ldb, double * s,
    double * rcond, lapack_int * rank, double * work, lapack_int * lwork,
    lapack_int * info)
void LAPACK_dgelsy (lapack_int * m, lapack_int * n, lapack_int * nrhs,
    double * a, lapack_int * lda, double * b, lapack_int * ldb, lapack_int *
    jpvt, double * rcond, lapack_int * rank, double * work, lapack_int *
    lwork, lapack_int * info)

note how dgelsy is the only one of the four rocking a jpvt and still no iwork, while dgelsd is out here with iwork but no jpvt — they're all main characters in different ways, no cap 😭


the implicit-Q crew — gemlq, gemqr, gemqrt, and the g...qlf. Same side/trans energy, and every single one of them has a tsize. Watch the const land on a and t and only a and t — the page is very particular about this, and so am I ✨

void LAPACK_dgemlq (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * k, const double * a, lapack_int * lda, const double * t,
    lapack_int * tsize, double * c, lapack_int * ldc, double * work,
    lapack_int * lwork, lapack_int * info)
void LAPACK_dgemqr (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * k, const double * a, lapack_int * lda, const double * t,
    lapack_int * tsize, double * c, lapack_int * ldc, double * work,
    lapack_int * lwork, lapack_int * info)
void LAPACK_dgemqrt (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * k, lapack_int * nb, const double * v, lapack_int * ldv,
    const double * t, lapack_int * ldt, double * c, lapack_int * ldc, double
    * work, lapack_int * info)
bestie, dgemqrt brought nb and swapped a for v and renamed the T-array as ldt instead of tsize. it's giving "I'm the blocky sibling and I dress differently." 🔥
void LAPACK_dgeqlf (lapack_int * m, lapack_int * n, double * a, lapack_int *
    lda, double * tau, double * work, lapack_int * lwork, lapack_int * info)

the QR house party 💖 every factorization flavour, all at once, all void, all with info waiting at the end like the last person to leave the group chat.

void LAPACK_dgeqp3 (lapack_int * m, lapack_int * n, double * a, lapack_int *
    lda, lapack_int * jpvt, double * tau, double * work, lapack_int * lwork,
    lapack_int * info)
void LAPACK_dgeqpf (lapack_int * m, lapack_int * n, double * a, lapack_int *
    lda, lapack_int * jpvt, double * tau, double * work, lapack_int * info)

(see how dgeqpf has no lwork? iconique. different build, different rules. 💅)

void LAPACK_dgeqr (lapack_int * m, lapack_int * n, double * a, lapack_int *
    lda, double * t, lapack_int * tsize, double * work, lapack_int * lwork,
    lapack_int * info)
void LAPACK_dgeqr2 (lapack_int * m, lapack_int * n, double * a, lapack_int *
    lda, double * tau, double * work, lapack_int * info)
void LAPACK_dgeqrf (lapack_int * m, lapack_int * n, double * a, lapack_int *
    lda, double * tau, double * work, lapack_int * lwork, lapack_int * info)
void LAPACK_dgeqrfp (lapack_int * m, lapack_int * n, double * a, lapack_int
    * lda, double * tau, double * work, lapack_int * lwork, lapack_int *
    info)
void LAPACK_dgeqrt (lapack_int * m, lapack_int * n, lapack_int * nb, double
    * a, lapack_int * lda, double * t, lapack_int * ldt, double * work,
    lapack_int * info)
void LAPACK_dgeqrt2 (lapack_int * m, lapack_int * n, double * a, lapack_int
    * lda, double * t, lapack_int * ldt, lapack_int * info)
void LAPACK_dgeqrt3 (lapack_int * m, lapack_int * n, double * a, lapack_int
    * lda, double * t, lapack_int * ldt, lapack_int * info)

dgeqrt2 and dgeqrt3 are literally identical signatures and I need you to know I clocked that immediately 👀 (the page lists them separately, so we list them separately — that's the whole deal we made.)


the refinement girlies — dgerfs and dgerfsx. dgerfsx is the deluxe version; the way it has equed, r, c, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, and params… she's doing the most and honestly? ate. 🌸

void LAPACK_dgerfs (char * trans, lapack_int * n, lapack_int * nrhs, const
    double * a, lapack_int * lda, const double * af, lapack_int * ldaf,
    const lapack_int * ipiv, const double * b, lapack_int * ldb, double * x,
    lapack_int * ldx, double * ferr, double * berr, double * work,
    lapack_int * iwork, lapack_int * info)
void LAPACK_dgerfsx (char * trans, char * equed, lapack_int * n, lapack_int
    * nrhs, const double * a, lapack_int * lda, const double * af,
    lapack_int * ldaf, const lapack_int * ipiv, const double * r, const
    double * c, const double * b, lapack_int * ldb, double * x, lapack_int *
    ldx, double * rcond, double * berr, lapack_int * n_err_bnds, double *
    err_bnds_norm, double * err_bnds_comp, lapack_int * nparams, double *
    params, double * work, lapack_int * iwork, lapack_int * info)

and one more RQ for the road:

void LAPACK_dgerqf (lapack_int * m, lapack_int * n, double * a, lapack_int *
    lda, double * tau, double * work, lapack_int * lwork, lapack_int * info)

the singular value situation 🔥 SVD is having a moment — dgesdd, dgesvd, dgesvdx, dgesvj. jobz vs jobu/jobvt is the kind of detail that separates the good from the great, and dgesvdx just keeps going with range, vl, vu, il, iu, ns.

void LAPACK_dgesdd (char * jobz, lapack_int * m, lapack_int * n, double * a,
    lapack_int * lda, double * s, double * u, lapack_int * ldu, double * vt,
    lapack_int * ldvt, double * work, lapack_int * lwork, lapack_int *
    iwork, lapack_int * info)
void LAPACK_dgesv (lapack_int * n, lapack_int * nrhs, double * a, lapack_int
    * lda, lapack_int * ipiv, double * b, lapack_int * ldb, lapack_int *
    info)

(no lwork on dgesv, bestie. that's not a typo on my end — it's literally just not there. 🙈)

void LAPACK_dgesvd (char * jobu, char * jobvt, lapack_int * m, lapack_int *
    n, double * a, lapack_int * lda, double * s, double * u, lapack_int *
    ldu, double * vt, lapack_int * ldvt, double * work, lapack_int * lwork,
    lapack_int * info)
void LAPACK_dgesvdx (char * jobu, char * jobvt, char * range, lapack_int *
    m, lapack_int * n, double * a, lapack_int * lda, double * vl, double *
    vu, lapack_int * il, lapack_int * iu, lapack_int * ns, double * s,
    double * u, lapack_int * ldu, double * vt, lapack_int * ldvt, double *
    work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)
void LAPACK_dgesvj (char * joba, char * jobu, char * jobv, lapack_int * m,
    lapack_int * n, double * a, lapack_int * lda, double * sva, lapack_int *
    mv, double * v, lapack_int * ldv, double * work, lapack_int * lwork,
    lapack_int * info)

the expert-mode solvers — same solve, but with receipts. dgesvx gives you rcond, ferr, berr; dgesvxx gives you all of that plus rpvgrw and the whole error-bound apparatus. they are not the same, bestie, do not mix them up 🎀

void LAPACK_dgesvx (char * fact, char * trans, lapack_int * n, lapack_int *
    nrhs, double * a, lapack_int * lda, double * af, lapack_int * ldaf,
    lapack_int * ipiv, char * equed, double * r, double * c, double * b,
    lapack_int * ldb, double * x, lapack_int * ldx, double * rcond, double *
    ferr, double * berr, double * work, lapack_int * iwork, lapack_int *
    info)
void LAPACK_dgesvxx (char * fact, char * trans, lapack_int * n, lapack_int *
    nrhs, double * a, lapack_int * lda, double * af, lapack_int * ldaf,
    lapack_int * ipiv, char * equed, double * r, double * c, double * b,
    lapack_int * ldb, double * x, lapack_int * ldx, double * rcond, double *
    rpvgrw, double * berr, lapack_int * n_err_bnds, double * err_bnds_norm,
    double * err_bnds_comp, lapack_int * nparams, double * params, double *
    work, lapack_int * iwork, lapack_int * info)

the LU gang — factorization on lock. dgetf2, dgetrf, dgetrf2 all share that m, n, a, lda, ipiv, info shape (no lwork in sight, which lowkey makes them the low-maintenance friends of the group 🦋).

void LAPACK_dgetf2 (lapack_int * m, lapack_int * n, double * a, lapack_int *
    lda, lapack_int * ipiv, lapack_int * info)
void LAPACK_dgetrf (lapack_int * m, lapack_int * n, double * a, lapack_int *
    lda, lapack_int * ipiv, lapack_int * info)
void LAPACK_dgetrf2 (lapack_int * m, lapack_int * n, double * a, lapack_int
    * lda, lapack_int * ipiv, lapack_int * info)
void LAPACK_dgetri (lapack_int * n, double * a, lapack_int * lda, const
    lapack_int * ipiv, double * work, lapack_int * lwork, lapack_int * info)

dgetri is the only one here that takes n alone instead of m and n — and yes it's const lapack_int * ipiv while the factorizers get it non-const. it's giving "I only read, I don't write." ⭐

void LAPACK_dgetrs (char * trans, lapack_int * n, lapack_int * nrhs, const
    double * a, lapack_int * lda, const lapack_int * ipiv, double * b,
    lapack_int * ldb, lapack_int * info)
void LAPACK_dgetsls (char * trans, lapack_int * m, lapack_int * n,
    lapack_int * nrhs, double * a, lapack_int * lda, double * b, lapack_int
    * ldb, double * work, lapack_int * lwork, lapack_int * info)

generalized eigenvalue hours 👑 this is where the signatures go feral — dggesx alone is rocking rconde, rcondv, iwork, liwork, bwork, and a LAPACK_D_SELECT3 function pointer. note that dgges and dgges3 are signature-twins, and dggev/dggev3 are too. the page lists all of them, so we're listing all of them, periodt.

void LAPACK_dggbak (char * job, char * side, lapack_int * n, lapack_int *
    ilo, lapack_int * ihi, const double * lscale, const double * rscale,
    lapack_int * m, double * v, lapack_int * ldv, lapack_int * info)
void LAPACK_dggbal (char * job, lapack_int * n, double * a, lapack_int *
    lda, double * b, lapack_int * ldb, lapack_int * ilo, lapack_int * ihi,
    double * lscale, double * rscale, double * work, lapack_int * info)

(spot the difference: dggbak takes lscale/rscale as const double *, dggbal takes them as plain double *. tiny, crucial, do not get it twisted 💜)

void LAPACK_dgges (char * jobvsl, char * jobvsr, char * sort,
    LAPACK_D_SELECT3 selctg, lapack_int * n, double * a, lapack_int * lda,
    double * b, lapack_int * ldb, lapack_int * sdim, double * alphar, double
    * alphai, double * beta, double * vsl, lapack_int * ldvsl, double * vsr,
    lapack_int * ldvsr, double * work, lapack_int * lwork, lapack_logical *
    bwork, lapack_int * info)
void LAPACK_dgges3 (char * jobvsl, char * jobvsr, char * sort,
    LAPACK_D_SELECT3 selctg, lapack_int * n, double * a, lapack_int * lda,
    double * b, lapack_int * ldb, lapack_int * sdim, double * alphar, double
    * alphai, double * beta, double * vsl, lapack_int * ldvsl, double * vsr,
    lapack_int * ldvsr, double * work, lapack_int * lwork, lapack_logical *
    bwork, lapack_int * info)
void LAPACK_dggesx (char * jobvsl, char * jobvsr, char * sort,
    LAPACK_D_SELECT3 selctg, char * sense, lapack_int * n, double * a,
    lapack_int * lda, double * b, lapack_int * ldb, lapack_int * sdim,
    double * alphar, double * alphai, double * beta, double * vsl,
    lapack_int * ldvsl, double * vsr, lapack_int * ldvsr, double * rconde,
    double * rcondv, double * work, lapack_int * lwork, lapack_int * iwork,
    lapack_int * liwork, lapack_logical * bwork, lapack_int * info)
void LAPACK_dggev (char * jobvl, char * jobvr, lapack_int * n, double * a,
    lapack_int * lda, double * b, lapack_int * ldb, double * alphar, double
    * alphai, double * beta, double * vl, lapack_int * ldvl, double * vr,
    lapack_int * ldvr, double * work, lapack_int * lwork, lapack_int * info)
void LAPACK_dggev3 (char * jobvl, char * jobvr, lapack_int * n, double * a,
    lapack_int * lda, double * b, lapack_int * ldb, double * alphar, double
    * alphai, double * beta, double * vl, lapack_int * ldvl, double * vr,
    lapack_int * ldvr, double * work, lapack_int * lwork, lapack_int * info)

k that's this batch!! ✨ forty signatures, zero skipped, every lapack_int * and const exactly where the page put it. more is absolutely coming, so don't wander off 💖

Okay so we're still deep in the LAPACK_* prototype wall, and honestly? This is the part where the generalized eigenvalue / generalized SVD girlies live. Grab a strawberry drink 🍓 and let's go.

void LAPACK_dggevx (char * balanc, char * jobvl, char * jobvr, char * sense,
    lapack_int * n, double * a, lapack_int * lda, double * b, lapack_int *
    ldb, double * alphar, double * alphai, double * beta, double * vl,
    lapack_int * ldvl, double * vr, lapack_int * ldvr, lapack_int * ilo,
    lapack_int * ihi, double * lscale, double * rscale, double * abnrm,
    double * bbnrm, double * rconde, double * rcondv, double * work,
    lapack_int * lwork, lapack_int * iwork, lapack_logical * bwork,
    lapack_int * info)

The fully-loaded generalized eigenvalue solver — balancing, left vectors, right vectors, condition numbers, the whole aesthetic. She has twenty-eight arguments and she's not sorry.

void LAPACK_dggglm (lapack_int * n, lapack_int * m, lapack_int * p, double *
    a, lapack_int * lda, double * b, lapack_int * ldb, double * d, double *
    x, double * y, double * work, lapack_int * lwork, lapack_int * info)

Generalized linear regression, GLM model vibes. Solves the least-squares situation with a, b, d and hands you back x and y. It's giving ✨constrained minimum norm✨.

void LAPACK_dgghd3 (char * compq, char * compz, lapack_int * n, lapack_int *
    ilo, lapack_int * ihi, double * a, lapack_int * lda, double * b,
    lapack_int * ldb, double * q, lapack_int * ldq, double * z, lapack_int *
    ldz, double * work, lapack_int * lwork, lapack_int * info)

The blocked version of the QZ reduction — takes a matrix pair (a, b) down to Hessenberg-triangular form. dgghrd but make it performance. 🔥

void LAPACK_dgghrd (char * compq, char * compz, lapack_int * n, lapack_int *
    ilo, lapack_int * ihi, double * a, lapack_int * lda, double * b,
    lapack_int * ldb, double * q, lapack_int * ldq, double * z, lapack_int *
    ldz, lapack_int * info)

The unblocked original — same Hessenberg-triangular reduction, fewer arguments than dgghd3, no work/lwork at all. Classic, lowkey iconic.

void LAPACK_dgglse (lapack_int * m, lapack_int * n, lapack_int * p, double *
    a, lapack_int * lda, double * b, lapack_int * ldb, double * c, double *
    d, double * x, double * work, lapack_int * lwork, lapack_int * info)

LSE = least squares with equality constraints. You give her a, b, c, d; she gives you x. Constraints? Handled. 💅

void LAPACK_dggqrf (lapack_int * n, lapack_int * m, lapack_int * p, double *
    a, lapack_int * lda, double * taua, double * b, lapack_int * ldb, double
    * taub, double * work, lapack_int * lwork, lapack_int * info)

Generalized QR factorization — factors the pair into Q and R pieces, spits out two sets of reflectors (taua, taub).

void LAPACK_dggrqf (lapack_int * m, lapack_int * p, lapack_int * n, double *
    a, lapack_int * lda, double * taua, double * b, lapack_int * ldb, double
    * taub, double * work, lapack_int * lwork, lapack_int * info)

The RQ sibling 🫶 — same idea as dggqrf, but the factorization goes the other way. Note the argument order shifted (m, p, n), so don't just copy-paste your call, bestie.

void LAPACK_dggsvd (char * jobu, char * jobv, char * jobq, lapack_int * m,
    lapack_int * n, lapack_int * p, lapack_int * k, lapack_int * l, double *
    a, lapack_int * lda, double * b, lapack_int * ldb, double * alpha,
    double * beta, double * u, lapack_int * ldu, double * v, lapack_int *
    ldv, double * q, lapack_int * ldq, double * work, lapack_int * iwork,
    lapack_int * info)

Generalized SVD, the classic. k and l come back as outputs telling you the structure, and you get alpha, beta, u, v, q. It's a whole production. 🎀

void LAPACK_dggsvd3 (char * jobu, char * jobv, char * jobq, lapack_int * m,
    lapack_int * n, lapack_int * p, lapack_int * k, lapack_int * l, double *
    a, lapack_int * lda, double * b, lapack_int * ldb, double * alpha,
    double * beta, double * u, lapack_int * ldu, double * v, lapack_int *
    ldv, double * q, lapack_int * ldq, double * work, lapack_int * lwork,
    lapack_int * iwork, lapack_int * info)

dggsvd but glow-up edition ✨ — the only difference in the signature is she takes lwork too. Blocked, faster, same outputs. Note the 3 in the name, iykyk.

void LAPACK_dggsvp (char * jobu, char * jobv, char * jobq, lapack_int * m,
    lapack_int * p, lapack_int * n, double * a, lapack_int * lda, double *
    b, lapack_int * ldb, double * tola, double * tolb, lapack_int * k,
    lapack_int * l, double * u, lapack_int * ldu, double * v, lapack_int *
    ldv, double * q, lapack_int * ldq, lapack_int * iwork, double * tau,
    double * work, lapack_int * info)

The preprocessing step 🧚 — reduces (a, b) so the generalized SVD actually behaves. Tolerances tola and tolb decide what counts as "basically zero" for each matrix.

void LAPACK_dggsvp3 (char * jobu, char * jobv, char * jobq, lapack_int * m,
    lapack_int * p, lapack_int * n, double * a, lapack_int * lda, double *
    b, lapack_int * ldb, double * tola, double * tolb, lapack_int * k,
    lapack_int * l, double * u, lapack_int * ldu, double * v, lapack_int *
    ldv, double * q, lapack_int * ldq, lapack_int * iwork, double * tau,
    double * work, lapack_int * lwork, lapack_int * info)

Same as dggsvp but with the extra lwork slot. Blocked version, three at the end, you know the drill. 🔁


Now we pivot into the tridiagonal zone 🦋 — tridiagonal matrices are basically the low-maintenance friend who only needs three diagonals.

void LAPACK_dgtcon (char * norm, lapack_int * n, const double * dl, const
    double * d, const double * du, const double * du2, const lapack_int *
    ipiv, double * anorm, double * rcond, double * work, lapack_int * iwork,
    lapack_int * info)

Condition number estimator for a tridiagonal matrix in its factored form — dl, d, du, du2, ipiv, exactly what dgttrf handed you. Notice du2 and ipiv are const here, because she's only reading. 👑

void LAPACK_dgtrfs (char * trans, lapack_int * n, lapack_int * nrhs, const
    double * dl, const double * d, const double * du, const double * dlf,
    const double * df, const double * duf, const double * du2, const
    lapack_int * ipiv, const double * b, lapack_int * ldb, double * x,
    lapack_int * ldx, double * ferr, double * berr, double * work,
    lapack_int * iwork, lapack_int * info)

Refines a tridiagonal solution and reports error bounds — ferr (forward) and berr (backward). Two copies of the data: the original (dl, d, du) and the factored one (dlf, df, duf, du2, ipiv). Very "I brought a backup of my backup". 🫶

void LAPACK_dgtsv (lapack_int * n, lapack_int * nrhs, double * dl, double *
    d, double * du, double * b, lapack_int * ldb, lapack_int * info)

The easy one! Solves A*X = B for tridiagonal A in one call. No lwork, no drama, just vibes. 🌸

void LAPACK_dgtsvx (char * fact, char * trans, lapack_int * n, lapack_int *
    nrhs, const double * dl, const double * d, const double * du, double *
    dlf, double * df, double * duf, double * du2, lapack_int * ipiv, const
    double * b, lapack_int * ldb, double * x, lapack_int * ldx, double *
    rcond, double * ferr, double * berr, double * work, lapack_int * iwork,
    lapack_int * info)

The expert-mode version of dgtsv — you choose with fact whether the factorization is already done, plus you get rcond, ferr, and berr back. She's doing the most and honestly? Slay. 💅

void LAPACK_dgttrf (lapack_int * n, double * dl, double * d, double * du,
    double * du2, lapack_int * ipiv, lapack_int * info)

Factors the tridiagonal matrix in place — lu-style — and fills in that extra du2 diagonal plus the pivot array ipiv. Then dgttrs can use it over and over. Efficiency queen. ⭐

void LAPACK_dgttrs (char * trans, lapack_int * n, lapack_int * nrhs, const
    double * dl, const double * d, const double * du, const double * du2,
    const lapack_int * ipiv, double * b, lapack_int * ldb, lapack_int *
    info)

Solves using the output of dgttrf. Look at all those const qualifiers on the inputs — she is strictly not touching your factorization. 🙈


Hessenberg time, aka the section where all the names start with h for no reason other than chaos.

void LAPACK_dhgeqz (char * job, char * compq, char * compz, lapack_int * n,
    lapack_int * ilo, lapack_int * ihi, double * h, lapack_int * ldh, double
    * t, lapack_int * ldt, double * alphar, double * alphai, double * beta,
    double * q, lapack_int * ldq, double * z, lapack_int * ldz, double *
    work, lapack_int * lwork, lapack_int * info)

The QZ step — takes the Hessenberg-triangular pair (h, t) and hands you back generalized eigenvalues as alphar, alphai, beta. Complex eigenvalues come out as real/imag pairs, hence the split. 😭

void LAPACK_dhsein (char * job, char * eigsrc, char * initv, lapack_logical
    * select, lapack_int * n, const double * h, lapack_int * ldh, double *
    wr, const double * wi, double * vl, lapack_int * ldvl, double * vr,
    lapack_int * ldvr, lapack_int * mm, lapack_int * m, double * work,
    lapack_int * ifaill, lapack_int * ifailr, lapack_int * info)

Inverse iteration for Hessenberg eigenvectors. select picks which ones you actually want (lapack_logical array, so a real boolean mask), mm is the max you asked for, m is how many you actually got. And if something couldn't converge? She tells you via ifaill and ifailr. 💀

void LAPACK_dhseqr (char * job, char * compz, lapack_int * n, lapack_int *
    ilo, lapack_int * ihi, double * h, lapack_int * ldh, double * wr, double
    * wi, double * z, lapack_int * ldz, double * work, lapack_int * lwork,
    lapack_int * info)

The Hessenberg QR algorithm itself — gives you wr and wi (real and imaginary parts of the eigenvalues), and optionally accumulates z. The main character of the Hessenberg saga. 👑


LAPACK's internal helper girlies 🌈 — these are the utility routines that do the actual heavy lifting behind the scenes.

void LAPACK_dlacn2 (lapack_int * n, double * v, double * x, lapack_int *
    isgn, double * est, lapack_int * kase, lapack_int * isave)

1-norm condition estimator via reverse communication. kase and isave mean she returns to you mid-computation and you've got to call her back — it's a whole conversation, not a one-night stand. 🫶

void LAPACK_dlacpy (char * uplo, lapack_int * m, lapack_int * n, const
    double * a, lapack_int * lda, double * b, lapack_int * ldb)

Copies a matrix, or just its upper/lower triangle depending on uplo. Simple, useful, no info because nothing can go wrong. A chill icon. 🌸

void LAPACK_dlag2s (lapack_int * m, lapack_int * n, const double * a,
    lapack_int * lda, float * sa, lapack_int * ldsa, lapack_int * info)

Downgrades double precision to single precision — note a is double * and sa is float *, and yes, it reports info because narrowing can overflow. 🙈

void LAPACK_dlagge (lapack_int * m, lapack_int * n, lapack_int * kl,
    lapack_int * ku, const double * d, double * a, lapack_int * lda,
    lapack_int * iseed, double * work, lapack_int * info)

Generates a random band matrix with kl subdiagonals and ku superdiagonals, with singular values from d. iseed seeds the RNG — it's an in/out array, so keep it around. 🎲

void LAPACK_dlagsy (lapack_int * n, lapack_int * k, const double * d, double
    * a, lapack_int * lda, lapack_int * iseed, double * work, lapack_int *
    info)

Same energy, but symmetric this time and with k — the spectrum comes from d. 🌈

double LAPACK_dlamch (char * cmach)

Returns machine parameters — epsilon, safe min, base, precision, etc., selected by cmach. Notice it returns double directly, not via a pointer. Different, but she pulls it off. ⭐

double LAPACK_dlange (char * norm, lapack_int * m, lapack_int * n, const
    double * a, lapack_int * lda, double * work)

The matrix norm of your choice — pick your norm and she gives a double back. work is there for the norms that need scratch space. No info, no complaints.

double LAPACK_dlansy (char * norm, char * uplo, lapack_int * n, const double
    * a, lapack_int * lda, double * work)

Symmetric matrix norm — same deal, but you also say which triangle you're storing via uplo. ✨

double LAPACK_dlantr (char * norm, char * uplo, char * diag, lapack_int * m,
    lapack_int * n, const double * a, lapack_int * lda, double * work)

Triangular matrix norm — now with diag too, because whether the diagonal is unit or not actually changes the answer. Three char * options, so read carefully bestie. 🎀

void LAPACK_dlapmr (lapack_logical * forwrd, lapack_int * m, lapack_int * n,
    double * x, lapack_int * ldx, lapack_int * k)

Rearranges the rows of x — forward or backward per forwrd, with k telling her how the permutation is arranged. Subtle little routine, but she matters. 🦋

void LAPACK_dlapmt (lapack_logical * forwrd, lapack_int * m, lapack_int * n,
    double * x, lapack_int * ldx, lapack_int * k)

The T is for transpose, babes — columns get rearranged, not rows. Same arguments, different axis. 🔁

double LAPACK_dlapy2 (double * x, double * y)

Computes sqrt(x**2 + y**2) without the overflow/underflow drama of doing it naively. Tiny function, huge save. 🫶

double LAPACK_dlapy3 (double * x, double * y, double * z)

The three-argument glow-up: sqrt(x**2 + y**2 + z**2), done safely. Notice these last two take double * even though they just read two or three scalars. That's the Fortran heritage, don't question it. 😭


The reflector / Householder corner of the page. These are the ones that build the Q matrices everyone else brags about.

void LAPACK_dlarfb (char * side, char * trans, char * direct, char * storev,
    lapack_int * m, lapack_int * n, lapack_int * k, const double * v,
    lapack_int * ldv, const double * t, lapack_int * ldt, double * c,
    lapack_int * ldc, double * work, lapack_int * ldwork)

Applies a block reflector to c — four char * options (side, trans, direct, storev), which is honestly a lot of deciding before you're allowed to compute anything. 💀

void LAPACK_dlarfg (lapack_int * n, double * alpha, double * x, lapack_int *
    incx, double * tau)

Generates a single Householder reflector. alpha gets overwritten (it's not const!) and tau comes out as the scalar factor. Small but mighty. ⭐

void LAPACK_dlarft (char * direct, char * storev, lapack_int * n, lapack_int
    * k, const double * v, lapack_int * ldv, const double * tau, double * t,
    lapack_int * ldt)

Forms the triangular factor t from a bunch of reflectors. She takes your tau array and turns chaos into a tidy triangular block. 🧚

void LAPACK_dlarfx (char * side, lapack_int * m, lapack_int * n, const
    double * v, double * tau, double * c, lapack_int * ldc, double * work)

Applies one Householder reflector to c. Reads v, reads tau, writes all over c. Very "I'm just going to move some things around in here". 💅

void LAPACK_dlarnv (lapack_int * idist, lapack_int * iseed, lapack_int * n,
    double * x)

Fills x with n random numbers from distribution idist, tracked by iseed. This is the RNG royalty of the page. 👑

void LAPACK_dlartgp (double * f, double * g, double * cs, double * sn,
    double * r)

Generates a Givens rotation given f and g — outputs cs, sn, and r. Every argument is a double *, even f and g, and honestly? She's consistent. 😭

void LAPACK_dlartgs (double * x, double * y, double * sigma, double * cs,
    double * sn)

Same, but with sigma thrown in and only cs/sn coming back. The s in the name stands for something very specific, but you knew that. 🎀

void LAPACK_dlascl (char * type, lapack_int * kl, lapack_int * ku, double *
    cfrom, double * cto, lapack_int * m, lapack_int * n, double * a,
    lapack_int * lda, lapack_int * info)

Scales a matrix from cfrom to cto — and it's careful about it, so if the scale factor would overflow, info calls it out. Fixes your overflow disasters before they happen. 🫶

void LAPACK_dlaset (char * uplo, lapack_int * m, lapack_int * n, double *
    alpha, double * beta, double * a, lapack_int * lda)

Sets off-diagonals to alpha and the diagonal to beta. Zeroing out a matrix? alpha = 0, beta = 0. Iconic, no notes. ✨

void LAPACK_dlasrt (char * id, lapack_int * n, double * d, lapack_int *
    info)

Sorts d — increasing or decreasing according to id. She reports info because apparently sorting can go wrong. 💀

void LAPACK_dlassq (lapack_int * n, double * x, lapack_int * incx, double *
    scale, double * sumsq)

Updates scale and sumsq so you can accumulate a sum of squares without overflow. Note x is not const here — yes, even though she only reads it. Legacy, bestie. 🙈

void LAPACK_dlaswp (lapack_int * n, double * a, lapack_int * lda, lapack_int
    * k1, lapack_int * k2, const lapack_int * ipiv, lapack_int * incx)

Applies the pivot interchanges to rows k1 through k2 of a. The incx means you can do it in chunks — very demure of her. 💅

void LAPACK_dlatms (lapack_int * m, lapack_int * n, char * dist, lapack_int
    * iseed, char * sym, double * d, lapack_int * mode, double * cond,
    double * dmax, lapack_int * kl, lapack_int * ku, char * pack, double *
    a, lapack_int * lda, double * work, lapack_int * info)

The full randomized test-matrix generator — distribution, symmetry, conditioning, singular values from d, bandwidth via kl/ku, packing via pack. If you need a test matrix with a specific personality, this is the one. 🔥

void LAPACK_dlauum (char * uplo, lapack_int * n, double * a, lapack_int *
    lda, lapack_int * info)

UU = upper to upper. Takes the triangular factor from a Cholesky and forms A = U'*U (or the L*L' version), overwriting in place. 🧚


Orthogonal matrix generation, aka "please give me a Q that's actually orthogonal, I'm begging".

void LAPACK_dopgtr (char * uplo, lapack_int * n, const double * ap, const
    double * tau, double * q, lapack_int * ldq, double * work, lapack_int *
    info)

Generates Q from a packed triangular matrix ap plus its reflectors tau. Packed means "the triangle is squished into a 1D array" — cute, compact, confusing the first time. 🎀

void LAPACK_dopmtr (char * side, char * uplo, char * trans, lapack_int * m,
    lapack_int * n, const double * ap, const double * tau, double * c,
    lapack_int * ldc, double * work, lapack_int * info)

Applies that Q (or Q') to c — side, uplo, and trans let you pick which side and which direction. Three char * decisions, one result. ✨

void LAPACK_dorbdb (char * trans, char * signs, lapack_int * m, lapack_int *
    p, lapack_int * q, double * x11, lapack_int * ldx11, double * x12,
    lapack_int * ldx12, double * x21, lapack_int * ldx21, double * x22,
    lapack_int * ldx22, double * theta, double * phi, double * taup1, double
    * taup2, double * tauq1, double * tauq2, double * work, lapack_int *
    lwork, lapack_int * info)

The CS decomposition bidiagonalization step. Look at all those x blocks (x11, x12, x21, x22), the theta/phi angles, and four (!) tau arrays. This is the most decorated function on this chunk of the page and she earned it. 👑

void LAPACK_dorcsd (char * jobu1, char * jobu2, char * jobv1t, char *
    jobv2t, char * trans, char * signs, lapack_int * m, lapack_int * p,
    lapack_int * q, double * x11, lapack_int * ldx11, double * x12,
    lapack_int * ldx12, double * x21, lapack_int * ldx21, double * x22,
    lapack_int * ldx22, double * theta, double * u1, lapack_int * ldu1,
    double * u2, lapack_int * ldu2, double * v1t, lapack_int * ldv1t, double
    * v2t, lapack_int * ldv2t, double * work, lapack_int * lwork, lapack_int
    * iwork, lapack_int * info)

CS decomposition, full version — five char * options and outputs for u1, u2, v1t, v2t. The t in jobv1t/jobv2t and v1t/v2t means transpose. Nobody escapes the transpose here. 😭

void LAPACK_dorcsd2by1 (char * jobu1, char * jobu2, char * jobv1t,
    lapack_int * m, lapack_int * p, lapack_int * q, double * x11, lapack_int
    * ldx11, double * x21, lapack_int * ldx21, double * theta, double * u1,
    lapack_int * ldu1, double * u2, lapack_int * ldu2, double * v1t,
    lapack_int * ldv1t, double * work, lapack_int * lwork, lapack_int *
    iwork, lapack_int * info)

The 2by1 variant — only x11 and x21 this time, because the structure is already stacked. Fewer blocks, fewer char options, same energy. 🌈

void LAPACK_dorgbr (char * vect, lapack_int * m, lapack_int * n, lapack_int

And we're cutting off mid-signature at lapack_int — bestie, the page literally stops here. dorgbr generates the orthogonal matrix from a bidiagonal factorization (vect tells her which one), and the rest of her argument list is waiting for you in the next part. Stay tuned, we're not done. 🦋💖

okay so we're picking up mid-signature — literally the tail end of the last one, don't panic, just finishing the sentence we walked in on:

   * k, double * a, lapack_int * lda, const double * tau, double * work,
   lapack_int * lwork, lapack_int * info)

cool cool cool. and now the next wave of void-returning besties, all of them ending in lapack_int * info like they all coordinated their outfits 💅


LAPACK_dorghr ✨

void LAPACK_dorghr (lapack_int * n, lapack_int * ilo, lapack_int * ihi, double * a, lapack_int * lda, const double * tau, double * work, lapack_int * lwork, lapack_int * info)

ilo and ihi in the same signature? it's giving range girlies 🎀 plus the classic tau / work / lwork trio, plus a with its lda. all star, no notes.

LAPACK_dorglq 🦋

void LAPACK_dorglq (lapack_int * m, lapack_int * n, lapack_int * k, double * a, lapack_int * lda, const double * tau, double * work, lapack_int * lwork, lapack_int * info)

m, n, k stacked like a little staircase — the three-parameter opening is lowkey a signature at this point.

LAPACK_dorgql 🌸

void LAPACK_dorgql (lapack_int * m, lapack_int * n, lapack_int * k, double * a, lapack_int * lda, const double * tau, double * work, lapack_int * lwork, lapack_int * info)

same m n k entrance as the last one, different letters at the end of the name. yes bestie, they're siblings, that's the whole bit 💀

LAPACK_dorgqr ✨

void LAPACK_dorgqr (lapack_int * m, lapack_int * n, lapack_int * k, double * a, lapack_int * lda, const double * tau, double * work, lapack_int * lwork, lapack_int * info)

q and r girlies stand UP. same arg list, const double * tau holding it down in the middle like always.

LAPACK_dorgrq 🎀

void LAPACK_dorgrq (lapack_int * m, lapack_int * n, lapack_int * k, double * a, lapack_int * lda, const double * tau, double * work, lapack_int * lwork, lapack_int * info)

the letters got shuffled, the vibe did not. obsessed with the consistency fr fr.

LAPACK_dorgtr 🫶

void LAPACK_dorgtr (char * uplo, lapack_int * n, double * a, lapack_int * lda, const double * tau, double * work, lapack_int * lwork, lapack_int * info)

ooh she leads with char * uplo — main character energy 🌈 note there's no m or k here at all, just n, a, lda, tau, work, lwork, info.


now the dorm* squad, and every single one of them opens with char * pointers because they literally cannot make a decision without asking 😭

LAPACK_dormbr 💜

void LAPACK_dormbr (char * vect, char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const double * a, lapack_int * lda, const double * tau, double * c, lapack_int * ldc, double * work, lapack_int * lwork, lapack_int * info)

three char *s before you even get to a number: vect, side, trans. it's giving ✨options✨. then a/lda, tau, c/ldc, work/lwork, info.

LAPACK_dormhr 🔥

void LAPACK_dormhr (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * ilo, lapack_int * ihi, const double * a, lapack_int * lda, const double * tau, double * c, lapack_int * ldc, double * work, lapack_int * lwork, lapack_int * info)

side and trans then ilo ihi come back for a lil cameo. the range girlies never really leave, do they.

LAPACK_dormlq 🌸

void LAPACK_dormlq (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const double * a, lapack_int * lda, const double * tau, double * c, lapack_int * ldc, double * work, lapack_int * lwork, lapack_int * info)

side, trans, m, n, k — the standard two-chars-then-three-ints opener. and yes c comes with its own ldc, as she should 💅

LAPACK_dormql 🦋

void LAPACK_dormql (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const double * a, lapack_int * lda, const double * tau, double * c, lapack_int * ldc, double * work, lapack_int * lwork, lapack_int * info)

identical layout to the last, name swapped. no cap, these two are twins and they know it.

LAPACK_dormqr ⭐

void LAPACK_dormqr (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const double * a, lapack_int * lda, const double * tau, double * c, lapack_int * ldc, double * work, lapack_int * lwork, lapack_int * info)

the qr girlie of the family 🎀 same fourteen params, same info at the end, same energy.

LAPACK_dormrq 🌈

void LAPACK_dormrq (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const double * a, lapack_int * lda, const double * tau, double * c, lapack_int * ldc, double * work, lapack_int * lwork, lapack_int * info)

yep. same. and honestly? slay. consistency is a love language.

LAPACK_dormrz 💀

void LAPACK_dormrz (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, lapack_int * l, const double * a, lapack_int * lda, const double * tau, double * c, lapack_int * ldc, double * work, lapack_int * lwork, lapack_int * info)

WAIT. there's an extra lapack_int * l in there between k and a 😭 not me doing a double take. yes bestie, read it twice — m, n, k, l. iconic of her honestly.

LAPACK_dormtr 🌸

void LAPACK_dormtr (char * side, char * uplo, char * trans, lapack_int * m, lapack_int * n, const double * a, lapack_int * lda, const double * tau, double * c, lapack_int * ldc, double * work, lapack_int * lwork, lapack_int * info)

three chars again but it's side, uplo, trans — no k in this one. we love a plot twist 🫶


new letter, new era: the dpb* girlies are here 🎀 and they all brought uplo, n, and kd to the party.

LAPACK_dpbcon ✨

void LAPACK_dpbcon (char * uplo, lapack_int * n, lapack_int * kd, const double * ab, lapack_int * ldab, double * anorm, double * rcond, double * work, lapack_int * iwork, lapack_int * info)

not one but TWO iwork-adjacent situations — okay there's iwork at the end there, plus anorm and rcond are plain old double *, not const. noticing things, as usual 🔥 also ab/ldab not a/lda, she's fancy.

LAPACK_dpbequ 💜

void LAPACK_dpbequ (char * uplo, lapack_int * n, lapack_int * kd, const double * ab, lapack_int * ldab, double * s, double * scond, double * amax, lapack_int * info)

short and sweet — no work, no lwork, no iwork, just s, scond, amax, and info. minimalism? we stan 💅

LAPACK_dpbrfs 🦋

void LAPACK_dpbrfs (char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, const double * ab, lapack_int * ldab, const double * afb, lapack_int * ldafb, const double * b, lapack_int * ldb, double * x, lapack_int * ldx, double * ferr, double * berr, double * work, lapack_int * iwork, lapack_int * info)

okay she's LONG. count them: uplo, n, kd, nrhs, ab, ldab, afb, ldafb, b, ldb, x, ldx, ferr, berr, work, iwork, info. seventeen. not me out of breath 😭 the f family entries really do the most and I respect it.

LAPACK_dpbstf 🌸

void LAPACK_dpbstf (char * uplo, lapack_int * n, lapack_int * kb, double * bb, lapack_int * ldbb, lapack_int * info)

tiny!! uplo, n, kb (that's kb with a b, not kd, look closely bestie 👀), bb, ldbb, info. six params and she's out. love that for her.

LAPACK_dpbsv ⭐

void LAPACK_dpbsv (char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, double * ab, lapack_int * ldab, double * b, lapack_int * ldb, lapack_int * info)

no x, no work, no iwork — just gets in, does the thing, and leaves. efficiency icon.

LAPACK_dpbsvx 🔥

void LAPACK_dpbsvx (char * fact, char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, double * ab, lapack_int * ldab, double * afb, lapack_int * ldafb, char * equed, double * s, double * b, lapack_int * ldb, double * x, lapack_int * ldx, double * rcond, double * ferr, double * berr, double * work, lapack_int * iwork, lapack_int * info)

the x version said "let me cook" and then cooked 😭 fact at the front, equed hiding in the middle at position ten, s, b/ldb, x/ldx, rcond, ferr, berr, work, iwork, info. yes she's extra. no we're not mad about it.

LAPACK_dpbtrf 🎀

void LAPACK_dpbtrf (char * uplo, lapack_int * n, lapack_int * kd, double * ab, lapack_int * ldab, lapack_int * info)

uplo, n, kd, ab, ldab, info. six. done. refreshing honestly, like a little palate cleanser 🌈

LAPACK_dpbtrs 🫶

void LAPACK_dpbtrs (char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, const double * ab, lapack_int * ldab, double * b, lapack_int * ldb, lapack_int * info)

note const double * ab here — yes the const moved, yes I clocked it, yes I'm that girl 💅 only eight params, she's chill.


and now the dpft* trio, who all share transr and uplo and have literally zero work/lwork in sight. kings of not overexplaining 🔥

LAPACK_dpftrf ✨

void LAPACK_dpftrf (char * transr, char * uplo, lapack_int * n, double * a, lapack_int * info)

five params. FIVE. transr, uplo, n, a, info. not a lda to be found, not a work in sight. it's giving unbothered.

LAPACK_dpftri 💜

void LAPACK_dpftri (char * transr, char * uplo, lapack_int * n, double * a, lapack_int * info)

identical twin of the last one, different last letter. and yes I checked twice, they're literally the same signature 🌸

LAPACK_dpftrs 🦋

void LAPACK_dpftrs (char * transr, char * uplo, lapack_int * n, lapack_int * nrhs, const double * a, double * b, lapack_int * ldb, lapack_int * info)

she's the one who actually takes input — nrhs shows up, and a goes const while b and ldb stay mutable. queen behavior, keeping it eight params and dipping.


okay that's the batch — every one of them void, every one of them closing on lapack_int * info, and the list is still going so don't you dare close the tab 😭 more coming 💖


Okay so we're deep in the function-signature zone and honestly? This stretch is a whole era. 💅 Every single one of these is a d-prefixed prototype, which means it's the double-precision member of the squad, and every pointer is a pointer-to-the-actual-thing — heap, stack, whatever, miss girl does not copy your data, she just knows where it lives. 🫶

Let's go down the list, no skipping, no "etc." energy. ✨


LAPACK_dpocon

   void LAPACK_dpocon (char * uplo, lapack_int * n, const double * a,
       lapack_int * lda, double * anorm, double * rcond, double * work,
       lapack_int * iwork, lapack_int * info)

Bestie, look at the cast list: uplo, n, a, lda, anorm, rcond, work, iwork, info. The a is const (she's reading, not touching 🌸), and you're handing over both a double * work buffer and a lapack_int * iwork buffer so she has somewhere to put her stuff. Also anorm is a plain double *, bestie — not const, so expect it to get written to. 💀


LAPACK_dpoequ

   void LAPACK_dpoequ (lapack_int * n, const double * a, lapack_int * lda,
       double * s, double * scond, double * amax, lapack_int * info)

No uplo here, no work, no iwork — just n, a, lda, and the three output pointers s, scond, amax. Minimalist queen. 👑


LAPACK_dpoequb

   void LAPACK_dpoequb (lapack_int * n, const double * a, lapack_int * lda,
       double * s, double * scond, double * amax, lapack_int * info)

The b on the end is doing so much work and yet the signature is character-for-character identical to LAPACK_dpoequ above. n, a, lda, s, scond, amax, info — same shape, different name. Don't get it twisted 🎀


LAPACK_dporfs

   void LAPACK_dporfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       double * a, lapack_int * lda, const double * af, lapack_int * ldaf,
       const double * b, lapack_int * ldb, double * x, lapack_int * ldx, double
       * ferr, double * berr, double * work, lapack_int * iwork, lapack_int *
       info)

Okay this one is stacked. 💅 uplo, n, nrhs, then a whole matching set — a/lda and af/ldaf (both const, both read-only, both with their own leading dimension), b/ldb (const), x/ldx (not const!, she's writing into x), then ferr, berr, work, iwork, info. It's giving "I have two matrices and I'm not afraid to use them."


LAPACK_dporfsx

   void LAPACK_dporfsx (char * uplo, char * equed, lapack_int * n, lapack_int *
       nrhs, const double * a, lapack_int * lda, const double * af, lapack_int
       * ldaf, const double * s, const double * b, lapack_int * ldb, double *
       x, lapack_int * ldx, double * rcond, double * berr, lapack_int *
       n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int *
       nparams, double * params, double * work, lapack_int * iwork, lapack_int
       * info)

The x in rfsx is for extra, clearly. 😭 Look at this list: uplo, equed, n, nrhs, a, lda, af, ldaf, s, b, ldb, x, ldx, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork, info. Note equed is char * and not const, and s here is const while in LAPACK_dpoequ it was writable — different gig, different contract, iykyk. 🦋


LAPACK_dposv

   void LAPACK_dposv (char * uplo, lapack_int * n, lapack_int * nrhs, double *
       a, lapack_int * lda, double * b, lapack_int * ldb, lapack_int * info)

Short and iconic: uplo, n, nrhs, a, lda, b, ldb, info. Eight args, no work, no iwork — she keeps her buffers to herself. So lowkey humble for someone doing so much. ✨


LAPACK_dposvx

   void LAPACK_dposvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, double * a, lapack_int * lda, double * af, lapack_int * ldaf, char
       * equed, double * s, double * b, lapack_int * ldb, double * x,
       lapack_int * ldx, double * rcond, double * ferr, double * berr, double *
       work, lapack_int * iwork, lapack_int * info)

Two chars up front now: fact and uplo. Then n, nrhs, a/lda, af/ldaf, equed, s, b/ldb, x/ldx, rcond, ferr, berr, work, iwork, info. Not one const in sight on the matrix pointers — everything's fair game. 🙈


LAPACK_dposvxx

   void LAPACK_dposvxx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, double * a, lapack_int * lda, double * af, lapack_int * ldaf, char
       * equed, double * s, double * b, lapack_int * ldb, double * x,
       lapack_int * ldx, double * rcond, double * rpvgrw, double * berr,
       lapack_int * n_err_bnds, double * err_bnds_norm, double * err_bnds_comp,
       lapack_int * nparams, double * params, double * work, lapack_int *
       iwork, lapack_int * info)

Okay so versus LAPACK_dposvx, the double-x version sneaks in rpvgrw, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, and params. That's it, that's the whole difference in the arg list — but it is a long arg list: fact, uplo, n, nrhs, a, lda, af, ldaf, equed, s, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork, info. 25 arguments. Twenty-five. Girl said "I'll take everything." 💀🔥


LAPACK_dpotrf

   void LAPACK_dpotrf (char * uplo, lapack_int * n, double * a, lapack_int *
       lda, lapack_int * info)

Five args and a dream: uplo, n, a, lda, info. She's the moment, she's the legend. 👑


LAPACK_dpotrf2

   void LAPACK_dpotrf2 (char * uplo, lapack_int * n, double * a, lapack_int *
       lda, lapack_int * info)

The 2 at the end is the whole personality change and the signature is otherwise literally identical to LAPACK_dpotrf: uplo, n, a, lda, info. Same cast, different show. 🎀


LAPACK_dpotri

   void LAPACK_dpotri (char * uplo, lapack_int * n, double * a, lapack_int *
       lda, lapack_int * info)

Another five-arg situation — uplo, n, a, lda, info — and yeah, this is the third signature in a row that looks exactly like this, and honestly? Consistency is a love language. 🫶


LAPACK_dpotrs

   void LAPACK_dpotrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       double * a, lapack_int * lda, double * b, lapack_int * ldb, lapack_int *
       info)

Now she's got nrhs and a b/ldb pair, and note the drama: a is const double * but b is plain double *. Read a, write b. The duality of woman. 🦋


LAPACK_dppcon

   void LAPACK_dppcon (char * uplo, lapack_int * n, const double * ap, double *
       anorm, double * rcond, double * work, lapack_int * iwork, lapack_int *
       info)

Welcome to the pp crew — packed storage era. 🌸 uplo, n, ap (that's ap, not a!), anorm, rcond, work, iwork, info. Notice there's no lda anywhere in this family — packed means packed, bestie.


LAPACK_dppequ

   void LAPACK_dppequ (char * uplo, lapack_int * n, const double * ap, double *
       s, double * scond, double * amax, lapack_int * info)

uplo, n, ap, s, scond, amax, info. Same seven-arg energy as LAPACK_dpoequ except she's got that uplo up front and ap instead of a/lda. ✨


LAPACK_dpprfs

   void LAPACK_dpprfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       double * ap, const double * afp, const double * b, lapack_int * ldb,
       double * x, lapack_int * ldx, double * ferr, double * berr, double *
       work, lapack_int * iwork, lapack_int * info)

Packed twin of LAPACK_dporfs, and look how much lighter she travels without lda/ldaf: uplo, n, nrhs, ap, afp, b, ldb, x, ldx, ferr, berr, work, iwork, info. Three const matrices, one very-writable x. 💅


LAPACK_dppsv

   void LAPACK_dppsv (char * uplo, lapack_int * n, lapack_int * nrhs, double *
       ap, double * b, lapack_int * ldb, lapack_int * info)

Seven args, zero work buffer: uplo, n, nrhs, ap, b, ldb, info. She said "I'll allocate my own, thanks." 🎀


LAPACK_dppsvx

   void LAPACK_dppsvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, double * ap, double * afp, char * equed, double * s, double * b,
       lapack_int * ldb, double * x, lapack_int * ldx, double * rcond, double *
       ferr, double * berr, double * work, lapack_int * iwork, lapack_int *
       info)

fact, uplo, n, nrhs, ap, afp, equed, s, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info. Packed and equipped with every diagnostic pointer in the building. 🔥


LAPACK_dpptrf

   void LAPACK_dpptrf (char * uplo, lapack_int * n, double * ap, lapack_int *
       info)

Four arguments. Four!! uplo, n, ap, info. Cute, brief, devastating. 🌈


LAPACK_dpptri

   void LAPACK_dpptri (char * uplo, lapack_int * n, double * ap, lapack_int *
       info)

Identical cast to LAPACK_dpptrf — uplo, n, ap, info — one letter apart in the name and that's the entire difference you can see from out here. 🦋


LAPACK_dpptrs

   void LAPACK_dpptrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       double * ap, double * b, lapack_int * ldb, lapack_int * info)

And the trio closes out with uplo, n, nrhs, ap (const now!), b, ldb, info. Read the packed thing, write the b. Periodt. 💅


LAPACK_dpstrf

   void LAPACK_dpstrf (char * uplo, lapack_int * n, double * a, lapack_int *
       lda, lapack_int * piv, lapack_int * rank, double * tol, double * work,
       lapack_int * info)

uplo, n, a, lda, piv, rank, tol, work, info — she's got a pivot array, a rank pointer AND a tol pointer, and tol is not const, so she may well write to it. Don't be surprised, bestie. 👀


LAPACK_dptcon

   void LAPACK_dptcon (lapack_int * n, const double * d, const double * e,
       double * anorm, double * rcond, double * work, lapack_int * info)

Tridiagonal era begins 🎀 — and no uplo in sight, because tridiagonal is tridiagonal, there's nothing to pick. n, d, e, anorm, rcond, work, info, with d and e both const. Note: work here, but no iwork. ⭐


LAPACK_dpteqr

   void LAPACK_dpteqr (char * compz, lapack_int * n, double * d, double * e,
       double * z, lapack_int * ldz, double * work, lapack_int * info)

compz is the star of the show here (not uplo!), followed by n, d, e, z, ldz, work, info. Eight args, one very important little character. ✨


LAPACK_dptrfs

   void LAPACK_dptrfs (lapack_int * n, lapack_int * nrhs, const double * d,
       const double * e, const double * df, const double * ef, const double *
       b, lapack_int * ldb, double * x, lapack_int * ldx, double * ferr, double
       * berr, double * work, lapack_int * info)

Okay the const budget on this one is generous: n, nrhs, d, e, df, ef, b, ldb, then writable x, ldx, ferr, berr, work, info. Five separate const double * inputs and not a single iwork. She's low-maintenance like that. 🫶


LAPACK_dptsv

   void LAPACK_dptsv (lapack_int * n, lapack_int * nrhs, double * d, double *
       e, double * b, lapack_int * ldb, lapack_int * info)

Seven args, no uplo, no work: n, nrhs, d, e, b, ldb, info. And d/e are not const here — she's allowed to mess with them. 🔥


LAPACK_dptsvx

   void LAPACK_dptsvx (char * fact, lapack_int * n, lapack_int * nrhs, const
       double * d, const double * e, double * df, double * ef, const double *
       b, lapack_int * ldb, double * x, lapack_int * ldx, double * rcond,
       double * ferr, double * berr, double * work, lapack_int * info)

Cute lil' symmetry going on: d/e come in const, df/ef are writable copies. Plus fact, n, nrhs, b, ldb, x, ldx, rcond, ferr, berr, work, info. Chef's kiss. 💅


LAPACK_dpttrf

   void LAPACK_dpttrf (lapack_int * n, double * d, double * e, lapack_int *
       info)

Four args. n, d, e, info. That's it. That's the function. Iconic minimalism. 🎀


LAPACK_dpttrs

   void LAPACK_dpttrs (lapack_int * n, lapack_int * nrhs, const double * d,
       const double * e, double * b, lapack_int * ldb, lapack_int * info)

n, nrhs, d, e (both const this time!), b, ldb, info. Seven, no uplo, no work buffers, immaculate. 🌸


LAPACK_dsbev

   void LAPACK_dsbev (char * jobz, char * uplo, lapack_int * n, lapack_int *
       kd, double * ab, lapack_int * ldab, double * w, double * z, lapack_int *
       ldz, double * work, lapack_int * info)

Band storage crew, assemble! 🦋 jobz, uplo, n, kd, ab, ldab, w, z, ldz, work, info. Two chars, a bandwidth kd, and the classic ab/ldab pairing. Note: work but no lwork in this one. ⭐


LAPACK_dsbev_2stage

   void LAPACK_dsbev_2stage (char * jobz, char * uplo, lapack_int * n,
       lapack_int * kd, double * ab, lapack_int * ldab, double * w, double * z,
       lapack_int * ldz, double * work, lapack_int * lwork, lapack_int * info)

And there's the difference: _2stage adds lwork between work and info. Full list: jobz, uplo, n, kd, ab, ldab, w, z, ldz, work, lwork, info. Twelve args, one extra pointer, zero ambiguity. 🔍


LAPACK_dsbevd

   void LAPACK_dsbevd (char * jobz, char * uplo, lapack_int * n, lapack_int *
       kd, double * ab, lapack_int * ldab, double * w, double * z, lapack_int *
       ldz, double * work, lapack_int * lwork, lapack_int * iwork, lapack_int *
       liwork, lapack_int * info)

Now we're talking — jobz, uplo, n, kd, ab, ldab, w, z, ldz, work, lwork, iwork, liwork, info. Two works, two lengths. Every buffer gets a buddy. 💖


LAPACK_dsbevd_2stage

   void LAPACK_dsbevd_2stage (char * jobz, char * uplo, lapack_int * n,
       lapack_int * kd, double * ab, lapack_int * ldab, double * w, double * z,
       lapack_int * ldz, double * work, lapack_int * lwork, lapack_int * iwork,
       lapack_int * liwork, lapack_int * info)

Same cast as LAPACK_dsbevd — jobz, uplo, n, kd, ab, ldab, w, z, ldz, work, lwork, iwork, liwork, info — just wearing the _2stage badge. 💅


LAPACK_dsbevx

   void LAPACK_dsbevx (char * jobz, char * range, char * uplo, lapack_int * n,
       lapack_int * kd, double * ab, lapack_int * ldab, double * q, lapack_int
       * ldq, double * vl, double * vu, lapack_int * il, lapack_int * iu,
       double * abstol, lapack_int * m, double * w, double * z, lapack_int *
       ldz, double * work, lapack_int * iwork, lapack_int * ifail, lapack_int *
       info)

Oh she's fancy. Three chars: jobz, range, uplo. Then n, kd, ab, ldab, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info. Note: work but no lwork — and there's an ifail lurking at the end, which... just don't ask, it's a whole thing. 🙈


LAPACK_dsbevx_2stage

   void LAPACK_dsbevx_2stage (char * jobz, char * range, char * uplo,
       lapack_int * n, lapack_int * kd, double * ab, lapack_int * ldab, double
       * q, lapack_int * ldq, double * vl, double * vu, lapack_int * il,
       lapack_int * iu, double * abstol, lapack_int * m, double * w, double *
       z, lapack_int * ldz, double * work, lapack_int * lwork, lapack_int *
       iwork, lapack_int * ifail, lapack_int * info)

You guessed it — lwork shows up again. Full squad: jobz, range, uplo, n, kd, ab, ldab, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, iwork, ifail, info. 23 pointers. She's thriving. 🌈


LAPACK_dsbgst

   void LAPACK_dsbgst (char * vect, char * uplo, lapack_int * n, lapack_int *
       ka, lapack_int * kb, double * ab, lapack_int * ldab, const double * bb,
       lapack_int * ldbb, double * x, lapack_int * ldx, double * work,
       lapack_int * info)

Two bandwidths now (ka and kb — she's got range, literally) 🎀: vect, uplo, n, ka, kb, ab, ldab, bb, ldbb, x, ldx, work, info. Note bb is const and ab is not. Asymmetry, but make it fashion. ✨


LAPACK_dsbgv

   void LAPACK_dsbgv (char * jobz, char * uplo, lapack_int * n, lapack_int *
       ka, lapack_int * kb, double * ab, lapack_int * ldab, double * bb,
       lapack_int * ldbb, double * w, double * z, lapack_int * ldz, double *
       work, lapack_int * info)

jobz, uplo, n, ka, kb, ab, ldab, bb, ldbb, w, z, ldz, work, info — 14 args, no lwork, no iwork. She's the chill one. 💜


LAPACK_dsbgvd

   void LAPACK_dsbgvd (char * jobz, char * uplo, lapack_int * n, lapack_int *
       ka, lapack_int * kb, double * ab, lapack_int * ldab, double * bb,
       lapack_int * ldbb, double * w, double * z, lapack_int * ldz, double *
       work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork,
       lapack_int * info)

Chill era is over — work/lwork AND iwork/liwork both present. Full list: jobz, uplo, n, ka, kb, ab, ldab, bb, ldbb, w, z, ldz, work, lwork, iwork, liwork, info. 🔥


LAPACK_dsbgvx

   void LAPACK_dsbgvx (char * jobz, char * range, char * uplo, lapack_int * n,
       lapack_int * ka, lapack_int * kb, double * ab, lapack_int * ldab, double
       * bb, lapack_int * ldbb, double * q, lapack_int * ldq, double * vl,
       double * vu, lapack_int * il, lapack_int * iu, double * abstol,
       lapack_int * m, double * w, double * z, lapack_int * ldz, double * work,
       lapack_int * iwork, lapack_int * ifail, lapack_int * info)

Okay deep breath. 😮‍💨 jobz, range, uplo, n, ka, kb, ab, ldab, bb, ldbb, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info. Twenty-five arguments. work with no lwork, plus iwork and ifail both hanging out at the end. She's a lot, but she's worth it. 💀


LAPACK_dsbtrd

   void LAPACK_dsbtrd (char * vect, char * uplo, lapack_int * n, lapack_int *
       kd, double * ab, lapack_int * ldab, double * d, double * e, double * q,
       lapack_int * ldq, double * work, lapack_int * info)

vect, uplo, n, kd, ab, ldab, d, e, q, ldq, work, info. One kd, two output arrays d and e, one work, no lwork. Clean. 🧚


LAPACK_dsfrk

   void LAPACK_dsfrk (char * transr, char * uplo, char * trans, lapack_int * n,
       lapack_int * k, double * alpha, const double * a, lapack_int * lda,
       double * beta, double * c)

Huh, this one's got three char * flags and — plot twist — no info pointer at all! 🤯 Just transr, uplo, trans, n, k, alpha, a, lda, beta, c. Also alpha/beta are double * (not const) while a IS const. Yes bestie, notice the details. 🎀


LAPACK_dsgesv

   void LAPACK_dsgesv (lapack_int * n, lapack_int * nrhs, double * a,
       lapack_int * lda, lapack_int * ipiv, double * b, lapack_int * ldb,
       double * x, lapack_int * ldx, double * work, float * swork, lapack_int *
       iter, lapack_int * info)

Okay this one is unhinged in the best way 😭 — everything's double and then out of nowhere: float * swork. A singular float pointer in a double routine. She contains multitudes. Full list: n, nrhs, a, lda, ipiv, b, ldb, x, ldx, work, swork, iter, info. Also ipiv and iter are both non-const lapack_int *, so they're getting written. 💅


LAPACK_dspcon

   void LAPACK_dspcon (char * uplo, lapack_int * n, const double * ap, const
       lapack_int * ipiv, double * anorm, double * rcond, double * work,
       lapack_int * iwork, lapack_int * info)

Packed + pivots: uplo, n, ap, ipiv, anorm, rcond, work, iwork, info. Note ipiv is const lapack_int * here — read-only pivots, which is a vibe. 🌸


LAPACK_dspev

   void LAPACK_dspev (char * jobz, char * uplo, lapack_int * n, double * ap,
       double * w, double * z, lapack_int * ldz, double * work, lapack_int *
       info)

jobz, uplo, n, ap, w, z, ldz, work, info. Nine args, packed, work but no lwork. The starter pack pack. ✨


LAPACK_dspevd

   void LAPACK_dspevd (char * jobz, char * uplo, lapack_int * n, double * ap,
       double * w, double * z, lapack_int * ldz, double * work, lapack_int *
       lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

And the d ending brings the whole support system: jobz, uplo, n, ap, w, z, ldz, work, lwork, iwork, liwork, info. Two works, two lengths, one info. 💖


LAPACK_dspevx

   void LAPACK_dspevx (char * jobz, char * range, char * uplo, lapack_int * n,
       double * ap, double * vl, double * vu, lapack_int * il, lapack_int * iu,
       double * abstol, lapack_int * m, double * w, double * z, lapack_int *
       ldz, double * work, lapack_int * iwork, lapack_int * ifail, lapack_int *
       info)

jobz, range, uplo, n, ap, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info. Eighteen args, work with no lwork, and yes ifail is still invited to the party. 🙈


LAPACK_dspgst

   void LAPACK_dspgst (lapack_int * itype, char * uplo, lapack_int * n, double
       * ap, const double * bp, lapack_int * info)

Short king 👑 — itype (a lapack_int *, not a char!), uplo, n, ap, bp, info. And look: ap is writable but bp is const. She picks favorites. 🎀


LAPACK_dspgv

   void LAPACK_dspgv (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, double * ap, double * bp, double * w, double * z, lapack_int * ldz,
       double * work, lapack_int * info)

itype, jobz, uplo, n, ap, bp, w, z, ldz, work, info. Both ap and bp fully writable now, work present, lwork absent. Balance. ⭐


LAPACK_dspgvd

   void LAPACK_dspgvd (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, double * ap, double * bp, double * w, double * z, lapack_int * ldz,
       double * work, lapack_int * lwork, lapack_int * iwork, lapack_int *
       liwork, lapack_int * info)

itype, jobz, uplo, n, ap, bp, w, z, ldz, work, lwork, iwork, liwork, info. Fourteen args and double the workspace bookkeeping. She came prepared. 💜


LAPACK_dspgvx

   void LAPACK_dspgvx (lapack_int * itype, char * jobz, char * range, char *
       uplo, lapack_int * n, double * ap, double * bp, double * vl, double *
       vu, lapack_int * il, lapack_int * iu, double * abstol, lapack_int * m,
       double * w, double * z, lapack_int * ldz, double * work, lapack_int *
       iwork, lapack_int * ifail, lapack_int * info)

Okay, twenty-one arguments, let's count 'em: itype, jobz, range, uplo, n, ap, bp, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info. Yep. work without lwork, iwork with a partner-less existence, ifail still here. She's everything. 💀🌸


LAPACK_dsposv

   void LAPACK_dsposv (char * uplo, lapack_int * n, lapack_int * nrhs, double *
       a, lapack_int * lda, double * b, lapack_int * ldb, double * x,
       lapack_int * ldx, double * work, float * swork, lapack_int * iter,
       lapack_int * info)

The float * swork jumpscare returns 😭 — dsgesv's packed cousin keeps the exact same weird little float pointer. Full cast: uplo, n, nrhs, a, lda, b, ldb, x, ldx, work, swork, iter, info. Note uplo is there because she's the symmetric one, unlike LAPACK_dsgesv up top. 🔍


LAPACK_dsprfs

   void LAPACK_dsprfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       double * ap, const double * afp, const lapack_int * ipiv, const double *
       b, lapack_int * ldb, double * x, lapack_int * ldx, double * ferr, double
       * berr, double * work, lapack_int * iwork, lapack_int * info)

Check the const energy: ap, afp, ipiv, and b are all read-only. 🌈 Then uplo, n, nrhs, ldb, x, ldx, ferr, berr, work, iwork, info fill out the rest. Fifteen args, four const pointers, zero regrets. 💅


LAPACK_dspsv

   void LAPACK_dspsv (char * uplo, lapack_int * n, lapack_int * nrhs, double *
       ap, lapack_int * ipiv, double * b, lapack_int * ldb, lapack_int * info)

And we close this batch on a tight little eight-arg set: uplo, n, nrhs, ap, ipiv, b, ldb, info. Packed, pivoted, ipiv writable, no work buffers, no notes. A perfect little outro. 🎀✨


okay so we're STILL in the LAPACK_d* run and bestie, this part is a whole parade of prototypes 💅 we are not skipping a single one — every char *, every lapack_int *, every single double * work is coming with us. wrap 'em up, let's go 🎀

first up, the packed-storage girlies. <pink>packed</pink> means ap instead of a full a + lda situation, iykyk.

   void LAPACK_dspsvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, const double * ap, double * afp, lapack_int * ipiv, const double *
       b, lapack_int * ldb, double * x, lapack_int * ldx, double * rcond,
       double * ferr, double * berr, double * work, lapack_int * iwork,
       lapack_int * info)

this one's giving "the whole package" energy — fact, uplo, both ap and afp, plus rcond, ferr AND berr. she does not travel light 💀

   void LAPACK_dsptrd (char * uplo, lapack_int * n, double * ap, double * d,
       double * e, double * tau, lapack_int * info)

trd = the tridiagonal moment. she hands you d, e and tau and dips ✨

   void LAPACK_dsptrf (char * uplo, lapack_int * n, double * ap, lapack_int *
       ipiv, lapack_int * info)

the f at the end is for factorize, and she's real chill about it — just uplo, n, ap, ipiv, info. lowkey iconic 🦋

   void LAPACK_dsptri (char * uplo, lapack_int * n, double * ap, const
       lapack_int * ipiv, double * work, lapack_int * info)

i is for inverse bestie, and notice ipiv is const now — she's just reading it, not touching 🙈

   void LAPACK_dsptrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       double * ap, const lapack_int * ipiv, double * b, lapack_int * ldb,
       lapack_int * info)

solve era 🩷 b and ldb in, answer out, nrhs because she's multitasking fr fr


now the tridiagonal-eigenvalue block, aka the dst* girls. buckle up, there are so many and they all ate 🌸

   void LAPACK_dstebz (char * range, char * order, lapack_int * n, double * vl,
       double * vu, lapack_int * il, lapack_int * iu, double * abstol, const
       double * d, const double * e, lapack_int * m, lapack_int * nsplit,
       double * w, lapack_int * iblock, lapack_int * isplit, double * work,
       lapack_int * iwork, lapack_int * info)

range AND order, vl/vu AND il/iu, plus iblock and isplit?? she contains multitudes 👑

   void LAPACK_dstedc (char * compz, lapack_int * n, double * d, double * e,
       double * z, lapack_int * ldz, double * work, lapack_int * lwork,
       lapack_int * iwork, lapack_int * liwork, lapack_int * info)

two workspaces, two sizes — lwork/liwork — because she's a divide and conquer baddie and she needs room 💅

   void LAPACK_dstegr (char * jobz, char * range, lapack_int * n, double * d,
       double * e, double * vl, double * vu, lapack_int * il, lapack_int * iu,
       double * abstol, lapack_int * m, double * w, double * z, lapack_int *
       ldz, lapack_int * isuppz, double * work, lapack_int * lwork, lapack_int
       * iwork, lapack_int * liwork, lapack_int * info)

the isuppz cameo ✨ and yes she takes both lwork and liwork, main character energy only

   void LAPACK_dstein (lapack_int * n, const double * d, const double * e,
       lapack_int * m, const double * w, const lapack_int * iblock, const
       lapack_int * isplit, double * z, lapack_int * ldz, double * work,
       lapack_int * iwork, lapack_int * ifailv, lapack_int * info)

not me spotting that she does NOT take a uplo or jobz 🫶 she already knows what she is. also ifailv is right there at the end keeping it real

   void LAPACK_dstemr (char * jobz, char * range, lapack_int * n, double * d,
       double * e, double * vl, double * vu, lapack_int * il, lapack_int * iu,
       lapack_int * m, double * w, double * z, lapack_int * ldz, lapack_int *
       nzc, lapack_int * isuppz, lapack_logical * tryrac, double * work,
       lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int
       * info)

tryrac is a lapack_logical * and I'm obsessed — a whole boolean just vibing in the middle of the arg list 🌈

   void LAPACK_dsteqr (char * compz, lapack_int * n, double * d, double * e,
       double * z, lapack_int * ldz, double * work, lapack_int * info)

qr girlie. compact. compz first, info last, no notes 🎀

   void LAPACK_dsterf (lapack_int * n, double * d, double * e, lapack_int *
       info)

literally four args. the minimalism?? she said "I'm not doing the vectors, ask someone else" and honestly, respect 💀

   void LAPACK_dstev (char * jobz, lapack_int * n, double * d, double * e,
       double * z, lapack_int * ldz, double * work, lapack_int * info)

and she DOES do the vectors. the range 😭

   void LAPACK_dstevd (char * jobz, lapack_int * n, double * d, double * e,
       double * z, lapack_int * ldz, double * work, lapack_int * lwork,
       lapack_int * iwork, lapack_int * liwork, lapack_int * info)

d suffix = divide & conquer again, so of course lwork AND liwork showed up 🫶

   void LAPACK_dstevr (char * jobz, char * range, lapack_int * n, double * d,
       double * e, double * vl, double * vu, lapack_int * il, lapack_int * iu,
       double * abstol, lapack_int * m, double * w, double * z, lapack_int *
       ldz, lapack_int * isuppz, double * work, lapack_int * lwork, lapack_int
       * iwork, lapack_int * liwork, lapack_int * info)

r for relative-robust era, and she brought abstol, m, w, isuppz and both workspaces. packed to the brim 🧳

   void LAPACK_dstevx (char * jobz, char * range, lapack_int * n, double * d,
       double * e, double * vl, double * vu, lapack_int * il, lapack_int * iu,
       double * abstol, lapack_int * m, double * w, double * z, lapack_int *
       ldz, double * work, lapack_int * iwork, lapack_int * ifail, lapack_int *
       info)

the x one swaps isuppz out for ifail and honestly that's the whole difference, no cap 👀


okay, deep breath — <purple>symmetric</purple> era. the dsy* section is enormous and she's not sorry 💜

   void LAPACK_dsycon (char * uplo, lapack_int * n, const double * a,
       lapack_int * lda, const lapack_int * ipiv, double * anorm, double *
       rcond, double * work, lapack_int * iwork, lapack_int * info)

anorm in, rcond out — she takes a as const because she's only looking respectfully 🙈

   void LAPACK_dsycon_3 (char * uplo, lapack_int * n, const double * a,
       lapack_int * lda, const double * e, const lapack_int * ipiv, double *
       anorm, double * rcond, double * work, lapack_int * iwork, lapack_int *
       info)

the _3 variant said "add e" and that's it. a little extra, a lot of slay ✨

   void LAPACK_dsyconv (char * uplo, char * way, lapack_int * n, double * a,
       lapack_int * lda, const lapack_int * ipiv, double * e, lapack_int *
       info)

there's a way argument. a char * way. she literally lets you pick the way and I think that's beautiful 😭

   void LAPACK_dsyequb (char * uplo, lapack_int * n, const double * a,
       lapack_int * lda, double * s, double * scond, double * amax, double *
       work, lapack_int * info)

equilibration bestie, out here handing you s, scond and amax like little gifts 🎁

   void LAPACK_dsyev (char * jobz, char * uplo, lapack_int * n, double * a,
       lapack_int * lda, double * w, double * work, lapack_int * lwork,
       lapack_int * info)

the CLASSIC. jobz + uplo + w + workspace. she's the blueprint fr 🐝

   void LAPACK_dsyev_2stage (char * jobz, char * uplo, lapack_int * n, double *
       a, lapack_int * lda, double * w, double * work, lapack_int * lwork,
       lapack_int * info)

same args, _2stage in the name, two-stage glow-up. she didn't change her personality, she just upgraded 💅

   void LAPACK_dsyevd (char * jobz, char * uplo, lapack_int * n, double * a,
       lapack_int * lda, double * w, double * work, lapack_int * lwork,
       lapack_int * iwork, lapack_int * liwork, lapack_int * info)

and here come iwork/liwork — divide and conquer never met a workspace it didn't want 🫶

   void LAPACK_dsyevd_2stage (char * jobz, char * uplo, lapack_int * n, double
       * a, lapack_int * lda, double * w, double * work, lapack_int * lwork,
       lapack_int * iwork, lapack_int * liwork, lapack_int * info)

same as above but with the _2stage tag attached. the way she just adds a suffix and calls it a day 😌

   void LAPACK_dsyevr (char * jobz, char * range, char * uplo, lapack_int * n,
       double * a, lapack_int * lda, double * vl, double * vu, lapack_int * il,
       lapack_int * iu, double * abstol, lapack_int * m, double * w, double *
       z, lapack_int * ldz, lapack_int * isuppz, double * work, lapack_int *
       lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

three char * up front (jobz, range, uplo) and then a whole city of pointers. isuppz is back and she brought friends 🔥

   void LAPACK_dsyevr_2stage (char * jobz, char * range, char * uplo,
       lapack_int * n, double * a, lapack_int * lda, double * vl, double * vu,
       lapack_int * il, lapack_int * iu, double * abstol, lapack_int * m,
       double * w, double * z, lapack_int * ldz, lapack_int * isuppz, double *
       work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork,
       lapack_int * info)

the _2stage twin. same energy, different shirt 🌸

   void LAPACK_dsyevx (char * jobz, char * range, char * uplo, lapack_int * n,
       double * a, lapack_int * lda, double * vl, double * vu, lapack_int * il,
       lapack_int * iu, double * abstol, lapack_int * m, double * w, double *
       z, lapack_int * ldz, double * work, lapack_int * lwork, lapack_int *
       iwork, lapack_int * ifail, lapack_int * info)

x girlie said "no isuppz, we're doing ifail today" and I support her choices 💀

   void LAPACK_dsyevx_2stage (char * jobz, char * range, char * uplo,
       lapack_int * n, double * a, lapack_int * lda, double * vl, double * vu,
       lapack_int * il, lapack_int * iu, double * abstol, lapack_int * m,
       double * w, double * z, lapack_int * ldz, double * work, lapack_int *
       lwork, lapack_int * iwork, lapack_int * ifail, lapack_int * info)

yes bestie, _2stage for this one too. the family reunion is complete 🎀


generalized symmetric-definite time — enter itype, the first argument that isn't a char * and I gaslight myself every single time 😭

   void LAPACK_dsygst (lapack_int * itype, char * uplo, lapack_int * n, double
       * a, lapack_int * lda, const double * b, lapack_int * ldb, lapack_int *
       info)

b is const here because she's only reading it, and there's no jobz, no w, no workspace. she just does the thing and leaves 🔥

   void LAPACK_dsygv (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, double * a, lapack_int * lda, double * b, lapack_int * ldb, double
       * w, double * work, lapack_int * lwork, lapack_int * info)

now we got jobz, w and lwork in the mix — the full generalized-eigenvalue slay ✨

   void LAPACK_dsygv_2stage (lapack_int * itype, char * jobz, char * uplo,
       lapack_int * n, double * a, lapack_int * lda, double * b, lapack_int *
       ldb, double * w, double * work, lapack_int * lwork, lapack_int * info)

yep. _2stage. she keeps showing up and honestly? she's earned it 💅

   void LAPACK_dsygvd (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, double * a, lapack_int * lda, double * b, lapack_int * ldb, double
       * w, double * work, lapack_int * lwork, lapack_int * iwork, lapack_int *
       liwork, lapack_int * info)

d for divide and conquer, so obviously iwork + liwork crash the party 🫶

   void LAPACK_dsygvx (lapack_int * itype, char * jobz, char * range, char *
       uplo, lapack_int * n, double * a, lapack_int * lda, double * b,
       lapack_int * ldb, double * vl, double * vu, lapack_int * il, lapack_int
       * iu, double * abstol, lapack_int * m, double * w, double * z,
       lapack_int * ldz, double * work, lapack_int * lwork, lapack_int * iwork,
       lapack_int * ifail, lapack_int * info)

itype + jobz + range + uplo up top, ifail at the bottom, and everything in between. she's the longest one in this chunk and she knows it 👑


then we slid into the rfs/rfsx refinement section and the error-bound girlies arrived 🌈

   void LAPACK_dsyrfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       double * a, lapack_int * lda, const double * af, lapack_int * ldaf,
       const lapack_int * ipiv, const double * b, lapack_int * ldb, double * x,
       lapack_int * ldx, double * ferr, double * berr, double * work,
       lapack_int * iwork, lapack_int * info)

a, af, ipiv, b all const — she's reading the whole history of your factorization and just reporting ferr and berr 💜

   void LAPACK_dsyrfsx (char * uplo, char * equed, lapack_int * n, lapack_int *
       nrhs, const double * a, lapack_int * lda, const double * af, lapack_int
       * ldaf, const lapack_int * ipiv, const double * s, const double * b,
       lapack_int * ldb, double * x, lapack_int * ldx, double * rcond, double *
       berr, lapack_int * n_err_bnds, double * err_bnds_norm, double *
       err_bnds_comp, lapack_int * nparams, double * params, double * work,
       lapack_int * iwork, lapack_int * info)

equed, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params — she is the "extra" friend and every group chat needs one 😭


now the dsysv cinematic universe. same name, so many suffixes, all valid 🎬

   void LAPACK_dsysv (char * uplo, lapack_int * n, lapack_int * nrhs, double *
       a, lapack_int * lda, lapack_int * ipiv, double * b, lapack_int * ldb,
       double * work, lapack_int * lwork, lapack_int * info)

the original recipe. a, ipiv, b, work, lwork, info. simple, clean, slays ✨

   void LAPACK_dsysv_aa (char * uplo, lapack_int * n, lapack_int * nrhs, double
       * a, lapack_int * lda, lapack_int * ipiv, double * b, lapack_int * ldb,
       double * work, lapack_int * lwork, lapack_int * info)

_aa girlie. identical arg list to the one above, and no I'm not joking, go look 🫶

   void LAPACK_dsysv_aa_2stage (char * uplo, lapack_int * n, lapack_int * nrhs,
       double * a, lapack_int * lda, double * tb, lapack_int * ltb, lapack_int
       * ipiv, lapack_int * ipiv2, double * b, lapack_int * ldb, double * work,
       lapack_int * lwork, lapack_int * info)

tb, ltb, ipiv AND ipiv2?? two pivot arrays, two stages, zero chill. obsessed 💅

   void LAPACK_dsysv_rk (char * uplo, lapack_int * n, lapack_int * nrhs, double
       * a, lapack_int * lda, double * e, lapack_int * ipiv, double * b,
       lapack_int * ldb, double * work, lapack_int * lwork, lapack_int * info)

_rk brought e along for the ride. small arg, big vibe 🌸

   void LAPACK_dsysv_rook (char * uplo, lapack_int * n, lapack_int * nrhs,
       double * a, lapack_int * lda, lapack_int * ipiv, double * b, lapack_int
       * ldb, double * work, lapack_int * lwork, lapack_int * info)

rook pivoting era. no e, no tb, just the classics. she's lowkey the most normal one here 💀

   void LAPACK_dsysvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, const double * a, lapack_int * lda, double * af, lapack_int *
       ldaf, lapack_int * ipiv, const double * b, lapack_int * ldb, double * x,
       lapack_int * ldx, double * rcond, double * ferr, double * berr, double *
       work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)

fact is back, a and b are const, af is not — she knows exactly what she's allowed to touch 🙈

   void LAPACK_dsysvxx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, double * a, lapack_int * lda, double * af, lapack_int * ldaf,
       lapack_int * ipiv, char * equed, double * s, double * b, lapack_int *
       ldb, double * x, lapack_int * ldx, double * rcond, double * rpvgrw,
       double * berr, lapack_int * n_err_bnds, double * err_bnds_norm, double *
       err_bnds_comp, lapack_int * nparams, double * params, double * work,
       lapack_int * iwork, lapack_int * info)

the xx finale: equed, rpvgrw, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. she said "give me everything" and honestly, queen behavior 👑✨


and then, right at the end, the short-king section:

   void LAPACK_dsyswapr (char * uplo, lapack_int * n, double * a, lapack_int *
       lda, lapack_int * i1, lapack_int * i2)

NO info!! not a single info in sight!! she just swaps and bounces, no reporting back, no closure, no closure at all 😭🫶

   void LAPACK_dsytrd (char * uplo, lapack_int * n, double * a, lapack_int *
       lda, double * d, double * e, double * tau, double * work, lapack_int *
       lwork, lapack_int * info)

trd girlie bringing d, e, tau AND a workspace. she came prepared 🌟

   void LAPACK_dsytrf (char * uplo, lapack_int * n, double * a, lapack_int *
       lda, lapack_int * ipiv, double * work, lapack_int * lwork, lapack_int *
       info)

the factorizer. she's the reason the rest of this section even functions 💅

   void LAPACK_dsytrf_aa (char * uplo, lapack_int * n, double * a, lapack_int *
       lda, lapack_int * ipiv, double * work, lapack_int * lwork, lapack_int *
       info)

_aa version. same args as the one right above. I'm not repeating myself, LAPACK is repeating itself 🎀

   void LAPACK_dsytrf_aa_2stage (char * uplo, lapack_int * n, double * a,
       lapack_int * lda, double * tb, lapack_int * ltb, lapack_int * ipiv,

and — bestie the source literally cuts off mid-signature right here, mid-parameter-list, ipiv dangling, no closing paren, no info. she's still typing 💀 more of her is coming in the next chunk, so don't go anywhere 🦋

...and that dangling lapack_int * ipiv2, double * work, lapack_int * lwork, lapack_int * info) at the top? that's just the elbow of a declaration that started in the last part, bestie — not a whole function, just the tail end of one. catching you up: we're still deep in the function prototypes, all the d-prefixed double-precision baddies. let's go 💅

void LAPACK_dsytrf_rk (char * uplo, lapack_int * n, double * a, lapack_int * lda, double * e, double * ipiv, double * work, lapack_int * lwork, lapack_int * info)

the _rk girlie. she's got an extra double * e slot that her plain sisters don't have, and a is fully mutable — no const in sight, she's not precious about it 💖

void LAPACK_dsytrf_rook (char * uplo, lapack_int * n, double * a, lapack_int * lda, lapack_int * ipiv, double * work, lapack_int * lwork, lapack_int * info)

rook energy 👑 same nine-argument silhouette as the classic, char * uplo first, lapack_int * info last, work/lwork doing their lil duo thing in the middle.

void LAPACK_dsytri (char * uplo, lapack_int * n, double * a, lapack_int * lda, const lapack_int * ipiv, double * work, lapack_int * info)

here's where the const era begins — ipiv is const lapack_int * and the compiler will absolutely fight you if you touch it. iconique 🌸

void LAPACK_dsytri2 (char * uplo, lapack_int * n, double * a, lapack_int * lda, const lapack_int * ipiv, double * work, lapack_int * lwork, lapack_int * info)

same as her big sis but with lapack_int * lwork tucked in before info. the "2" is giving sequel-that-ate 🔥

void LAPACK_dsytri2x (char * uplo, lapack_int * n, double * a, lapack_int * lda, const lapack_int * ipiv, double * work, lapack_int * nb, lapack_int * info)

plot twist: no lwork at all — she takes lapack_int * nb instead, and honestly that's her whole personality 🦋

void LAPACK_dsytri_3 (char * uplo, lapack_int * n, double * a, lapack_int * lda, const double * e, const lapack_int * ipiv, double * work, lapack_int * lwork, lapack_int * info)

two const qualifiers in one signature, const double * e AND const lapack_int * ipiv. read-only royalty, we stan ✨

void LAPACK_dsytrs (char * uplo, lapack_int * n, lapack_int * nrhs, const double * a, lapack_int * lda, const lapack_int * ipiv, double * b, lapack_int * ldb, lapack_int * info)

nine args, a and ipiv both const, b and ldb ready to be written into. she's a worker bee fr fr 💜

void LAPACK_dsytrs2 (char * uplo, lapack_int * n, lapack_int * nrhs, const double * a, lapack_int * lda, const lapack_int * ipiv, double * b, lapack_int * ldb, double * work, lapack_int * info)

the sequel again — everyone from the original plus a double * work glow-up at the end, right before info 😌

void LAPACK_dsytrs_3 (char * uplo, lapack_int * n, lapack_int * nrhs, const double * a, lapack_int * lda, const double * e, const lapack_int * ipiv, double * b, lapack_int * ldb, lapack_int * info)

the _3 variant brings that const double * e along for the ride — matching her _3 factorization bestie, as she should 🎀

void LAPACK_dsytrs_aa (char * uplo, lapack_int * n, lapack_int * nrhs, const double * a, lapack_int * lda, const lapack_int * ipiv, double * b, lapack_int * ldb, double * work, lapack_int * lwork, lapack_int * info)

aa means extra work AND extra lwork — she is high maintenance and we respect it 🫶

void LAPACK_dsytrs_aa_2stage (char * uplo, lapack_int * n, lapack_int * nrhs, double * a, lapack_int * lda, double * tb, lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2, double * b, lapack_int * ldb, lapack_int * info)

okay THIS one is the whole group chat: tb, ltb, ipiv, ipiv2 — and notice both a and tb are plain non-const double *, no read-only anything. two-stage main character energy 👑🔥

void LAPACK_dsytrs_rook (char * uplo, lapack_int * n, lapack_int * nrhs, const double * a, lapack_int * lda, const lapack_int * ipiv, double * b, lapack_int * ldb, lapack_int * info)

rook-flavored solve, nine args, const on a and ipiv, and she's out the door. slay 💅


okay switching vibes — welcome to the dt section, aka the triangular / banded girls. same pointer obsession, different flavor 🌈

void LAPACK_dtbcon (char * norm, char * uplo, char * diag, lapack_int * n, lapack_int * kd, const double * ab, lapack_int * ldab, double * rcond, double * work, lapack_int * iwork, lapack_int * info)

three char * character arguments stacked at the front (norm, uplo, diag), a rcond output, and both a double * work and a lapack_int * iwork. bilingual queen ⭐

void LAPACK_dtbrfs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * kd, lapack_int * nrhs, const double * ab, lapack_int * ldab, const double * b, lapack_int * ldb, const double * x, lapack_int * ldx, double * ferr, double * berr, double * work, lapack_int * iwork, lapack_int * info)

count them: seventeen arguments. SEVENTEEN. ferr and berr both hang out at the end like a matching set, and three of the inputs are const. iconic stamina tbh 😤

void LAPACK_dtbtrs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * kd, lapack_int * nrhs, const double * ab, lapack_int * ldab, double * b, lapack_int * ldb, lapack_int * info)

the solve sibling — much chiller, only eleven, const double * ab held down and b free to get overwritten 💖

void LAPACK_dtfsm (char * transr, char * side, char * uplo, char * trans, char * diag, lapack_int * m, lapack_int * n, double * alpha, const double * a, double * b, lapack_int * ldb)

⚠️ bestie look at the end — there is no lapack_int * info on this one. it just stops after ldb. not a typo, that's genuinely the signature. no error channel, no notes, she simply leaves 🌸

void LAPACK_dtftri (char * transr, char * uplo, char * diag, lapack_int * n, double * a, lapack_int * info)

short and sweet — five inputs and an info, and transr is spelled with that extra r so don't come for me 🦋

void LAPACK_dtfttp (char * transr, char * uplo, lapack_int * n, const double * arf, double * ap, lapack_int * info)

arf in, ap out, arf is const because she's a guest, ap is not because she's the host 💜

void LAPACK_dtfttr (char * transr, char * uplo, lapack_int * n, const double * arf, double * a, lapack_int * lda, lapack_int * info)

same deal but landing in a with a lda on the side. the reverse-direction girls are so real for this 🎀

void LAPACK_dtgevc (char * side, char * howmny, const lapack_logical * select, lapack_int * n, const double * s, lapack_int * lds, const double * p, lapack_int * ldp, double * vl, lapack_int * ldvl, double * vr, lapack_int * ldvr, lapack_int * mm, lapack_int * m, double * work, lapack_int * info)

sixteen arguments and one lapack_logical * cameo. vl/vr are the un-const ones — the outputs — while s and p stay respectfully read-only. also mm and m sitting next to each other, chaos 🔥

void LAPACK_dtgexc (lapack_logical * wantq, lapack_logical * wantz, lapack_int * n, double * a, lapack_int * lda, double * b, lapack_int * ldb, double * q, lapack_int * ldq, double * z, lapack_int * ldz, lapack_int * ifst, lapack_int * ilst, double * work, lapack_int * lwork, lapack_int * info)

TWO lapack_logical * up front — wantq and wantz — plus the iconic ifst/ilst pair. nothing is const here, it's a free-for-all 🙈

void LAPACK_dtgsen (lapack_int * ijob, lapack_logical * wantq, lapack_logical * wantz, const lapack_logical * select, lapack_int * n, double * a, lapack_int * lda, double * b, lapack_int * ldb, double * alphar, double * alphai, double * beta, double * q, lapack_int * ldq, double * z, lapack_int * ldz, lapack_int * m, double * pl, double * pr, double * dif, double * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

okay she's the longest so far and I need to breathe. ijob, wantq, wantz, select (the only const one!), alphar/alphai/beta, pl/pr/dif, and BOTH iwork/liwork and work/lwork pairs. twenty-six arguments. twenty-six. 💀👑

void LAPACK_dtgsja (char * jobu, char * jobv, char * jobq, lapack_int * m, lapack_int * p, lapack_int * n, lapack_int * k, lapack_int * l, double * a, lapack_int * lda, double * b, lapack_int * ldb, double * tola, double * tolb, double * alpha, double * beta, double * u, lapack_int * ldu, double * v, lapack_int * ldv, double * q, lapack_int * ldq, double * work, lapack_int * ncycle, lapack_int * info)

three job* chars, tola/tolb, alpha/beta, three whole matrices (u, v, q) with their ld* escorts, and a lapack_int * ncycle right before info. zero const anywhere. unhinged and correct ✨

void LAPACK_dtgsna (char * job, char * howmny, const lapack_logical * select, lapack_int * n, const double * a, lapack_int * lda, const double * b, lapack_int * ldb, const double * vl, lapack_int * ldvl, const double * vr, lapack_int * ldvr, double * s, double * dif, lapack_int * mm, lapack_int * m, double * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)

job and howmny (yes that's the actual spelling, do not @ me), four separate const qualifiers, and a select that is const lapack_logical *. receipts everywhere 🧾💅

void LAPACK_dtgsyl (char * trans, lapack_int * ijob, lapack_int * m, lapack_int * n, const double * a, lapack_int * lda, const double * b, lapack_int * ldb, double * c, lapack_int * ldc, const double * d, lapack_int * ldd, const double * e, lapack_int * lde, double * f, lapack_int * ldf, double * scale, double * dif, double * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)

a/b/d/e are all const, c/f/scale/dif are all fair game, and trans + ijob lead the parade. alphabet soup but make it couture 🍓

void LAPACK_dtpcon (char * norm, char * uplo, char * diag, lapack_int * n, const double * ap, double * rcond, double * work, lapack_int * iwork, lapack_int * info)

three chars, one const double * ap, one rcond, two work arrays. tidy, focused, gets it done 🌟

void LAPACK_dtpmqrt (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, lapack_int * l, lapack_int * nb, const double * v, lapack_int * ldv, const double * t, lapack_int * ldt, double * a, lapack_int * lda, double * b, lapack_int * ldb, double * work, lapack_int * info)

m, n, k, l, nb — five lapack_int in a row before you even meet a double. v and t are const, a and b are not. blocking-coded 💜

void LAPACK_dtpqrt (lapack_int * m, lapack_int * n, lapack_int * l, lapack_int * nb, double * a, lapack_int * lda, double * b, lapack_int * ldb, double * t, lapack_int * ldt, double * work, lapack_int * info)

same fam, no side/trans preface, and literally zero const. everybody's getting overwritten tonight 🔥

void LAPACK_dtpqrt2 (lapack_int * m, lapack_int * n, lapack_int * l, double * a, lapack_int * lda, double * b, lapack_int * ldb, double * t, lapack_int * ldt, lapack_int * info)

the 2 variant drops nb and work entirely. smaller bag, same attitude 🎀

void LAPACK_dtprfb (char * side, char * trans, char * direct, char * storev, lapack_int * m, lapack_int * n, lapack_int * k, lapack_int * l, const double * v, lapack_int * ldv, const double * t, lapack_int * ldt, double * a, lapack_int * lda, double * b, lapack_int * ldb, const double * work, lapack_int * ldwork)

FOUR character args (side, trans, direct, storev) and — heads up — ⚠️ it ends on lapack_int * ldwork with no lapack_int * info at all. also work is const here which is a fun lil curveball. maverick behavior 🦋

void LAPACK_dtprfs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * nrhs, const double * ap, const double * b, lapack_int * ldb, const double * x, lapack_int * ldx, double * ferr, double * berr, double * work, lapack_int * iwork, lapack_int * info)

ap, b, x all const (three guests), ferr/berr the twin outputs, work + iwork the twin scrubs. symmetrical queen 🌸

void LAPACK_dtptri (char * uplo, char * diag, lapack_int * n, double * ap, lapack_int * info)

five args, minimal, no notes. she said "less is more" and left 💅

void LAPACK_dtptrs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * nrhs, const double * ap, double * b, lapack_int * ldb, lapack_int * info)

ap locked down with const, b open for business. the classic in-place-glow-up structure 💖

void LAPACK_dtpttf (char * transr, char * uplo, lapack_int * n, const double * ap, double * arf, lapack_int * info)

ap → arf, one in, one out, transr with the rogue r again. consistency is a myth and I love that for her ⭐

void LAPACK_dtpttr (char * uplo, lapack_int * n, const double * ap, double * a, lapack_int * lda, lapack_int * info)

the reverse trip — ap out of the packed lane and into a, complete with a lda to hold her hand 🫶

void LAPACK_dtrcon (char * norm, char * uplo, char * diag, lapack_int * n, const double * a, lapack_int * lda, double * rcond, double * work, lapack_int * iwork, lapack_int * info)

three chars, const double * a, rcond output, work + iwork duo. the dtbcon/dtpcon trio is now complete and they're all matching 👑

void LAPACK_dtrevc (char * side, char * howmny, lapack_logical * select, lapack_int * n, const double * t, lapack_int * ldt, double * vl, lapack_int * ldvl, double * vr, lapack_int * ldvr, lapack_int * mm, lapack_int * m, double * work, lapack_int * info)

note the difference from LAPACK_dtgsna: here select is a plain lapack_logical *, NOT const. same word, different rules — iykyk 😭

void LAPACK_dtrexc (char * compq, lapack_int * n, double * t, lapack_int * ldt, double * q, lapack_int * ldq, lapack_int * ifst, lapack_int * ilst, double * work, lapack_int * info)

compq instead of compz/compq chaos, plus the iconic ifst/ilst duo again. no lwork though — work flies solo 🦋

void LAPACK_dtrrfs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * nrhs, const double * a, lapack_int * lda, const double * b, lapack_int * ldb, const double * x, lapack_int * ldx, double * ferr, double * berr, double * work, lapack_int * iwork, lapack_int * info)

sixteen args, three const guests (a, b, x), two ferr/berr outputs, two work arrays. she's the dtprfs girlie's slightly taller sister and they share a wardrobe 🌈

void LAPACK_dtrsen (char * job, char * compq, const lapack_logical * select, lapack_int * n, double * t, lapack_int * ldt, double * q, lapack_int * ldq, double * wr, double * wi, lapack_int * m, double * s, double * sep, double * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

nineteen arguments! select is const here (unlike dtrevc, stay woke), and she's got wr/wi, s/sep, AND both work/lwork and iwork/liwork pairs. absolute unit 💀👑

void LAPACK_dtrsna (char * job, char * howmny, const lapack_logical * select, lapack_int * n, const double * t, lapack_int * ldt, const double * vl, lapack_int * ldvl, const double * vr, lapack_int * ldvr, double * s, double * sep, lapack_int * mm, lapack_int * m, double * work, lapack_int * ldwork, lapack_int * iwork, lapack_int * info)

eighteen args, select const, t/vl/vr const, and look — lapack_int * ldwork where you'd expect lwork. read it twice, it's real 🎀

void LAPACK_dtrsyl (char * trana, char * tranb, lapack_int * isgn, lapack_int * m, lapack_int * n, const double * a, lapack_int * lda, const double * b, lapack_int * ldb, double * c, lapack_int * ldc, double * scale, lapack_int * info)

TWO separate trans flags (trana, tranb) because she's doing both sides, plus an isgn. c and scale are the outputs, a and b behave themselves with const ✨

void LAPACK_dtrtri (char * uplo, char * diag, lapack_int * n, double * a, lapack_int * lda, lapack_int * info)

six args, a fully mutable, done. sometimes the short ones hit hardest 💅

void LAPACK_dtrtrs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * nrhs, const double * a, lapack_int * lda, double * b, lapack_int * ldb, lapack_int * info)

the solve version: a goes const, b stays free, nrhs joins the party. the classic triangle of trust 🌟

void LAPACK_dtrttf (char * transr, char * uplo, lapack_int * n, const double * a, lapack_int * lda, double * arf, lapack_int * info)

full → packed, a/lda const-adjacent (well, a is), arf receives. transr with the r, always 💜

void LAPACK_dtrttp (char * uplo, lapack_int * n, const double * a, lapack_int * lda, double * ap, lapack_int * info)

NO transr here — just plain uplo. she's the low-key sibling of the packed-format family, and honestly the lack of extra letters is refreshing 🍓

void LAPACK_dtzrzf (lapack_int * m, lapack_int * n, double * a, lapack_int * lda, double * tau, double * work, lapack_int * lwork, lapack_int * info)

m, n, a, lda, tau, plus the work/lwork duo and info. zero const — she came to WRITE 🔥


okay and then we've got three lil oddballs at the end of the list who are NOT void and NOT pointer-everything. pay attention bestie, these are different 💅

void LAPACK_ilaver (const lapack_int * vers_major, const lapack_int * vers_minor, const lapack_int * vers_patch)

back to void, three const lapack_int * — version major, minor, patch — and ⚠️ no lapack_int * info at the end. no error signal, no return value, she just tells you the version and ghosts 😌

lapack_logical LAPACK_lsame (char * ca, char * cb, lapack_int lca, lapack_int lcb)

look at this icon: returns a lapack_logical instead of void, and lca/lcb are passed by value — plain lapack_int, no star, no pointer, nothing. the only pointer args are the two char *. a whole different species, we love range 🦋👑

lapack_complex_double lapack_make_complex_double (double re, double im)

Definition at line 37 of file lapacke_make_complex_double.c.

she RETURNS a lapack_complex_double and takes re and im as plain by-value doubles. no pointers to be found, truly a breath of fresh air 🫶 and yes, the definition lives at line 37 of lapacke_make_complex_double.c — noted, bookmarked, memorized 📌

lapack_complex_float lapack_make_complex_float (float re, float im)

Definition at line 37 of file lapacke_make_complex_float.c.

exactly the same deal but float flavored and returning lapack_complex_float — and she's also defined at line 37 of her own file (lapacke_make_complex_float.c), which is a cute matching-placement moment if you think about it 🌸


and that's this chunk of the prototype parade! still more coming, don't wander off 💖

LAPACK_sbbcsd

void LAPACK_sbbcsd (char * jobu1, char * jobu2, char * jobv1t, char *
    jobv2t, char * trans, lapack_int * m, lapack_int * p, lapack_int * q,
    float * theta, float * phi, float * u1, lapack_int * ldu1, float * u2,
    lapack_int * ldu2, float * v1t, lapack_int * ldv1t, float * v2t,
    lapack_int * ldv2t, float * b11d, float * b11e, float * b12d, float *
    b12e, float * b21d, float * b21e, float * b22d, float * b22e, float *
    work, lapack_int * lwork, lapack_int * info)

okay this one has twenty-eight arguments bestie, she is NOT beating the "too many pointers" allegations 💀 four job chars (jobu1, jobu2, jobv1t, jobv2t) plus a trans on top — five characters deciding her whole personality. Then theta and phi like she's doing astrology not linear algebra ✨ then every combination from b11d, b11e, b12d, b12e, b21d, b21e, b22d, b22e — that's the whole 2×2 grid of little dudes, no cap. rounding out with work and lwork and, obviously, info at the end like every other function at this party 🎀


LAPACK_sbdsdc

void LAPACK_sbdsdc (char * uplo, char * compq, lapack_int * n, float * d,
    float * e, float * u, lapack_int * ldu, float * vt, lapack_int * ldvt,
    float * q, lapack_int * iq, float * work, lapack_int * iwork, lapack_int
    * info)

uplo and compq opening, n for size, then d and e (the tiniest possible variable names, she is efficient 💅), u with its ldu, vt with its ldvt, q with its iq, and both work and iwork because she needs a float workspace AND a lapack_int workspace. icon behaviour tbh. and info. always info. 🫶


LAPACK_sbdsqr

void LAPACK_sbdsqr (char * uplo, lapack_int * n, lapack_int * ncvt,
    lapack_int * nru, lapack_int * ncc, float * d, float * e, float * vt,
    lapack_int * ldvt, float * u, lapack_int * ldu, float * c, lapack_int *
    ldc, float * work, lapack_int * info)

three separate counts (ncvt, nru, ncc) which honestly is a flex — she's tracking three dimensions at once and still remembers uplo at the front 🌸 matrices vt, u and c all with their own leading dimensions, work doing the heavy lifting, info reporting at the end. the way she indexes things is genuinely iconic lowkey 🙈


LAPACK_sbdsvdx

void LAPACK_sbdsvdx (char * uplo, char * jobz, char * range, lapack_int * n,
    float * d, float * e, float * vl, float * vu, lapack_int * il,
    lapack_int * iu, lapack_int * ns, float * s, float * z, lapack_int *
    ldz, float * work, lapack_int * iwork, lapack_int * info)

three char pointers again (uplo, jobz, range) — she's got range, literally, with vl, vu, il and iu sitting right there between the brackets 👑 note ns is lapack_int * while s right beside her is float *, and z comes with ldz. plus work, iwork, info. the vdx on the end of the name is giving deluxe edition ngl 💖


LAPACK_sdisna

void LAPACK_sdisna (char * job, lapack_int * m, lapack_int * n, const float
    * d, float * sep, lapack_int * info)

a short queen!! only six params 😭 honestly refreshing after the twenty-eight-argument situation earlier. she's got job, m, n, and then — look at her — d is const float * because she would NEVER modify your input, and sep is just float * and fully mutable. respectful icon. finishes with info like always 🎀


LAPACK_sgbbrd

void LAPACK_sgbbrd (char * vect, lapack_int * m, lapack_int * n, lapack_int
    * ncc, lapack_int * kl, lapack_int * ku, float * ab, lapack_int * ldab,
    float * d, float * e, float * q, lapack_int * ldq, float * pt,
    lapack_int * ldpt, float * c, lapack_int * ldc, float * work, lapack_int
    * info)

the "many arguments" club member. vect, m, n, ncc, kl, ku — six inputs before she even gets to a matrix 💀 then ab (with ldab), d, e, q (with ldq), pt (with ldpt), c (with ldc), then work and info. every array gets a plus-one leading dimension, no gatekeeping, no favourites, we love to see it ✨


LAPACK_sgbcon

void LAPACK_sgbcon (char * norm, lapack_int * n, lapack_int * kl, lapack_int
    * ku, const float * ab, lapack_int * ldab, const lapack_int * ipiv,
    float * anorm, float * rcond, float * work, lapack_int * iwork,
    lapack_int * info)

the const respect here is off the charts: ab is const float * and ipiv is const lapack_int * — she is NOT touching your data, bestie, she's just looking 💅 starts with norm, then the trio n, kl, ku, and outputs anorm and rcond into plain non-const pointers. work, iwork, info. tidy. obsessed 🦋


LAPACK_sgbequ

void LAPACK_sgbequ (lapack_int * m, lapack_int * n, lapack_int * kl,
    lapack_int * ku, const float * ab, lapack_int * ldab, float * r, float *
    c, float * rowcnd, float * colcnd, float * amax, lapack_int * info)

no char args at all!! a purely numeric girlie, she doesn't need a 'N' or a 'U' to define her 😌 m, n, kl, ku, then ab (const, as she should) with ldab, then outputs r, c, rowcnd, colcnd, amax, and finally info. note there's no work and no iwork here — she simply does not need them, minimal queen 🎀


LAPACK_sgbequb

void LAPACK_sgbequb (lapack_int * m, lapack_int * n, lapack_int * kl,
    lapack_int * ku, const float * ab, lapack_int * ldab, float * r, float *
    c, float * rowcnd, float * colcnd, float * amax, lapack_int * info)

okay so this is LAPACK_sgbequ's sister — literally identical signature, the only difference is a lil b at the end of the name 👯‍♀️ same m, n, kl, ku, same const ab and ldab, same r, c, rowcnd, colcnd, amax, same lonely info. twins fr fr, don't mix them up, the b is load-bearing (iykyk) 🧚


LAPACK_sgbrfs

void LAPACK_sgbrfs (char * trans, lapack_int * n, lapack_int * kl,
    lapack_int * ku, lapack_int * nrhs, const float * ab, lapack_int * ldab,
    const float * afb, lapack_int * ldafb, const lapack_int * ipiv, const
    float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * ferr,
    float * berr, float * work, lapack_int * iwork, lapack_int * info)

the "I have TWO matrices" energy: ab with ldab AND afb with ldafb, both const, because she's a read-only legend 🫶 then ipiv (const) and b (const) with its ldb, and finally the outputs x (with ldx), ferr and berr. work, iwork, info. the naming is like a little code: ferr, berr, work, iwork. satisfying ngl ✨


LAPACK_sgbrfsx

void LAPACK_sgbrfsx (char * trans, char * equed, lapack_int * n, lapack_int
    * kl, lapack_int * ku, lapack_int * nrhs, const float * ab, lapack_int *
    ldab, const float * afb, lapack_int * ldafb, const lapack_int * ipiv,
    const float * r, const float * c, const float * b, lapack_int * ldb,
    float * x, lapack_int * ldx, float * rcond, float * berr, lapack_int *
    n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int *
    nparams, float * params, float * work, lapack_int * iwork, lapack_int *
    info)

she's the x version, meaning she showed up with EXTRA everything 🔥 two char args now (trans AND equed), more const inputs (r, c, b all const float *), and then the error-bound crew: n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. plus rcond, berr, work, iwork, info. that's twenty-five params bestie. twenty-five. she did not come to play 💀


LAPACK_sgbsv

void LAPACK_sgbsv (lapack_int * n, lapack_int * kl, lapack_int * ku,
    lapack_int * nrhs, float * ab, lapack_int * ldab, lapack_int * ipiv,
    float * b, lapack_int * ldb, lapack_int * info)

okay a RELATIVELY chill one, only ten params, she's the approachable friend of the group 😌 n, kl, ku, nrhs in, then ab with ldab, ipiv, b with ldb, and info closing it out. notice NO const anywhere — everything is fair game, she's allowed to mess with it 💅 slay


LAPACK_sgbsvx

void LAPACK_sgbsvx (char * fact, char * trans, lapack_int * n, lapack_int *
    kl, lapack_int * ku, lapack_int * nrhs, float * ab, lapack_int * ldab,
    float * afb, lapack_int * ldafb, lapack_int * ipiv, char * equed, float
    * r, float * c, float * b, lapack_int * ldb, float * x, lapack_int *
    ldx, float * rcond, float * ferr, float * berr, float * work, lapack_int
    * iwork, lapack_int * info)

fact and trans up top, equed sneaking in as the third char pointer in the middle there 👀 two matrices (ab/ldab and afb/ldafb), ipiv, then the scaling duo r and c, then b/ldb and x/ldx, then rcond, ferr, berr, work, iwork, info. no const at all, she's fully hands-on. main character energy, fr 🎀


LAPACK_sgbsvxx

void LAPACK_sgbsvxx (char * fact, char * trans, lapack_int * n, lapack_int *
    kl, lapack_int * ku, lapack_int * nrhs, float * ab, lapack_int * ldab,
    float * afb, lapack_int * ldafb, lapack_int * ipiv, char * equed, float
    * r, float * c, float * b, lapack_int * ldb, float * x, lapack_int *
    ldx, float * rcond, float * rpvgrw, float * berr, lapack_int *
    n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int *
    nparams, float * params, float * work, lapack_int * iwork, lapack_int *
    info)

double x, double the drama 👑 this is LAPACK_sgbsvx but she went shopping: everything from her sister plus rpvgrw and the whole error-bound entourage — n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. twenty-six params. the way she just keeps going 😭 and yes info is still last, someone has to be the responsible one 🦋


LAPACK_sgbtrf

void LAPACK_sgbtrf (lapack_int * m, lapack_int * n, lapack_int * kl,
    lapack_int * ku, float * ab, lapack_int * ldab, lapack_int * ipiv,
    lapack_int * info)

eight params, no char args, she's pure function 💅 m and n (both! not just one! she's rectangular and proud), kl, ku, the matrix ab with ldab, the ipiv array, and info. short, sweet, gets to the point. honestly? ate 🍓


LAPACK_sgbtrs

void LAPACK_sgbtrs (char * trans, lapack_int * n, lapack_int * kl,
    lapack_int * ku, lapack_int * nrhs, const float * ab, lapack_int * ldab,
    const lapack_int * ipiv, float * b, lapack_int * ldb, lapack_int * info)

last one of this batch and she's a respectful queen 🫶 trans up front, then n, kl, ku, nrhs, and look — ab is const float * and ipiv is const lapack_int *. she's NOT touching those. only b (with ldb) is fair game, then info at the end, as is tradition ✨ what a way to close out this stretch, no cap 💖

okay bestie we're deep in the s-zone now and it is a lot 💅 this whole stretch is the single-precision squad — the ones that eat float * for breakfast — and true to form, literally every single argument is a pointer. even n. even m. there is no mercy, only asterisks. and almost every last one of them ends with a lapack_int * info keeping score for you 🫶 keep scrolling, we're not even close to done.

  • LAPACK_sgebak — two char * flags off the top (job, side), an ilo/ihi duo, and const float * scale having the decency to be const. then m, v, ldv, done.
void LAPACK_sgebak (char * job, char * side, lapack_int * n, lapack_int * ilo, lapack_int * ihi, const float * scale, lapack_int * m, float * v, lapack_int * ldv, lapack_int * info)
  • LAPACK_sgebal — one char * job and then it hands you back ilo, ihi and scale, which is a lot of gifts honestly 🎁
void LAPACK_sgebal (char * job, lapack_int * n, float * a, lapack_int * lda, lapack_int * ilo, lapack_int * ihi, float * scale, lapack_int * info)
  • LAPACK_sgebrd — vowel-free name, icon behaviour. you get the d/e pair and the legendary tauq + taup duo, plus work/lwork.
void LAPACK_sgebrd (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * d, float * e, float * tauq, float * taup, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgecon — char * norm up front, const float * a being polite, then anorm, rcond, work and iwork (the integer work buffer said hi 👋).
void LAPACK_sgecon (char * norm, lapack_int * n, const float * a, lapack_int * lda, float * anorm, float * rcond, float * work, lapack_int * iwork, lapack_int * info)
  • LAPACK_sgeequ — output city: r, c, rowcnd, colcnd and amax, all float *, all yours.
void LAPACK_sgeequ (lapack_int * m, lapack_int * n, const float * a, lapack_int * lda, float * r, float * c, float * rowcnd, float * colcnd, float * amax, lapack_int * info)
  • LAPACK_sgeequb — same exact cast as sgeequ, it just brought one extra letter to the party. king behaviour, no notes 👑
void LAPACK_sgeequb (lapack_int * m, lapack_int * n, const float * a, lapack_int * lda, float * r, float * c, float * rowcnd, float * colcnd, float * amax, lapack_int * info)
  • LAPACK_sgees — got a whole LAPACK_S_SELECT2 select function pointer in there (a callback bestie, it's giving higher-order), plus sdim, wr, wi, vs, ldvs and the lapack_logical * bwork.
void LAPACK_sgees (char * jobvs, char * sort, LAPACK_S_SELECT2 select, lapack_int * n, float * a, lapack_int * lda, lapack_int * sdim, float * wr, float * wi, float * vs, lapack_int * ldvs, float * work, lapack_int * lwork, lapack_logical * bwork, lapack_int * info)
  • LAPACK_sgeesx — the deluxe edition: same select callback, then sense, rconde, rcondv, and both the iwork/liwork pair and bwork. maximum buffer energy ✨
void LAPACK_sgeesx (char * jobvs, char * sort, LAPACK_S_SELECT2 select, char * sense, lapack_int * n, float * a, lapack_int * lda, lapack_int * sdim, float * wr, float * wi, float * vs, lapack_int * ldvs, float * rconde, float * rcondv, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_logical * bwork, lapack_int * info)
  • LAPACK_sgeev — two jobs for the price of one: jobvl and jobvr, then wr/wi, plus vl/ldvl and vr/ldvr (yes the left/right twins, we love symmetry 🦋).
void LAPACK_sgeev (char * jobvl, char * jobvr, lapack_int * n, float * a, lapack_int * lda, float * wr, float * wi, float * vl, lapack_int * ldvl, float * vr, lapack_int * ldvr, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgeevx — the full buffet, no crumbs: balanc, jobvl, jobvr, sense, then wr, wi, vl/ldvl, vr/ldvr, ilo, ihi, scale, abnrm, rconde, rcondv, work/lwork and iwork. it's giving "bring everything you own" 😭
void LAPACK_sgeevx (char * balanc, char * jobvl, char * jobvr, char * sense, lapack_int * n, float * a, lapack_int * lda, float * wr, float * wi, float * vl, lapack_int * ldvl, float * vr, lapack_int * ldvr, lapack_int * ilo, lapack_int * ihi, float * scale, float * abnrm, float * rconde, float * rcondv, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)
  • LAPACK_sgehrd — ilo, ihi, one lonely tau, and the work/lwork combo. short, sweet, vowel-free 🎀
void LAPACK_sgehrd (lapack_int * n, lapack_int * ilo, lapack_int * ihi, float * a, lapack_int * lda, float * tau, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgejsv — SIX char * flags. joba, jobu, jobv, jobr, jobt, jobp. that's not a function signature that's a whole alphabet situation 💀
void LAPACK_sgejsv (char * joba, char * jobu, char * jobv, char * jobr, char * jobt, char * jobp, lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * sva, float * u, lapack_int * ldu, float * v, lapack_int * ldv, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)
  • LAPACK_sgelq — no tau here bestie, it's t and a matching tsize (the size, of the thing, iconic).
void LAPACK_sgelq (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * t, lapack_int * tsize, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgelq2 — the little sibling: back to tau, and just one work with no lwork to be found anywhere. minimalism 🧚
void LAPACK_sgelq2 (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * tau, float * work, lapack_int * info)
  • LAPACK_sgelqf — tau plus the classic work/lwork pairing. the group chat staple.
void LAPACK_sgelqf (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * tau, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgels — char * trans leading the way, then a/lda, b/ldb, work/lwork. clean, no clutter 🌸
void LAPACK_sgels (char * trans, lapack_int * m, lapack_int * n, lapack_int * nrhs, float * a, lapack_int * lda, float * b, lapack_int * ldb, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgelsd — singular values s, plus rcond, rank, the work pair and iwork riding along.
void LAPACK_sgelsd (lapack_int * m, lapack_int * n, lapack_int * nrhs, float * a, lapack_int * lda, float * b, lapack_int * ldb, float * s, float * rcond, lapack_int * rank, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)
  • LAPACK_sgelss — same shape as its sibling but the iwork didn't get invited. we've all been there 🙈
void LAPACK_sgelss (lapack_int * m, lapack_int * n, lapack_int * nrhs, float * a, lapack_int * lda, float * b, lapack_int * ldb, float * s, float * rcond, lapack_int * rank, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgelsy — and THIS one swapped the singular values out for jpvt and dropped iwork too. different vibe entirely 💅
void LAPACK_sgelsy (lapack_int * m, lapack_int * n, lapack_int * nrhs, float * a, lapack_int * lda, float * b, lapack_int * ldb, lapack_int * jpvt, float * rcond, lapack_int * rank, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgemlq — side, trans, k, and check it: const float * a, const float * t and a tsize to go with t. then c/ldc and the work pair. const-correct royalty 👑
void LAPACK_sgemlq (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const float * a, lapack_int * lda, const float * t, lapack_int * tsize, float * c, lapack_int * ldc, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgemqr — literally the same outfit as sgemlq, different name tag. twins fr fr 🫶
void LAPACK_sgemqr (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const float * a, lapack_int * lda, const float * t, lapack_int * tsize, float * c, lapack_int * ldc, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgemqrt — this one brought nb, and swapped in v/ldv + t/ldt (both const, both classy) before c/ldc and a single work.
void LAPACK_sgemqrt (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, lapack_int * nb, const float * v, lapack_int * ldv, const float * t, lapack_int * ldt, float * c, lapack_int * ldc, float * work, lapack_int * info)
  • LAPACK_sgeqlf — tau, work, lwork, info. a classic, we stan a consistent queen 🌈
void LAPACK_sgeqlf (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * tau, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgeqp3 — jpvt AND tau in the same breath, plus the full work pair. packed schedule.
void LAPACK_sgeqp3 (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, lapack_int * jpvt, float * tau, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgeqpf — same gang (jpvt, tau) but this time work shows up alone with no lwork. mysterious ✨
void LAPACK_sgeqpf (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, lapack_int * jpvt, float * tau, float * work, lapack_int * info)
  • LAPACK_sgeqr — the t + tsize combo again, plus work/lwork. consistency is a love language 💖
void LAPACK_sgeqr (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * t, lapack_int * tsize, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgeqr2 — tau and one tiny work, no lwork in sight. baby version, protected at all costs 🎀
void LAPACK_sgeqr2 (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * tau, float * work, lapack_int * info)
  • LAPACK_sgeqrf — tau with the work/lwork pairing, the version everyone actually memorised.
void LAPACK_sgeqrf (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * tau, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgeqrfp — exactly sgeqrf's lineup, just with that extra p on the end. same outfit, different accessory 🦋
void LAPACK_sgeqrfp (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * tau, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgeqrt — nb in the house, then a/lda, t/ldt, and a lonesome work with no length buddy 😭
void LAPACK_sgeqrt (lapack_int * m, lapack_int * n, lapack_int * nb, float * a, lapack_int * lda, float * t, lapack_int * ldt, float * work, lapack_int * info)
  • LAPACK_sgeqrt2 — not a single work buffer. zero. none. it said "I work alone" 💀
void LAPACK_sgeqrt2 (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * t, lapack_int * ldt, lapack_int * info)
  • LAPACK_sgeqrt3 — same energy as sgeqrt2, identical lineup, no workspace whatsoever. matching besties 🫶
void LAPACK_sgeqrt3 (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * t, lapack_int * ldt, lapack_int * info)
  • LAPACK_sgerfs — trans first, then look at all those consts: const float * a, const float * af, const lapack_int * ipiv, const float * b. respectfully, that's hot 🔥 then x/ldx, ferr, berr, work and iwork.
void LAPACK_sgerfs (char * trans, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, const float * af, lapack_int * ldaf, const lapack_int * ipiv, const float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info)
  • LAPACK_sgerfsx — the extended cut and it is loaded: trans, equed, the const cluster (a, af, ipiv, r, c, b), then x/ldx, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork. that's a whole essay 📚
void LAPACK_sgerfsx (char * trans, char * equed, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, const float * af, lapack_int * ldaf, const lapack_int * ipiv, const float * r, const float * c, const float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float * berr, lapack_int * n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int * nparams, float * params, float * work, lapack_int * iwork, lapack_int * info)
  • LAPACK_sgerqf — back to basics: tau, work, lwork, info. a palate cleanser 🍓
void LAPACK_sgerqf (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * tau, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgesdd — jobz, then singular values s, then u/ldu and vt/ldvt (yes the transpose is baked into the name, we see you). work/lwork and iwork tag along.
void LAPACK_sgesdd (char * jobz, lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * s, float * u, lapack_int * ldu, float * vt, lapack_int * ldvt, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)
  • LAPACK_sgesv — the short one. n, nrhs, a/lda, ipiv, b/ldb, info. no work, no lwork, no drama. main character efficiency 👑🌸
void LAPACK_sgesv (lapack_int * n, lapack_int * nrhs, float * a, lapack_int * lda, lapack_int * ipiv, float * b, lapack_int * ldb, lapack_int * info)
  • LAPACK_sgesvd — jobu and jobvt (note: jobvt, not jobvr — read it twice, bestie), then s, u/ldu, vt/ldvt, work/lwork. no iwork here 🙈
void LAPACK_sgesvd (char * jobu, char * jobvt, lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * s, float * u, lapack_int * ldu, float * vt, lapack_int * ldvt, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgesvdx — jobu, jobvt, range, then the interval squad vl, vu, il, iu, a ns for the count, s, u/ldu, vt/ldvt, work/lwork, and iwork came too.
void LAPACK_sgesvdx (char * jobu, char * jobvt, char * range, lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * vl, float * vu, lapack_int * il, lapack_int * iu, lapack_int * ns, float * s, float * u, lapack_int * ldu, float * vt, lapack_int * ldvt, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)
  • LAPACK_sgesvj — three flags (joba, jobu, jobv), sva singular values, mv hanging out near v/ldv, and the work/lwork pair. no iwork, sorry to that guy 💀
void LAPACK_sgesvj (char * joba, char * jobu, char * jobv, lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * sva, lapack_int * mv, float * v, lapack_int * ldv, float * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_sgesvx — saving the biggest for last in this batch: fact, trans, then a/lda, af/ldaf, ipiv, equed, r, c, b/ldb, x/ldx, rcond, ferr, berr, work, iwork, info. an absolute unit 😭🔥
void LAPACK_sgesvx (char * fact, char * trans, lapack_int * n, lapack_int * nrhs, float * a, lapack_int * lda, float * af, lapack_int * ldaf, lapack_int * ipiv, char * equed, float * r, float * c, float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info)

and that's the s-block for this stretch — still going, keep scrolling bestie, the d-double-precision crowd is lurking right around the corner 👀💜

still in the function list, bestie — hydrate before you continue 💧


🫶 LAPACK_sgesvxx

   void LAPACK_sgesvxx (char * fact, char * trans, lapack_int * n, lapack_int *
       nrhs, float * a, lapack_int * lda, float * af, lapack_int * ldaf,
       lapack_int * ipiv, char * equed, float * r, float * c, float * b,
       lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float *
       rpvgrw, float * berr, lapack_int * n_err_bnds, float * err_bnds_norm,
       float * err_bnds_comp, lapack_int * nparams, float * params, float *
       work, lapack_int * iwork, lapack_int * info)

okay so this is the extra one, the one with the double-x in the name, and it's giving main character energy because it has twenty-seven arguments. twenty-seven 😭. You've got fact, you've got trans, you've got the whole a/af/ipiv factorization situation, equed plus the scaling vectors r and c, then b/x with their own ldb/ldx, then rcond, rpvgrw, berr, and a whole lil reporting suite in n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params. Plus work, iwork and info at the end like always. She does it all, no cap.


✨ LAPACK_sgetf2

   void LAPACK_sgetf2 (lapack_int * m, lapack_int * n, float * a, lapack_int *
       lda, lapack_int * ipiv, lapack_int * info)

the little unblocked one 💅 six args, m and n, the matrix a with lda, the pivot array ipiv, and info doing its thing. unbothered, unfazed, lowkey iconic.


🎀 LAPACK_sgetrf

   void LAPACK_sgetrf (lapack_int * m, lapack_int * n, float * a, lapack_int *
       lda, lapack_int * ipiv, lapack_int * info)

same exact shape as sgetf2 — m, n, a, lda, ipiv, info — but this is the blocked version, the one your advisor actually wants you to call. same signature, different vibe bestie 🔥


🦋 LAPACK_sgetrf2

   void LAPACK_sgetrf2 (lapack_int * m, lapack_int * n, float * a, lapack_int *
       lda, lapack_int * ipiv, lapack_int * info)

and then there's sgetrf2 with the identical argument list again: m, n, a, lda, ipiv, info. three sibling routines, one signature. the way this family commits to a bit is honestly so real of them 🌸


👑 LAPACK_sgetri

   void LAPACK_sgetri (lapack_int * n, float * a, lapack_int * lda, const
       lapack_int * ipiv, float * work, lapack_int * lwork, lapack_int * info)

here she is — note the const on ipiv 🫶 she's reading your pivots, not rewriting them, and we respect that boundary. a and lda walk in, work and lwork give her room to breathe, info reports back, done.


🌈 LAPACK_sgetrs

   void LAPACK_sgetrs (char * trans, lapack_int * n, lapack_int * nrhs, const
       float * a, lapack_int * lda, const lapack_int * ipiv, float * b,
       lapack_int * ldb, lapack_int * info)

double const situation ✨ a is const float *, ipiv is const lapack_int *, meaning she is reading that factored matrix and those pivots and NOT touching them, periodt. trans is your char * vibe check, b with ldb is where the action lands, nrhs, n, and info round it out.


💜 LAPACK_sgetsls

   void LAPACK_sgetsls (char * trans, lapack_int * m, lapack_int * n,
       lapack_int * nrhs, float * a, lapack_int * lda, float * b, lapack_int *
       ldb, float * work, lapack_int * lwork, lapack_int * info)

sgetsls — and here you get both m and n (not just n, bestie, look again 👀), plus trans, nrhs, a/lda, b/ldb, work/lwork and info. and nope, a is a plain float * this time, no const to be found 🙈 she's allowed to touch.


🍓 LAPACK_sggbak

   void LAPACK_sggbak (char * job, char * side, lapack_int * n, lapack_int *
       ilo, lapack_int * ihi, const float * lscale, const float * rscale,
       lapack_int * m, float * v, lapack_int * ldv, lapack_int * info)

two char * flags out front (job and side), the index range ilo/ihi, and both lscale and rscale holding it down as const float *. then m, v with ldv, and info. she's a back-transformer and she knows it 💅


⭐ LAPACK_sggbal

   void LAPACK_sggbal (char * job, lapack_int * n, float * a, lapack_int * lda,
       float * b, lapack_int * ldb, lapack_int * ilo, lapack_int * ihi, float *
       lscale, float * rscale, float * work, lapack_int * info)

job gets her started, n says how many, then two matrices at once — a/lda and b/ldb — because this whole sgg family is a two-matrix household 🫶. ilo and ihi come out, lscale and rscale (non-const here! she writes them ✍️), plus work and info.


🔥 LAPACK_sgges

   void LAPACK_sgges (char * jobvsl, char * jobvsr, char * sort,
       LAPACK_S_SELECT3 selctg, lapack_int * n, float * a, lapack_int * lda,
       float * b, lapack_int * ldb, lapack_int * sdim, float * alphar, float *
       alphai, float * beta, float * vsl, lapack_int * ldvsl, float * vsr,
       lapack_int * ldvsr, float * work, lapack_int * lwork, lapack_logical *
       bwork, lapack_int * info)

okay THIS one, look at LAPACK_S_SELECT3 selctg sitting there in the middle 🧚 that's the selector thingie you hand over, sandwiched between sort and n. Then the two matrices a/lda, b/ldb, the outputs sdim, alphar, alphai, beta, both eigenvector homes vsl/ldvsl and vsr/ldvsr, then work/lwork, a lapack_logical * bwork, and info. she's booked and busy.


🌸 LAPACK_sgges3

   void LAPACK_sgges3 (char * jobvsl, char * jobvsr, char * sort,
       LAPACK_S_SELECT3 selctg, lapack_int * n, float * a, lapack_int * lda,
       float * b, lapack_int * ldb, lapack_int * sdim, float * alphar, float *
       alphai, float * beta, float * vsl, lapack_int * ldvsl, float * vsr,
       lapack_int * ldvsr, float * work, lapack_int * lwork, lapack_logical *
       bwork, lapack_int * info)

character for character the same list as sgges — jobvsl, jobvsr, sort, selctg, n, a, lda, b, ldb, sdim, alphar, alphai, beta, vsl, ldvsl, vsr, ldvsr, work, lwork, bwork, info — just with a lil 3 on the end like a limited edition drop ✨


🧚 LAPACK_sggesx

   void LAPACK_sggesx (char * jobvsl, char * jobvsr, char * sort,
       LAPACK_S_SELECT3 selctg, char * sense, lapack_int * n, float * a,
       lapack_int * lda, float * b, lapack_int * ldb, lapack_int * sdim, float
       * alphar, float * alphai, float * beta, float * vsl, lapack_int * ldvsl,
       float * vsr, lapack_int * ldvsr, float * rconde, float * rcondv, float *
       work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork,
       lapack_logical * bwork, lapack_int * info)

the x version said "add a sense flag AND another whole set of workspace args" and honestly? ate 💅. you get the whole sgges lineup, plus sense, plus rconde and rcondv, plus BOTH work/lwork and iwork/liwork, plus bwork and info. twenty-six arguments, all present and accounted for, no notes.


💖 LAPACK_sggev

   void LAPACK_sggev (char * jobvl, char * jobvr, lapack_int * n, float * a,
       lapack_int * lda, float * b, lapack_int * ldb, float * alphar, float *
       alphai, float * beta, float * vl, lapack_int * ldvl, float * vr,
       lapack_int * ldvr, float * work, lapack_int * lwork, lapack_int * info)

job flags jobvl and jobvr up top (left and right, balanced queen 👑), then n, the pair a/lda and b/ldb, outputs alphar, alphai, beta, then vl/ldvl and vr/ldvr, work/lwork, info. notice there's no sort and no selector here — different routine, different rules, iykyk.


🎀 LAPACK_sggev3

   void LAPACK_sggev3 (char * jobvl, char * jobvr, lapack_int * n, float * a,
       lapack_int * lda, float * b, lapack_int * ldb, float * alphar, float *
       alphai, float * beta, float * vl, lapack_int * ldvl, float * vr,
       lapack_int * ldvr, float * work, lapack_int * lwork, lapack_int * info)

same list as sggev, top to bottom, no deviations: jobvl, jobvr, n, a, lda, b, ldb, alphar, alphai, beta, vl, ldvl, vr, ldvr, work, lwork, info. consistency is her love language 🫶


💀 LAPACK_sggevx

   void LAPACK_sggevx (char * balanc, char * jobvl, char * jobvr, char * sense,
       lapack_int * n, float * a, lapack_int * lda, float * b, lapack_int *
       ldb, float * alphar, float * alphai, float * beta, float * vl,
       lapack_int * ldvl, float * vr, lapack_int * ldvr, lapack_int * ilo,
       lapack_int * ihi, float * lscale, float * rscale, float * abnrm, float *
       bbnrm, float * rconde, float * rcondv, float * work, lapack_int * lwork,
       lapack_int * iwork, lapack_logical * bwork, lapack_int * info)

FOUR char * flags in a row — balanc, jobvl, jobvr, sense — and then it just keeps going 😭. n, a/lda, b/ldb, alphar, alphai, beta, vl/ldvl, vr/ldvr, the ilo/ihi pair, both scales lscale and rscale, the norms abnrm and bbnrm, the condition numbers rconde and rcondv, then work/lwork, iwork, bwork, and info. twenty-nine args. twenty-nine. she didn't come to play.


🦋 LAPACK_sggglm

   void LAPACK_sggglm (lapack_int * n, lapack_int * m, lapack_int * p, float *
       a, lapack_int * lda, float * b, lapack_int * ldb, float * d, float * x,
       float * y, float * work, lapack_int * lwork, lapack_int * info)

three dimension args right off the bat — n, m, p — then a/lda and b/ldb, then d, x, y (three result vectors, spoiled 💅), then work/lwork and info. cute, compact, to the point.


🌈 LAPACK_sgghd3

   void LAPACK_sgghd3 (char * compq, char * compz, lapack_int * n, lapack_int *
       ilo, lapack_int * ihi, float * a, lapack_int * lda, float * b,
       lapack_int * ldb, float * q, lapack_int * ldq, float * z, lapack_int *
       ldz, float * work, lapack_int * lwork, lapack_int * info)

compq and compz lead the way ✨, then n, the ilo/ihi range, the two matrices a/lda and b/ldb, then q/ldq AND z/ldz (two accumulators, fancy), plus work/lwork and info.


🌸 LAPACK_sgghrd

   void LAPACK_sgghrd (char * compq, char * compz, lapack_int * n, lapack_int *
       ilo, lapack_int * ihi, float * a, lapack_int * lda, float * b,
       lapack_int * ldb, float * q, lapack_int * ldq, float * z, lapack_int *
       ldz, lapack_int * info)

literally the same argument list as sgghd3 but without work and lwork — so: compq, compz, n, ilo, ihi, a, lda, b, ldb, q, ldq, z, ldz, info. same fit, slightly less luggage 🎀


⭐ LAPACK_sgglse

   void LAPACK_sgglse (lapack_int * m, lapack_int * n, lapack_int * p, float *
       a, lapack_int * lda, float * b, lapack_int * ldb, float * c, float * d,
       float * x, float * work, lapack_int * lwork, lapack_int * info)

m, n, p — the triple threat 💅 — then a/lda, b/ldb, the vectors c and d, the answer lands in x, and work/lwork plus info handle the rest.


🧚 LAPACK_sggqrf

   void LAPACK_sggqrf (lapack_int * n, lapack_int * m, lapack_int * p, float *
       a, lapack_int * lda, float * taua, float * b, lapack_int * ldb, float *
       taub, float * work, lapack_int * lwork, lapack_int * info)

note the dimension order — n, m, p — not m, n, p. look at it twice, bestie 👀. then a/lda with its taua, b/ldb with its taub, then work/lwork and info.


🎀 LAPACK_sggrqf

   void LAPACK_sggrqf (lapack_int * m, lapack_int * p, lapack_int * n, float *
       a, lapack_int * lda, float * taua, float * b, lapack_int * ldb, float *
       taub, float * work, lapack_int * lwork, lapack_int * info)

and here the triple is m, p, n — a third different order 🫠 — followed by the same a/lda/taua, b/ldb/taub, work/lwork, info combo. these routines really said "we contain multitudes".


🔥 LAPACK_sggsvd

   void LAPACK_sggsvd (char * jobu, char * jobv, char * jobq, lapack_int * m,
       lapack_int * n, lapack_int * p, lapack_int * k, lapack_int * l, float *
       a, lapack_int * lda, float * b, lapack_int * ldb, float * alpha, float *
       beta, float * u, lapack_int * ldu, float * v, lapack_int * ldv, float *
       q, lapack_int * ldq, float * work, lapack_int * iwork, lapack_int *
       info)

three job flags — jobu, jobv, jobq — then m, n, p, then k and l (two output dimensions, she's generous), then a/lda, b/ldb, the alpha and beta pair, then U, V and Q with u/ldu, v/ldv, q/ldq respectively. wrap it up with work, iwork, info and you're so done. note: no lwork here, just work — that's the tea ☕


💜 LAPACK_sggsvd3

   void LAPACK_sggsvd3 (char * jobu, char * jobv, char * jobq, lapack_int * m,
       lapack_int * n, lapack_int * p, lapack_int * k, lapack_int * l, float *
       a, lapack_int * lda, float * b, lapack_int * ldb, float * alpha, float *
       beta, float * u, lapack_int * ldu, float * v, lapack_int * ldv, float *
       q, lapack_int * ldq, float * work, lapack_int * lwork, lapack_int *
       iwork, lapack_int * info)

spot the difference bestie 🔍 — same list as sggsvd, except work now has a lwork bestie right after it: ... float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info). everything else — jobu, jobv, jobq, m, n, p, k, l, a, lda, b, ldb, alpha, beta, u, ldu, v, ldv, q, ldq — identical. slay for growth ✨


🍓 LAPACK_sggsvp

   void LAPACK_sggsvp (char * jobu, char * jobv, char * jobq, lapack_int * m,
       lapack_int * p, lapack_int * n, float * a, lapack_int * lda, float * b,
       lapack_int * ldb, float * tola, float * tolb, lapack_int * k, lapack_int
       * l, float * u, lapack_int * ldu, float * v, lapack_int * ldv, float *
       q, lapack_int * ldq, lapack_int * iwork, float * tau, float * work,
       lapack_int * info)

okay watch the dimensions because she does m, p, n — yeah, p in the MIDDLE 😭 — then a/lda, b/ldb, then the tolerances tola and tolb, outputs k and l, then u/ldu, v/ldv, q/ldq, and finally iwork, tau, work, info. and yes, iwork comes before tau and work here. no rules, only vibes 💅


🦋 LAPACK_sggsvp3

   void LAPACK_sggsvp3 (char * jobu, char * jobv, char * jobq, lapack_int * m,
       lapack_int * p, lapack_int * n, float * a, lapack_int * lda, float * b,
       lapack_int * ldb, float * tola, float * tolb, lapack_int * k, lapack_int
       * l, float * u, lapack_int * ldu, float * v, lapack_int * ldv, float *
       q, lapack_int * ldq, lapack_int * iwork, float * tau, float * work,
       lapack_int * lwork, lapack_int * info)

same as sggsvp with ONE little extra: lapack_int * lwork tucked between work and info 🫶. everything else matches exactly, iwork-before-tau weirdness included. she's the upgraded model.


🌈 LAPACK_sgtcon

   void LAPACK_sgtcon (char * norm, lapack_int * n, const float * dl, const
       float * d, const float * du, const float * du2, const lapack_int * ipiv,
       float * anorm, float * rcond, float * work, lapack_int * iwork,
       lapack_int * info)

look at ALL those consts 😍 — dl, d, du, du2 and even ipiv are const, meaning she only reads them. norm sets the tone, n sets the size, and anorm, rcond, work, iwork, info are the outputs-and-scratch crew.


🎀 LAPACK_sgtrfs

   void LAPACK_sgtrfs (char * trans, lapack_int * n, lapack_int * nrhs, const
       float * dl, const float * d, const float * du, const float * dlf, const
       float * df, const float * duf, const float * du2, const lapack_int *
       ipiv, const float * b, lapack_int * ldb, float * x, lapack_int * ldx,
       float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int
       * info)

the const situation here is unreal — dl, d, du, dlf, df, duf, du2, ipiv and b are ALL const, and the only non-const float pointers are x, ferr, berr and work 🔥. trans and nrhs up front, ldb and ldx on duty, iwork and info closing it out. she's a pure function in spirit and we love her for it.


⭐ LAPACK_sgtsv

   void LAPACK_sgtsv (lapack_int * n, lapack_int * nrhs, float * dl, float * d,
       float * du, float * b, lapack_int * ldb, lapack_int * info)

tiny icon behaviour: n, nrhs, the tridiagonal trio dl, d, du, then b with ldb, then info. eight args total, no work in sight, unbothered 🧚


💖 LAPACK_sgtsvx

   void LAPACK_sgtsvx (char * fact, char * trans, lapack_int * n, lapack_int *
       nrhs, const float * dl, const float * d, const float * du, float * dlf,
       float * df, float * duf, float * du2, lapack_int * ipiv, const float *
       b, lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float *
       ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info)

and the x version, because of course there's an x version 💅. fact and trans lead, then n/nrhs, then the const input trio dl, d, du — but the factored trio dlf, df, duf plus du2 and ipiv are NOT const, because she writes them. b is const float * while x is not (guess which one gets overwritten 👀). then rcond, ferr, berr, work, iwork, info. twenty-two args of pure structure. beautiful, honestly.


we out here still cataloguing, bestie — the list keeps going and so do we 🧚

okay so heads up bestie — this stretch of the page is the no-frills zone 🌸. Like, some of these entries are literally just the prototype and nothing else. No prose, no "returns the…", no deets. So that's exactly what you're getting: the signature, verbatim, character for character, plus me yelling about it. No invented lore, no guessing, no cap 💅


LAPACK_sgttrf

void LAPACK_sgttrf (lapack_int * n, float * dl, float * d, float * du, float * du2, lapack_int * ipiv, lapack_int * info)

seven (7) arguments, and three of them are named dl, d, du — the naming is fighting for its life here and honestly? iconic. every single thing is a pointer, because that's just how this header rolls 🎀

LAPACK_sgttrs

void LAPACK_sgttrs (char * trans, lapack_int * n, lapack_int * nrhs, const float * dl, const float * d, const float * du, const float * du2, const lapack_int * ipiv, float * b, lapack_int * ldb, lapack_int * info)

the sibling of the one above (one letter off, trf → trs, iykyk). eleven args. note that dl, d, du, du2 and ipiv are all const here while b is not — the consts are telling you who's not getting touched 🙈

LAPACK_shgeqz

void LAPACK_shgeqz (char * job, char * compq, char * compz, lapack_int * n, lapack_int * ilo, lapack_int * ihi, float * h, lapack_int * ldh, float * t, lapack_int * ldt, float * alphar, float * alphai, float * beta, float * q, lapack_int * ldq, float * z, lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * info)

twenty-one arguments. TWENTY-ONE. this is the main character of parameter lists, fr fr 👑 three char * mode switches right at the front (job, compq, compz) and then it's just ld-prefixed leading dimensions all the way down. lwork is there, info is there, the whole gang showed up.

LAPACK_shsein

void LAPACK_shsein (char * job, char * eigsrc, char * initv, lapack_logical * select, lapack_int * n, const float * h, lapack_int * ldh, float * wr, const float * wi, float * vl, lapack_int * ldvl, float * vr, lapack_int * ldvr, lapack_int * mm, lapack_int * m, float * work, lapack_int * ifaill, lapack_int * ifailr, lapack_int * info)

nineteen args, and yes that is a lapack_logical * in there — select — which is the header's very own logical type, not your plain int. also clock mm and m living side by side. two m's. one page. no notes 💀

LAPACK_shseqr

void LAPACK_shseqr (char * job, char * compz, lapack_int * n, lapack_int * ilo, lapack_int * ihi, float * h, lapack_int * ldh, float * wr, float * wi, float * z, lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * info)

fourteen args, two char * mode switches (job, compz), and the ilo / ihi duo making its little appearance like it does all over this header 🦋 wr and wi are separate float *s, in case you were wondering whether real and imaginary got their own slots — they did ✨

LAPACK_slacn2

void LAPACK_slacn2 (lapack_int * n, float * v, float * x, lapack_int * isgn, float * est, lapack_int * kase, lapack_int * isave)

seven args, and the last one is isave — which, yes, has "save" right there in the name. kase is also there. lowercase kase. that's the name. we respect it 🫶

LAPACK_slacpy

void LAPACK_slacpy (char * uplo, lapack_int * m, lapack_int * n, const float * a, lapack_int * lda, float * b, lapack_int * ldb)

seven args. a is const float *, b is plain float * — read from a, write into b, structurally obvious. uplo leads, like it does for so many of these 💖

LAPACK_slag2d

void LAPACK_slag2d (lapack_int * m, lapack_int * n, const float * sa, lapack_int * ldsa, double * a, lapack_int * lda, lapack_int * info)

okay this one is doing the precision glow-up in the actual signature: const float * sa with ldsa, and then double * a with lda. float in, double out, and it still ends with info. the g2d in the name is not subtle and I love that for it 🔥

LAPACK_slagge

void LAPACK_slagge (lapack_int * m, lapack_int * n, lapack_int * kl, lapack_int * ku, const float * d, float * a, lapack_int * lda, lapack_int * iseed, float * work, lapack_int * info)

ten args. kl, ku, iseed, work, info — the full starter pack. d is const and a is not. consistent queen 🌈

LAPACK_slagsy

void LAPACK_slagsy (lapack_int * n, lapack_int * k, const float * d, float * a, lapack_int * lda, lapack_int * iseed, float * work, lapack_int * info)

eight args, and it's the n-flavoured cousin of LAPACK_slagge up there — same const float * d, same iseed, same work, same info. no m, no kl/ku, just n and k. slimmer. still valid 💜

LAPACK_slamch

float LAPACK_slamch (char * cmach)

look at that — this one returns a float instead of void. one single char * cmach argument. honestly refreshing after the twenty-one-argument situation earlier 😭

LAPACK_slange

float LAPACK_slange (char * norm, lapack_int * m, lapack_int * n, const float * a, lapack_int * lda, float * work)

returns float. six args. norm up front, a is const, work is a scratch float *. notice: no info. wild. it just returns the number and vibes ✨

LAPACK_slansy

float LAPACK_slansy (char * norm, char * uplo, lapack_int * n, const float * a, lapack_int * lda, float * work)

also returns float, also six args, but this time there's no m — just n — and there's a uplo in slot two. the sy at the end is doing the "n, not m×n" thing for you 🎀

LAPACK_slantr

float LAPACK_slantr (char * norm, char * uplo, char * diag, lapack_int * m, lapack_int * n, const float * a, lapack_int * lda, float * work)

returns float, eight args, three leading char *s: norm, uplo, diag. it's got both m and n though, unlike its cousin above. diag said "I'm coming too" 💅

LAPACK_slapmr

void LAPACK_slapmr (lapack_logical * forwrd, lapack_int * m, lapack_int * n, float * x, lapack_int * ldx, lapack_int * k)

first arg is a lapack_logical * named forwrd — with that spelling, yes. six args, no info, no work. short and to the point. respect 🫶

LAPACK_slapmt

void LAPACK_slapmt (lapack_logical * forwrd, lapack_int * m, lapack_int * n, float * x, lapack_int * ldx, lapack_int * k)

okay so this is character-for-character identical to LAPACK_slapmr above except for the final letter of the name — r vs t. same forwrd, same m, n, x, ldx, k. that's not a typo on my end, bestie, that's just the page 👀

LAPACK_slapy2

float LAPACK_slapy2 (float * x, float * y)

returns float, takes exactly two float *s, x and y, and nothing else. no n, no lda, no info. two args. TWO. a minimalist. a legend ⭐

LAPACK_slapy3

float LAPACK_slapy3 (float * x, float * y, float * z)

returns float, takes x, y, z. the 2 became a 3, and a third pointer appeared. the math is mathing, the pattern is patterning 🔥

LAPACK_slarfb

void LAPACK_slarfb (char * side, char * trans, char * direct, char * storev, lapack_int * m, lapack_int * n, lapack_int * k, const float * v, lapack_int * ldv, const float * t, lapack_int * ldt, float * c, lapack_int * ldc, float * work, lapack_int * ldwork)

FOUR char * mode switches in a row: side, trans, direct, storev. then fifteen args total, and it wraps up with ldwork instead of a plain lwork — the work array brought its own leading dimension to the function 💀 obsessed.

LAPACK_slarfg

void LAPACK_slarfg (lapack_int * n, float * alpha, float * x, lapack_int * incx, float * tau)

five args. alpha and x and tau are all writable float *s — no const in sight, they're all getting touched — and there's an incx in the middle, which is that stride energy 🌸

LAPACK_slarft

void LAPACK_slarft (char * direct, char * storev, lapack_int * n, lapack_int * k, const float * v, lapack_int * ldv, const float * tau, float * t, lapack_int * ldt)

nine args, two char *s up top, and see how v and tau are const while t is not? the header is telling you which way the data flows without saying a single word. subtle. elegant. iconic 💖

LAPACK_slarfx

void LAPACK_slarfx (char * side, lapack_int * m, lapack_int * n, const float * v, float * tau, float * c, lapack_int * ldc, float * work)

eight args. side leads. v is const, tau and c and work are not. no info on this one — it's just doing its thing and leaving 🦋

LAPACK_slarnv

void LAPACK_slarnv (lapack_int * idist, lapack_int * iseed, lapack_int * n, float * x)

four args, three of them plain lapack_int *s (idist, iseed, n) and one output float * x. shortest one in this batch by a mile. cute 🎀

LAPACK_slartgp

void LAPACK_slartgp (float * f, float * g, float * cs, float * sn, float * r)

five args, all float *, all writable, zero const, zero info. f, g, cs, sn, r. that's it. that's the whole thing 💅

LAPACK_slartgs

void LAPACK_slartgs (float * x, float * y, float * sigma, float * cs, float * sn)

five float *s: x, y, sigma, cs, sn. one letter different from LAPACK_slartgp up there (p → s) and a completely different arg list. don't get them mixed up, bestie, they're siblings not twins 😭

LAPACK_slascl

void LAPACK_slascl (char * type, lapack_int * kl, lapack_int * ku, float * cfrom, float * cto, lapack_int * m, lapack_int * n, float * a, lapack_int * lda, lapack_int * info)

ten args. first arg is literally named type (not uplo, not job — type), then kl/ku, then the cfrom/cto pair, then m, n, a, lda, info. note cfrom and cto are not const here. both writable. don't ask, that's what's on the page 🌈

LAPACK_slaset

void LAPACK_slaset (char * uplo, lapack_int * m, lapack_int * n, float * alpha, float * beta, float * a, lapack_int * lda)

seven args, and alpha and beta are float *, not const float *. no info, no work. in, out, done ⭐

LAPACK_slasrt

void LAPACK_slasrt (char * id, lapack_int * n, float * d, lapack_int * info)

four args. id is a char *, d is your float *, info closes it out. smallest arg list in this whole chunk. a little minimalist moment for us 🧚


and that's the batch — every single one of them s-prefixed, every leading dimension present and accounted for, and not one of these lines got an extra sentence of explanation from the page, so I'm not making any up. prototypes keep coming, don't close the tab 💜

okay bestie we're still in the function-signature zone and it's giving long but we're thriving 💅 Every one of these is exactly what it says on the label, no cap — here's the receipts:

🫶 LAPACK_slassq

void LAPACK_slassq (lapack_int * n, float * x, lapack_int * incx, float * scale, float * sumsq)

🫶 LAPACK_slaswp

void LAPACK_slaswp (lapack_int * n, float * a, lapack_int * lda, lapack_int * k1, lapack_int * k2, const lapack_int * ipiv, lapack_int * incx)

note the const on ipiv — she's just reading, not touching ✨

🫶 LAPACK_slatms

void LAPACK_slatms (lapack_int * m, lapack_int * n, char * dist, lapack_int * iseed, char * sym, float * d, lapack_int * mode, float * cond, float * dmax, lapack_int * kl, lapack_int * ku, char * pack, float * a, lapack_int * lda, float * work, lapack_int * info)

🫶 LAPACK_slauum

void LAPACK_slauum (char * uplo, lapack_int * n, float * a, lapack_int * lda, lapack_int * info)

🫶 LAPACK_sopgtr

void LAPACK_sopgtr (char * uplo, lapack_int * n, const float * ap, const float * tau, float * q, lapack_int * ldq, float * work, lapack_int * info)

🫶 LAPACK_sopmtr

void LAPACK_sopmtr (char * side, char * uplo, char * trans, lapack_int * m, lapack_int * n, const float * ap, const float * tau, float * c, lapack_int * ldc, float * work, lapack_int * info)

🦋 LAPACK_sorbdb

void LAPACK_sorbdb (char * trans, char * signs, lapack_int * m, lapack_int * p, lapack_int * q, float * x11, lapack_int * ldx11, float * x12, lapack_int * ldx12, float * x21, lapack_int * ldx21, float * x22, lapack_int * ldx22, float * theta, float * phi, float * taup1, float * taup2, float * tauq1, float * tauq2, float * work, lapack_int * lwork, lapack_int * info)

four x blocks, four ld values, two taus per side — she's thorough and we respect it 🎀

🦋 LAPACK_sorcsd

void LAPACK_sorcsd (char * jobu1, char * jobu2, char * jobv1t, char * jobv2t, char * trans, char * signs, lapack_int * m, lapack_int * p, lapack_int * q, float * x11, lapack_int * ldx11, float * x12, lapack_int * ldx12, float * x21, lapack_int * ldx21, float * x22, lapack_int * ldx22, float * theta, float * u1, lapack_int * ldu1, float * u2, lapack_int * ldu2, float * v1t, lapack_int * ldv1t, float * v2t, lapack_int * ldv2t, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)

🦋 LAPACK_sorcsd2by1

void LAPACK_sorcsd2by1 (char * jobu1, char * jobu2, char * jobv1t, lapack_int * m, lapack_int * p, lapack_int * q, float * x11, lapack_int * ldx11, float * x21, lapack_int * ldx21, float * theta, float * u1, lapack_int * ldu1, float * u2, lapack_int * ldu2, float * v1t, lapack_int * ldv1t, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)

the 2by1 girlie has fewer args than her big sister — iconic, lowkey efficient 🌸

💜 the sorg girlies (all of them, yes all)

void LAPACK_sorgbr (char * vect, lapack_int * m, lapack_int * n, lapack_int * k, float * a, lapack_int * lda, const float * tau, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sorghr (lapack_int * n, lapack_int * ilo, lapack_int * ihi, float * a, lapack_int * lda, const float * tau, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sorglq (lapack_int * m, lapack_int * n, lapack_int * k, float * a, lapack_int * lda, const float * tau, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sorgql (lapack_int * m, lapack_int * n, lapack_int * k, float * a, lapack_int * lda, const float * tau, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sorgqr (lapack_int * m, lapack_int * n, lapack_int * k, float * a, lapack_int * lda, const float * tau, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sorgrq (lapack_int * m, lapack_int * n, lapack_int * k, float * a, lapack_int * lda, const float * tau, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sorgtr (char * uplo, lapack_int * n, float * a, lapack_int * lda, const float * tau, float * work, lapack_int * lwork, lapack_int * info)

same tau / work / lwork / info skeleton, different letter combo — qr, lq, ql, rq, br, hr, tr — collect the whole set fr fr ✨

💜 the sorm squad, same energy, applied to somebody else's matrix

void LAPACK_sormbr (char * vect, char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const float * a, lapack_int * lda, const float * tau, float * c, lapack_int * ldc, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sormhr (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * ilo, lapack_int * ihi, const float * a, lapack_int * lda, const float * tau, float * c, lapack_int * ldc, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sormlq (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const float * a, lapack_int * lda, const float * tau, float * c, lapack_int * ldc, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sormql (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const float * a, lapack_int * lda, const float * tau, float * c, lapack_int * ldc, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sormqr (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const float * a, lapack_int * lda, const float * tau, float * c, lapack_int * ldc, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sormrq (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, const float * a, lapack_int * lda, const float * tau, float * c, lapack_int * ldc, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sormrz (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, lapack_int * l, const float * a, lapack_int * lda, const float * tau, float * c, lapack_int * ldc, float * work, lapack_int * lwork, lapack_int * info)
void LAPACK_sormtr (char * side, char * uplo, char * trans, lapack_int * m, lapack_int * n, const float * a, lapack_int * lda, const float * tau, float * c, lapack_int * ldc, float * work, lapack_int * lwork, lapack_int * info)
bestie heads up — LAPACK_sormrz has an extra lapack_int * l that nobody else has, and LAPACK_sormhr has ilo/ihi instead of k. Not me noticing 👀 that's just what's written.

🍓 band matrix era — spb* (she's banded, she's cute, she's tridiagonal-adjacent)

void LAPACK_spbcon (char * uplo, lapack_int * n, lapack_int * kd, const float * ab, lapack_int * ldab, float * anorm, float * rcond, float * work, lapack_int * iwork, lapack_int * info)
void LAPACK_spbequ (char * uplo, lapack_int * n, lapack_int * kd, const float * ab, lapack_int * ldab, float * s, float * scond, float * amax, lapack_int * info)
void LAPACK_spbrfs (char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, const float * ab, lapack_int * ldab, const float * afb, lapack_int * ldafb, const float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info)
void LAPACK_spbstf (char * uplo, lapack_int * n, lapack_int * kb, float * bb, lapack_int * ldbb, lapack_int * info)
void LAPACK_spbsv (char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, float * ab, lapack_int * ldab, float * b, lapack_int * ldb, lapack_int * info)
void LAPACK_spbsvx (char * fact, char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, float * ab, lapack_int * ldab, float * afb, lapack_int * ldafb, char * equed, float * s, float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info)
void LAPACK_spbtrf (char * uplo, lapack_int * n, lapack_int * kd, float * ab, lapack_int * ldab, lapack_int * info)
void LAPACK_spbtrs (char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, const float * ab, lapack_int * ldab, float * b, lapack_int * ldb, lapack_int * info)

tiny detail that ate: LAPACK_spbstf takes kb / bb / ldbb while the rest of the band crew take kd / ab / ldab. Different name, same vibe. 🙈

🧚 packed / RFP era — spf* and spp*

void LAPACK_spftrf (char * transr, char * uplo, lapack_int * n, float * a, lapack_int * info)
void LAPACK_spftri (char * transr, char * uplo, lapack_int * n, float * a, lapack_int * info)
void LAPACK_spftrs (char * transr, char * uplo, lapack_int * n, lapack_int * nrhs, const float * a, float * b, lapack_int * ldb, lapack_int * info)

see that transr instead of trans? that's the RFP tell, iykyk 💅

void LAPACK_sppcon (char * uplo, lapack_int * n, const float * ap, float * anorm, float * rcond, float * work, lapack_int * iwork, lapack_int * info)
void LAPACK_sppequ (char * uplo, lapack_int * n, const float * ap, float * s, float * scond, float * amax, lapack_int * info)
void LAPACK_spprfs (char * uplo, lapack_int * n, lapack_int * nrhs, const float * ap, const float * afp, const float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info)
void LAPACK_sppsv (char * uplo, lapack_int * n, lapack_int * nrhs, float * ap, float * b, lapack_int * ldb, lapack_int * info)
void LAPACK_sppsvx (char * fact, char * uplo, lapack_int * n, lapack_int * nrhs, float * ap, float * afp, char * equed, float * s, float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info)

👑 the full/Cholesky era — spo*

void LAPACK_spocon (char * uplo, lapack_int * n, const float * a, lapack_int * lda, float * anorm, float * rcond, float * work, lapack_int * iwork, lapack_int * info)
void LAPACK_spoequ (lapack_int * n, const float * a, lapack_int * lda, float * s, float * scond, float * amax, lapack_int * info)
void LAPACK_spoequb (lapack_int * n, const float * a, lapack_int * lda, float * s, float * scond, float * amax, lapack_int * info)
void LAPACK_sporfs (char * uplo, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, const float * af, lapack_int * ldaf, const float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info)
void LAPACK_sporfsx (char * uplo, char * equed, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, const float * af, lapack_int * ldaf, const float * s, const float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float * berr, lapack_int * n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int * nparams, float * params, float * work, lapack_int * iwork, lapack_int * info)
void LAPACK_sposv (char * uplo, lapack_int * n, lapack_int * nrhs, float * a, lapack_int * lda, float * b, lapack_int * ldb, lapack_int * info)
void LAPACK_sposvx (char * fact, char * uplo, lapack_int * n, lapack_int * nrhs, float * a, lapack_int * lda, float * af, lapack_int * ldaf, char * equed, float * s, float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info)
void LAPACK_sposvxx (char * fact, char * uplo, lapack_int * n, lapack_int * nrhs, float * a, lapack_int * lda, float * af, lapack_int * ldaf, char * equed, float * s, float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float * rpvgrw, float * berr, lapack_int * n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int * nparams, float * params, float * work, lapack_int * iwork, lapack_int * info)
LAPACK_sporfsx and LAPACK_sposvxx are the extra girlies with the n_err_bnds / err_bnds_norm / err_bnds_comp / nparams / params block — and sposvxx also carries that rpvgrw on top. Long signatures but she ate 🔥

also spoequ and spoequb are literally identical signatures side by side — yes bestie, that's really how it's written, look twice 😭

🎀 positivity era — spotrf and friends

void LAPACK_spotrf (char * uplo, lapack_int * n, float * a, lapack_int * lda, lapack_int * info)
void LAPACK_spotrf2 (char * uplo, lapack_int * n, float * a, lapack_int * lda, lapack_int * info)
void LAPACK_spotri (char * uplo, lapack_int * n, float * a, lapack_int * lda, lapack_int * info)
void LAPACK_spotrs (char * uplo, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, float * b, lapack_int * ldb, lapack_int * info)

spotrf2 has the exact same arg list as spotrf — the 2 is doing all the differentiating, and honestly? main character energy 💀

and that's the whole float squad for this chunk — the double-precision twins are queued up next, so stay tuned bestie 💖

Okay so real talk: every single one of these returns void, and they all report back through that final lapack_int * info pointer like a little report card — except LAPACK_ssfrk, which has no info at all. She said what she said. 💅


LAPACK_spptrf — packed single-precision, uplo + n + ap, and info comes home with the news.

void LAPACK_spptrf (char * uplo, lapack_int * n, float * ap, lapack_int * info)

LAPACK_spptri — same trio as her sister above (uplo, n, ap) plus info, the inverse-flavoured one. 🦋

void LAPACK_spptri (char * uplo, lapack_int * n, float * ap, lapack_int * info)

LAPACK_spptrs — now with nrhs, b and ldb because we're solving, not just factoring. info stays for the receipts.

void LAPACK_spptrs (char * uplo, lapack_int * n, lapack_int * nrhs, const float * ap, float * b, lapack_int * ldb, lapack_int * info)

LAPACK_spstrf — okay this one is stacked: uplo, n, a, lda, piv, rank, tol, work, info. Whole little entourage. 👑

void LAPACK_spstrf (char * uplo, lapack_int * n, float * a, lapack_int * lda, lapack_int * piv, lapack_int * rank, float * tol, float * work, lapack_int * info)

LAPACK_sptcon — cond-estimating a tridiagonal situation: n, d, e, out comes anorm, rcond, with work and info tagging along. ✨

void LAPACK_sptcon (lapack_int * n, const float * d, const float * e, float * anorm, float * rcond, float * work, lapack_int * info)

LAPACK_spteqr — compz decides the z situation, ldz keeps it honest, work and info are the support cast. 🎀

void LAPACK_spteqr (char * compz, lapack_int * n, float * d, float * e, float * z, lapack_int * ldz, float * work, lapack_int * info)

LAPACK_sptrfs — the refinement girlie. d, e, df, ef, b, ldb, x, ldx, ferr, berr, work, info. Twelve whole moods, no cap. 😭

void LAPACK_sptrfs (lapack_int * n, lapack_int * nrhs, const float * d, const float * e, const float * df, const float * ef, const float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * ferr, float * berr, float * work, lapack_int * info)

LAPACK_sptsv — compact queen: n, nrhs, d, e, b, ldb, info. Literally the short-and-sweet one.

void LAPACK_sptsv (lapack_int * n, lapack_int * nrhs, float * d, float * e, float * b, lapack_int * ldb, lapack_int * info)

LAPACK_sptsvx — the extra version, fact first, then n, nrhs, d, e, df, ef, b, ldb, x, ldx, rcond, ferr, berr, work, info. It's giving "I brought everything". 🫶

void LAPACK_sptsvx (char * fact, lapack_int * n, lapack_int * nrhs, const float * d, const float * e, float * df, float * ef, const float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float * ferr, float * berr, float * work, lapack_int * info)

LAPACK_spttrf — just n, d, e, info. Minimalist icon behaviour.

void LAPACK_spttrf (lapack_int * n, float * d, float * e, lapack_int * info)

LAPACK_spttrs — the solve-y counterpart: n, nrhs, d, e, b, ldb, info. 🌸

void LAPACK_spttrs (lapack_int * n, lapack_int * nrhs, const float * d, const float * e, float * b, lapack_int * ldb, lapack_int * info)

LAPACK_ssbev — banded symmetric vibes. jobz, uplo, n, kd, ab, ldab, w, z, ldz, work, info. 🦋

void LAPACK_ssbev (char * jobz, char * uplo, lapack_int * n, lapack_int * kd, float * ab, lapack_int * ldab, float * w, float * z, lapack_int * ldz, float * work, lapack_int * info)

LAPACK_ssbev_2stage — same energy, but the two-stage girlie brought lwork with her. Obsessed.

void LAPACK_ssbev_2stage (char * jobz, char * uplo, lapack_int * n, lapack_int * kd, float * ab, lapack_int * ldab, float * w, float * z, lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * info)

LAPACK_ssbevd — the divide-and-conquer one, so obviously she needs iwork and liwork on top of lwork. High maintenance, high payoff. 🔥

void LAPACK_ssbevd (char * jobz, char * uplo, lapack_int * n, lapack_int * kd, float * ab, lapack_int * ldab, float * w, float * z, lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_ssbevd_2stage — same list as ssbevd, still 2stage. No notes. 💅

void LAPACK_ssbevd_2stage (char * jobz, char * uplo, lapack_int * n, lapack_int * kd, float * ab, lapack_int * ldab, float * w, float * z, lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_ssbevx — the expert one, okay, she's thorough: jobz, range, uplo, n, kd, ab, ldab, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info. Twenty-two arguments. Iconic.

void LAPACK_ssbevx (char * jobz, char * range, char * uplo, lapack_int * n, lapack_int * kd, float * ab, lapack_int * ldab, float * q, lapack_int * ldq, float * vl, float * vu, lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float * w, float * z, lapack_int * ldz, float * work, lapack_int * iwork, lapack_int * ifail, lapack_int * info)

LAPACK_ssbevx_2stage — same whole entourage, plus lwork wedged in after work. She found room. 👑

void LAPACK_ssbevx_2stage (char * jobz, char * range, char * uplo, lapack_int * n, lapack_int * kd, float * ab, lapack_int * ldab, float * q, lapack_int * ldq, float * vl, float * vu, lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float * w, float * z, lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * ifail, lapack_int * info)

LAPACK_ssbgst — vect, uplo, n, ka, kb, ab, ldab, bb, ldbb, x, ldx, work, info. Two band widths (ka and kb), she's ambidextrous.

void LAPACK_ssbgst (char * vect, char * uplo, lapack_int * n, lapack_int * ka, lapack_int * kb, float * ab, lapack_int * ldab, const float * bb, lapack_int * ldbb, float * x, lapack_int * ldx, float * work, lapack_int * info)

LAPACK_ssbgv — the generalised-eigen version: jobz, uplo, n, ka, kb, ab, ldab, bb, ldbb, w, z, ldz, work, info.

void LAPACK_ssbgv (char * jobz, char * uplo, lapack_int * n, lapack_int * ka, lapack_int * kb, float * ab, lapack_int * ldab, float * bb, lapack_int * ldbb, float * w, float * z, lapack_int * ldz, float * work, lapack_int * info)

LAPACK_ssbgvd — same as ssbgv but she also wants lwork, iwork, liwork. Fair. 🌈

void LAPACK_ssbgvd (char * jobz, char * uplo, lapack_int * n, lapack_int * ka, lapack_int * kb, float * ab, lapack_int * ldab, float * bb, lapack_int * ldbb, float * w, float * z, lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_ssbgvx — the full expert spread: jobz, range, uplo, n, ka, kb, ab, ldab, bb, ldbb, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info. Bow down. 🎀

void LAPACK_ssbgvx (char * jobz, char * range, char * uplo, lapack_int * n, lapack_int * ka, lapack_int * kb, float * ab, lapack_int * ldab, float * bb, lapack_int * ldbb, float * q, lapack_int * ldq, float * vl, float * vu, lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float * w, float * z, lapack_int * ldz, float * work, lapack_int * iwork, lapack_int * ifail, lapack_int * info)

LAPACK_ssbtrd — vect, uplo, n, kd, ab, ldab, d, e, q, ldq, work, info. Banded goes in, tridiagonal comes out, that's the whole plot.

void LAPACK_ssbtrd (char * vect, char * uplo, lapack_int * n, lapack_int * kd, float * ab, lapack_int * ldab, float * d, float * e, float * q, lapack_int * ldq, float * work, lapack_int * info)

LAPACK_ssfrk — and here she is, the only one in this whole batch with no info pointer: transr, uplo, trans, n, k, alpha, a, lda, beta, c. Chaos. Respect. 💀

void LAPACK_ssfrk (char * transr, char * uplo, char * trans, lapack_int * n, lapack_int * k, float * alpha, const float * a, lapack_int * lda, float * beta, float * c)

LAPACK_sspcon — uplo, n, ap, ipiv, anorm, rcond, plus both work and iwork, plus info. Packed storage doing the absolute most.

void LAPACK_sspcon (char * uplo, lapack_int * n, const float * ap, const lapack_int * ipiv, float * anorm, float * rcond, float * work, lapack_int * iwork, lapack_int * info)

LAPACK_sspev — jobz, uplo, n, ap, w, z, ldz, work, info. Clean, simple, ate.

void LAPACK_sspev (char * jobz, char * uplo, lapack_int * n, float * ap, float * w, float * z, lapack_int * ldz, float * work, lapack_int * info)

LAPACK_sspevd — the same, but she brought lwork, iwork, liwork too. Preparedness is a personality trait. 🫶

void LAPACK_sspevd (char * jobz, char * uplo, lapack_int * n, float * ap, float * w, float * z, lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_sspevx — jobz, range, uplo, n, ap, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info. The whole range/vl/vu/il/iu selection squad is here.

void LAPACK_sspevx (char * jobz, char * range, char * uplo, lapack_int * n, float * ap, float * vl, float * vu, lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float * w, float * z, lapack_int * ldz, float * work, lapack_int * iwork, lapack_int * ifail, lapack_int * info)

LAPACK_sspgst — note the order: itype comes first, then uplo, n, ap, bp, info. bp is const, ap is not. Read the signature, bestie, it's all there. ✨

void LAPACK_sspgst (lapack_int * itype, char * uplo, lapack_int * n, float * ap, const float * bp, lapack_int * info)

LAPACK_sspgv — itype, jobz, uplo, n, ap, bp, w, z, ldz, work, info. 🌸

void LAPACK_sspgv (lapack_int * itype, char * jobz, char * uplo, lapack_int * n, float * ap, float * bp, float * w, float * z, lapack_int * ldz, float * work, lapack_int * info)

LAPACK_sspgvd — same plus lwork, iwork, liwork. She's the "and also" of the family. 💜

void LAPACK_sspgvd (lapack_int * itype, char * jobz, char * uplo, lapack_int * n, float * ap, float * bp, float * w, float * z, lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_sspgvx — itype, jobz, range, uplo, n, ap, bp, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info. Long, but every argument is pulling her weight.

void LAPACK_sspgvx (lapack_int * itype, char * jobz, char * range, char * uplo, lapack_int * n, float * ap, float * bp, float * vl, float * vu, lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float * w, float * z, lapack_int * ldz, float * work, lapack_int * iwork, lapack_int * ifail, lapack_int * info)

LAPACK_ssprfs — refinement with the whole crew: uplo, n, nrhs, ap, afp, ipiv, b, ldb, x, ldx, ferr, berr, work, iwork, info. Note ap, afp, b are all const; x is not. 👑

void LAPACK_ssprfs (char * uplo, lapack_int * n, lapack_int * nrhs, const float * ap, const float * afp, const lapack_int * ipiv, const float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info)

LAPACK_sspsv — uplo, n, nrhs, ap, ipiv, b, ldb, info. Short, efficient, gets the job done. 🦋

void LAPACK_sspsv (char * uplo, lapack_int * n, lapack_int * nrhs, float * ap, lapack_int * ipiv, float * b, lapack_int * ldb, lapack_int * info)

LAPACK_sspsvx — the fact-forward one: fact, uplo, n, nrhs, ap, afp, ipiv, b, ldb, x, ldx, rcond, ferr, berr, work, iwork, info. She's thorough and she'd like you to know it. 😭

void LAPACK_sspsvx (char * fact, char * uplo, lapack_int * n, lapack_int * nrhs, const float * ap, float * afp, lapack_int * ipiv, const float * b, lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info)

LAPACK_ssptrd — uplo, n, ap, d, e, tau, info. Packed in, tridiagonal (d, e) out, plus tau for flavour.

void LAPACK_ssptrd (char * uplo, lapack_int * n, float * ap, float * d, float * e, float * tau, lapack_int * info)

LAPACK_ssptrf — uplo, n, ap, ipiv, info. Note the pivot array is non-const here because it's being written. 🎀

void LAPACK_ssptrf (char * uplo, lapack_int * n, float * ap, lapack_int * ipiv, lapack_int * info)

LAPACK_ssptri — inverse time, and now ipiv is const (it's an input!) and she needs work plus info.

void LAPACK_ssptri (char * uplo, lapack_int * n, float * ap, const lapack_int * ipiv, float * work, lapack_int * info)

LAPACK_ssptrs — solve time: uplo, n, nrhs, ap, ipiv (again const), b, ldb, info. 💜

void LAPACK_ssptrs (char * uplo, lapack_int * n, lapack_int * nrhs, const float * ap, const lapack_int * ipiv, float * b, lapack_int * ldb, lapack_int * info)

LAPACK_sstebz — okay she's long: range, order, n, vl, vu, il, iu, abstol, d, e, m, nsplit, w, iblock, isplit, work, iwork, info. Note order — yes, she cares about order. 🌈

void LAPACK_sstebz (char * range, char * order, lapack_int * n, float * vl, float * vu, lapack_int * il, lapack_int * iu, float * abstol, const float * d, const float * e, lapack_int * m, lapack_int * nsplit, float * w, lapack_int * iblock, lapack_int * isplit, float * work, lapack_int * iwork, lapack_int * info)

LAPACK_sstedc — compz, n, d, e, z, ldz, work, lwork, iwork, liwork, info. Both lwork and liwork, she's doing the most and slaying.

void LAPACK_sstedc (char * compz, lapack_int * n, float * d, float * e, float * z, lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_sstegr — jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, ldz, isuppz, work, lwork, iwork, liwork, info. isuppz is the main character here, lowkey.

void LAPACK_sstegr (char * jobz, char * range, lapack_int * n, float * d, float * e, float * vl, float * vu, lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float * w, float * z, lapack_int * ldz, lapack_int * isuppz, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_sstein — n, d, e, m, w, iblock, isplit, z, ldz, work, iwork, ifailv, info. And it's ifailv, with a v, not ifail. Character for character, bestie. 🔥

void LAPACK_sstein (lapack_int * n, const float * d, const float * e, lapack_int * m, const float * w, const lapack_int * iblock, const lapack_int * isplit, float * z, lapack_int * ldz, float * work, lapack_int * iwork, lapack_int * ifailv, lapack_int * info)

LAPACK_sstemr — yes girl, and she has a lapack_logical * tryrac in there, which is different from all the char * flags everywhere else. jobz, range, n, d, e, vl, vu, il, iu, m, w, z, ldz, nzc, isuppz, tryrac, work, lwork, iwork, liwork, info. 🧚

void LAPACK_sstemr (char * jobz, char * range, lapack_int * n, float * d, float * e, float * vl, float * vu, lapack_int * il, lapack_int * iu, lapack_int * m, float * w, float * z, lapack_int * ldz, lapack_int * nzc, lapack_int * isuppz, lapack_logical * tryrac, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_ssteqr — compz, n, d, e, z, ldz, work, info. She's the QR one, and she's not sorry about it.

void LAPACK_ssteqr (char * compz, lapack_int * n, float * d, float * e, float * z, lapack_int * ldz, float * work, lapack_int * info)

LAPACK_ssterf — literally just n, d, e, info. No eigenvectors, no z, no drama. Minimalism queen. ⭐

void LAPACK_ssterf (lapack_int * n, float * d, float * e, lapack_int * info)

LAPACK_sstev — jobz, n, d, e, z, ldz, work, info. 🌸

void LAPACK_sstev (char * jobz, lapack_int * n, float * d, float * e, float * z, lapack_int * ldz, float * work, lapack_int * info)

LAPACK_sstevd — same plus lwork, iwork, liwork. Divide-and-conquer tax, honestly. 💸

void LAPACK_sstevd (char * jobz, lapack_int * n, float * d, float * e, float * z, lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_sstevr — jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, ldz, isuppz, work, lwork, iwork, liwork, info. Big isuppz energy. ✨

void LAPACK_sstevr (char * jobz, char * range, lapack_int * n, float * d, float * e, float * vl, float * vu, lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float * w, float * z, lapack_int * ldz, lapack_int * isuppz, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_sstevx — jobz, range, n, d, e, vl, vu, il, iu, abstol, m, w, z, ldz, work, iwork, ifail, info. Note: ifail here, not ifailv like sstein. Keep them straight! 💅

void LAPACK_sstevx (char * jobz, char * range, lapack_int * n, float * d, float * e, float * vl, float * vu, lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float * w, float * z, lapack_int * ldz, float * work, lapack_int * iwork, lapack_int * ifail, lapack_int * info)

LAPACK_ssycon — uplo, n, a, lda, ipiv, anorm, rcond, work, iwork, info. a is const (input only), no take-backs.

void LAPACK_ssycon (char * uplo, lapack_int * n, const float * a, lapack_int * lda, const lapack_int * ipiv, float * anorm, float * rcond, float * work, lapack_int * iwork, lapack_int * info)

LAPACK_ssycon_3 — the _3 variant, and she's got an extra e wedged in right after lda: uplo, n, a, lda, e, ipiv, anorm, rcond, work, iwork, info. Yes, _3. That's the actual name. 🫶

void LAPACK_ssycon_3 (char * uplo, lapack_int * n, const float * a, lapack_int * lda, const float * e, const lapack_int * ipiv, float * anorm, float * rcond, float * work, lapack_int * iwork, lapack_int * info)

LAPACK_ssyconv — got a way parameter, which is the most Gen Z parameter name in this entire header, love that for her. uplo, way, n, a, lda, ipiv, e, info.

void LAPACK_ssyconv (char * uplo, char * way, lapack_int * n, float * a, lapack_int * lda, const lapack_int * ipiv, float * e, lapack_int * info)
Heads up bestie: in ssyconv the ipiv is const and in ssycon it's also const — but in ssptrf and sspsv above it was not, because those write pivots. Copy the signatures exactly and you'll never get got. 🙈

🌸 LAPACK_ssyequb

   void LAPACK_ssyequb (char * uplo, lapack_int * n, const float * a,
       lapack_int * lda, float * s, float * scond, float * amax, float * work,
       lapack_int * info)

okay so this one takes uplo, n, a, lda, then hands you back s, scond, amax, plus work and info — that's the whole squad right there. lowkey it's just six outputs vibing in a row. 💅


🦋 LAPACK_ssyev

   void LAPACK_ssyev (char * jobz, char * uplo, lapack_int * n, float * a,
       lapack_int * lda, float * w, float * work, lapack_int * lwork,
       lapack_int * info)

classic jobz + uplo combo, bestie. n, a, lda, then the w output, and the work/lwork duo which is giving "you tell me how much room you need and I'll use it" energy ✨


🧚 LAPACK_ssyev_2stage

   void LAPACK_ssyev_2stage (char * jobz, char * uplo, lapack_int * n, float *
       a, lapack_int * lda, float * w, float * work, lapack_int * lwork,
       lapack_int * info)

literally the same list as LAPACK_ssyev — jobz, uplo, n, a, lda, w, work, lwork, info — but with _2stage on the name, and that suffix is the whole personality here 😌


🎀 LAPACK_ssyevd

   void LAPACK_ssyevd (char * jobz, char * uplo, lapack_int * n, float * a,
       lapack_int * lda, float * w, float * work, lapack_int * lwork,
       lapack_int * iwork, lapack_int * liwork, lapack_int * info)

the d version said "let's add integer workspace too" and honestly? iconic. now you're packing iwork + liwork alongside the usual jobz, uplo, n, a, lda, w, work, lwork, info 🫶


💜 LAPACK_ssyevd_2stage

   void LAPACK_ssyevd_2stage (char * jobz, char * uplo, lapack_int * n, float *
       a, lapack_int * lda, float * w, float * work, lapack_int * lwork,
       lapack_int * iwork, lapack_int * liwork, lapack_int * info)

same signature as LAPACK_ssyevd, _2stage flair included. jobz, uplo, n, a, lda, w, work, lwork, iwork, liwork, info — that's eleven whole parameters, she's not shy 💀


🌈 LAPACK_ssyevr

   void LAPACK_ssyevr (char * jobz, char * range, char * uplo, lapack_int * n,
       float * a, lapack_int * lda, float * vl, float * vu, lapack_int * il,
       lapack_int * iu, float * abstol, lapack_int * m, float * w, float * z,
       lapack_int * ldz, lapack_int * isuppz, float * work, lapack_int * lwork,
       lapack_int * iwork, lapack_int * liwork, lapack_int * info)

okay THIS one is the main character. jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, isuppz, work, lwork, iwork, liwork, info. twenty-one parameters. twenty-one!! she ate and left no crumbs 👑


🌸 LAPACK_ssyevr_2stage

   void LAPACK_ssyevr_2stage (char * jobz, char * range, char * uplo,
       lapack_int * n, float * a, lapack_int * lda, float * vl, float * vu,
       lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float
       * w, float * z, lapack_int * ldz, float * isuppz, float * work,
       lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int
       * info)

same long list as LAPACK_ssyevr — jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, isuppz, work, lwork, iwork, liwork, info — just with the _2stage glow-up at the end ✨


🦋 LAPACK_ssyevx

   void LAPACK_ssyevx (char * jobz, char * range, char * uplo, lapack_int * n,
       float * a, lapack_int * lda, float * vl, float * vu, lapack_int * il,
       lapack_int * iu, float * abstol, lapack_int * m, float * w, float * z,
       lapack_int * ldz, float * work, lapack_int * lwork, lapack_int * iwork,
       lapack_int * ifail, lapack_int * info)

very similar to LAPACK_ssyevr energy but she swapped isuppz for ifail and dropped the iwork-length pair. full list: jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, iwork, ifail, info 💖


🎀 LAPACK_ssyevx_2stage

   void LAPACK_ssyevx_2stage (char * jobz, char * range, char * uplo,
       lapack_int * n, float * a, lapack_int * lda, float * vl, float * vu,
       lapack_int * il, lapack_int * iu, float * abstol, lapack_int * m, float
       * w, float * z, lapack_int * ldz, float * work, lapack_int * lwork,
       lapack_int * iwork, lapack_int * ifail, lapack_int * info)

LAPACK_ssyevx but make it _2stage 💅 same cast of characters: jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, iwork, ifail, info.


🍓 LAPACK_ssygst

   void LAPACK_ssygst (lapack_int * itype, char * uplo, lapack_int * n, float *
       a, lapack_int * lda, const float * b, lapack_int * ldb, lapack_int *
       info)

short and sweet, ngl. itype first, then uplo, n, a, lda, then b comes in as a const float * with its own ldb, and info closes the curtain 🎬


⭐ LAPACK_ssygv

   void LAPACK_ssygv (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, float * a, lapack_int * lda, float * b, lapack_int * ldb, float *
       w, float * work, lapack_int * lwork, lapack_int * info)

she's got it all: itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, info. twelve parameters and not one of them is filler 🔥


🧚 LAPACK_ssygv_2stage

   void LAPACK_ssygv_2stage (lapack_int * itype, char * jobz, char * uplo,
       lapack_int * n, float * a, lapack_int * lda, float * b, lapack_int *
       ldb, float * w, float * work, lapack_int * lwork, lapack_int * info)

same twelve as LAPACK_ssygv — itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, info — plus the _2stage moment ✨


💜 LAPACK_ssygvd

   void LAPACK_ssygvd (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, float * a, lapack_int * lda, float * b, lapack_int * ldb, float *
       w, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int *
       liwork, lapack_int * info)

LAPACK_ssygv said "more workspace" and honestly slay. itype, jobz, uplo, n, a, lda, b, ldb, w, work, lwork, iwork, liwork, info — fourteen parameters, highkey a lot, but she carries it 🫶


🌈 LAPACK_ssygvx

   void LAPACK_ssygvx (lapack_int * itype, char * jobz, char * range, char *
       uplo, lapack_int * n, float * a, lapack_int * lda, float * b, lapack_int
       * ldb, float * vl, float * vu, lapack_int * il, lapack_int * iu, float *
       abstol, lapack_int * m, float * w, float * z, lapack_int * ldz, float *
       work, lapack_int * lwork, lapack_int * iwork, lapack_int * ifail,
       lapack_int * info)

the full deluxe package 😭 itype, jobz, range, uplo, n, a, lda, b, ldb, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, iwork, ifail, info. that's twenty-three. twenty-three!! not me counting twice 💀


🦋 LAPACK_ssyrfs

   void LAPACK_ssyrfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       float * a, lapack_int * lda, const float * af, lapack_int * ldaf, const
       lapack_int * ipiv, const float * b, lapack_int * ldb, float * x,
       lapack_int * ldx, float * ferr, float * berr, float * work, lapack_int *
       iwork, lapack_int * info)

okay so she's got uplo, n, nrhs, then the const crew: a/lda, af/ldaf, ipiv, b/ldb — and then the mutable girlies x/ldx, ferr, berr, work, iwork, info 🔥 love a mixed const situation, it's giving boundaries 💅


🎀 LAPACK_ssyrfsx

   void LAPACK_ssyrfsx (char * uplo, char * equed, lapack_int * n, lapack_int *
       nrhs, const float * a, lapack_int * lda, const float * af, lapack_int *
       ldaf, const lapack_int * ipiv, const float * s, const float * b,
       lapack_int * ldb, float * x, lapack_int * ldx, float * rcond, float *
       berr, lapack_int * n_err_bnds, float * err_bnds_norm, float *
       err_bnds_comp, lapack_int * nparams, float * params, float * work,
       lapack_int * iwork, lapack_int * info)

the x version said "add everything" and tbh she delivered. uplo, equed, n, nrhs, a, lda, af, ldaf, ipiv, s, b, ldb, x, ldx, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork, info. and yes a, af, ipiv, s and b are all const — know the difference bestie 👑✨


🫧 LAPACK_ssysv

   void LAPACK_ssysv (char * uplo, lapack_int * n, lapack_int * nrhs, float *
       a, lapack_int * lda, lapack_int * ipiv, float * b, lapack_int * ldb,
       float * work, lapack_int * lwork, lapack_int * info)

clean, simple, no notes: uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info. eleven and done, periodt 🎀


⭐ LAPACK_ssysv_aa

   void LAPACK_ssysv_aa (char * uplo, lapack_int * n, lapack_int * nrhs, float
       * a, lapack_int * lda, lapack_int * ipiv, float * b, lapack_int * ldb,
       float * work, lapack_int * lwork, lapack_int * info)

character-for-character the same list as LAPACK_ssysv — uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info — she just added _aa to her name and honestly that's valid 💅


🍓 LAPACK_ssysv_aa_2stage

   void LAPACK_ssysv_aa_2stage (char * uplo, lapack_int * n, lapack_int * nrhs,
       float * a, lapack_int * lda, float * tb, lapack_int * ltb, lapack_int *
       ipiv, lapack_int * ipiv2, float * b, lapack_int * ldb, float * work,
       lapack_int * lwork, lapack_int * info)

oh she's fancy now 😭 extra tb/ltb AND a second ipiv2! full lineup: uplo, n, nrhs, a, lda, tb, ltb, ipiv, ipiv2, b, ldb, work, lwork, info. two pivots, two vibes 🦋


🌸 LAPACK_ssysv_rk

   void LAPACK_ssysv_rk (char * uplo, lapack_int * n, lapack_int * nrhs, float
       * a, lapack_int * lda, float * e, lapack_int * ipiv, float * b,
       lapack_int * ldb, float * work, lapack_int * lwork, lapack_int * info)

same skeleton as LAPACK_ssysv but there's an e wedged between lda and ipiv 👀 so: uplo, n, nrhs, a, lda, e, ipiv, b, ldb, work, lwork, info. twelve parameters, one little letter doing a lot 💜


🌈 LAPACK_ssysv_rook

   void LAPACK_ssysv_rook (char * uplo, lapack_int * n, lapack_int * nrhs,
       float * a, lapack_int * lda, lapack_int * ipiv, float * b, lapack_int *
       ldb, float * work, lapack_int * lwork, lapack_int * info)

back to the exact LAPACK_ssysv list — uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info — wearing a _rook name tag 🎀


🦋 LAPACK_ssysvx

   void LAPACK_ssysvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, const float * a, lapack_int * lda, float * af, lapack_int * ldaf,
       lapack_int * ipiv, const float * b, lapack_int * ldb, float * x,
       lapack_int * ldx, float * rcond, float * ferr, float * berr, float *
       work, lapack_int * lwork, lapack_int * iwork, lapack_int * info)

she opens with fact and uplo (very demure), then n, nrhs, a/lda (const), af/ldaf (not const, she's editable), ipiv, b/ldb (const again), x/ldx, rcond, ferr, berr, work, lwork, iwork, info. twenty of them and every single one matters 💖


👑 LAPACK_ssysvxx

   void LAPACK_ssysvxx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, float * a, lapack_int * lda, float * af, lapack_int * ldaf,
       lapack_int * ipiv, char * equed, float * s, float * b, lapack_int * ldb,
       float * x, lapack_int * ldx, float * rcond, float * rpvgrw, float *
       berr, lapack_int * n_err_bnds, float * err_bnds_norm, float *
       err_bnds_comp, lapack_int * nparams, float * params, float * work,
       lapack_int * iwork, lapack_int * info)

the final boss of ssysv. fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, equed, s, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, iwork, info. twenty-six. TWENTY-SIX. and notice a and b are not const here unlike in LAPACK_ssysvx — little differences matter bestie 🔍💀


✨ LAPACK_ssyswapr

   void LAPACK_ssyswapr (char * uplo, lapack_int * n, float * a, lapack_int *
       lda, lapack_int * i1, lapack_int * i2)

no info! no work! just uplo, n, a, lda, i1, i2 and she's out. six parameters, zero notes, a little minimalist moment 🎀


🔥 LAPACK_ssytrd

   void LAPACK_ssytrd (char * uplo, lapack_int * n, float * a, lapack_int *
       lda, float * d, float * e, float * tau, float * work, lapack_int *
       lwork, lapack_int * info)

look at all these little single-letter outputs holding hands: uplo, n, a, lda, d, e, tau, work, lwork, info. ten parameters, three of them are one letter long, and I'm obsessed 🫶


💅 LAPACK_ssytrf

   void LAPACK_ssytrf (char * uplo, lapack_int * n, float * a, lapack_int *
       lda, lapack_int * ipiv, float * work, lapack_int * lwork, lapack_int *
       info)

eight parameters, tight and tidy: uplo, n, a, lda, ipiv, work, lwork, info. no frills, no drama, just vibes 🌸


🧚 LAPACK_ssytrf_aa

   void LAPACK_ssytrf_aa (char * uplo, lapack_int * n, float * a, lapack_int *
       lda, lapack_int * ipiv, float * work, lapack_int * lwork, lapack_int *
       info)

identical to LAPACK_ssytrf — uplo, n, a, lda, ipiv, work, lwork, info — but she's got the _aa suffix, and that's the entire difference in the signature, no cap 💜


🌟 LAPACK_ssytrf_aa_2stage

   void LAPACK_ssytrf_aa_2stage (char * uplo, lapack_int * n, float * a,
       lapack_int * lda, float * tb, lapack_int * ltb, lapack_int * ipiv,
       lapack_int * ipiv2, float * work, lapack_int * lwork, lapack_int * info)

and she closes out with the fancy one 😭 uplo, n, a, lda, tb, ltb, ipiv, ipiv2, work, lwork, info — extra tb/ltb, extra ipiv2, full two-stage fantasy. eleven parameters and she's serving all of them 💅✨

  • LAPACK_ssytrf_rk — void LAPACK_ssytrf_rk (char * uplo, lapack_int * n, float * a, lapack_int * lda, float * e, lapack_int * ipiv, float * work, lapack_int * lwork, lapack_int * info) bestie this one's the _rk girlie ✨ she's the only one in this cluster carrying that extra float * e alongside ipiv, and she still wants work, lwork and an info to gossip into. iconic.
  • LAPACK_ssytrf_rook — void LAPACK_ssytrf_rook (char * uplo, lapack_int * n, float * a, lapack_int * lda, lapack_int * ipiv, float * work, lapack_int * lwork, lapack_int * info) the _rook variant, no e here 💅 same uplo/n/a/lda/ipiv/work/lwork/info combo as always.
  • LAPACK_ssytri — void LAPACK_ssytri (char * uplo, lapack_int * n, float * a, lapack_int * lda, const lapack_int * ipiv, float * work, lapack_int * info) note the const on ipiv — she reads, she does not write 🙈 only work and info are getting modified here.
  • LAPACK_ssytri2 — void LAPACK_ssytri2 (char * uplo, lapack_int * n, float * a, lapack_int * lda, const lapack_int * ipiv, float * work, lapack_int * lwork, lapack_int * info) the 2 upgrade: she gained a lapack_int * lwork between work and info and honestly? glow-up 🦋
  • LAPACK_ssytri2x — void LAPACK_ssytri2x (char * uplo, lapack_int * n, float * a, lapack_int * lda, const lapack_int * ipiv, float * work, lapack_int * nb, lapack_int * info) the 2x one 🎀 she traded lwork for a lapack_int * nb and kept everything else identical. block size energy.
  • LAPACK_ssytri_3 — void LAPACK_ssytri_3 (char * uplo, lapack_int * n, float * a, lapack_int * lda, const float * e, const lapack_int * ipiv, float * work, lapack_int * lwork, lapack_int * info) _3 and she's got BOTH const float * e and const lapack_int * ipiv — two consts, so respectful 😌 plus work, lwork, info.
  • LAPACK_ssytrs — void LAPACK_ssytrs (char * uplo, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, const lapack_int * ipiv, float * b, lapack_int * ldb, lapack_int * info) okay solver era 🔥 a and ipiv are const (hands off), while b and ldb are fair game. no work at all, she's low maintenance.
  • LAPACK_ssytrs2 — void LAPACK_ssytrs2 (char * uplo, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, const lapack_int * ipiv, float * b, lapack_int * ldb, float * work, lapack_int * info) same as her sister but she picked up a float * work before info. that's it, that's the diff 💀
  • LAPACK_ssytrs_3 — void LAPACK_ssytrs_3 (char * uplo, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, const float * e, const lapack_int * ipiv, float * b, lapack_int * ldb, lapack_int * info) _3 again with the const float * e slotted in right after lda 🌸 otherwise a total copy of the base ssytrs lineup.
  • LAPACK_ssytrs_aa — void LAPACK_ssytrs_aa (char * uplo, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, const lapack_int * ipiv, float * b, lapack_int * ldb, float * work, lapack_int * lwork, lapack_int * info) _aa said "and ALSO lwork" 🫶 full work + lwork stack, plus info to spill the tea at the end.
  • LAPACK_ssytrs_aa_2stage — void LAPACK_ssytrs_aa_2stage (char * uplo, lapack_int * n, lapack_int * nrhs, float * a, lapack_int * lda, float * tb, lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2, float * b, lapack_int * ldb, lapack_int * info) the main character of this batch, honestly 👑 TWO ipivs (ipiv and ipiv2), a tb with its own ltb, and — vibe check — a and tb are not const here, and there's no work/lwork at all. she's giving two-stage.
  • LAPACK_ssytrs_rook — void LAPACK_ssytrs_rook (char * uplo, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, const lapack_int * ipiv, float * b, lapack_int * ldb, lapack_int * info) _rook edition, identical lineup to plain LAPACK_ssytrs — uplo, n, nrhs, a, lda, ipiv, b, ldb, info. no notes.
  • LAPACK_stbcon — void LAPACK_stbcon (char * norm, char * uplo, char * diag, lapack_int * n, lapack_int * kd, const float * ab, lapack_int * ldab, float * rcond, float * work, lapack_int * iwork, lapack_int * info) three chars in a row (norm, uplo, diag) — she's thorough 💖 note BOTH work and lapack_int * iwork, and rcond is where the answer lands.
  • LAPACK_stbrfs — void LAPACK_stbrfs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * kd, lapack_int * nrhs, const float * ab, lapack_int * ldab, const float * b, lapack_int * ldb, const float * x, lapack_int * ldx, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info) absolute unit of a signature 😭 she's got b/ldb AND x/ldx, then ferr and berr, then work, iwork, info. three consts (ab, b, x) — she respects your data.
  • LAPACK_stbtrs — void LAPACK_stbtrs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * kd, lapack_int * nrhs, const float * ab, lapack_int * ldab, float * b, lapack_int * ldb, lapack_int * info) the solver version, so b is writable and there's no work in sight ✨ just ab, b, and info.
  • LAPACK_stfsm — void LAPACK_stfsm (char * transr, char * side, char * uplo, char * trans, char * diag, lapack_int * m, lapack_int * n, float * alpha, const float * a, float * b, lapack_int * ldb) FOUR chars up front (transr, side, uplo, trans, diag — okay five 🤡) and — heads up — no info. she's the confident one. alpha and b get modified, a stays const.
  • LAPACK_stftri — void LAPACK_stftri (char * transr, char * uplo, char * diag, lapack_int * n, float * a, lapack_int * info) small and cute 🎀 three chars, an n, a writable a, an info. done.
  • LAPACK_stfttp — void LAPACK_stfttp (char * transr, char * uplo, lapack_int * n, const float * arf, float * ap, lapack_int * info) arf in (const), ap out 💜 the classic packed-format handoff.
  • LAPACK_stfttr — void LAPACK_stfttr (char * transr, char * uplo, lapack_int * n, const float * arf, float * a, lapack_int * lda, lapack_int * info) same deal but she's unpacking into a with an lda to match 🌈 arf stays const.
  • LAPACK_stgevc — void LAPACK_stgevc (char * side, char * howmny, const lapack_logical * select, lapack_int * n, const float * s, lapack_int * lds, const float * p, lapack_int * ldp, float * vl, lapack_int * ldvl, float * vr, lapack_int * ldvr, lapack_int * mm, lapack_int * m, float * work, lapack_int * info) huge. const lapack_logical * select spotted 👀 plus s/lds, p/ldp, vl/ldvl, vr/ldvr, mm, m, work, info. she does the most and we love her for it.
  • LAPACK_stgexc — void LAPACK_stgexc (lapack_logical * wantq, lapack_logical * wantz, lapack_int * n, float * a, lapack_int * lda, float * b, lapack_int * ldb, float * q, lapack_int * ldq, float * z, lapack_int * ldz, lapack_int * ifst, lapack_int * ilst, float * work, lapack_int * lwork, lapack_int * info) two lapack_logical * flags (wantq, wantz) leading the pack, then a, b, q, z each with their lds, plus ifst, ilst, work, lwork, info 🔥 no consts bc nothing is sacred.
  • LAPACK_stgsen — void LAPACK_stgsen (lapack_int * ijob, lapack_logical * wantq, lapack_logical * wantz, const lapack_logical * select, lapack_int * n, float * a, lapack_int * lda, float * b, lapack_int * ldb, float * alphar, float * alphai, float * beta, float * q, lapack_int * ldq, float * z, lapack_int * ldz, lapack_int * m, float * pl, float * pr, float * dif, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info) okay she ATE 💅 ijob, wantq, wantz, const select, then alphar/alphai/beta (yes, split real/imag 😭), then q, z, m, pl, pr, dif, and BOTH work pairs: work+lwork and iwork+liwork. queen of lwork.
  • LAPACK_stgsja — void LAPACK_stgsja (char * jobu, char * jobv, char * jobq, lapack_int * m, lapack_int * p, lapack_int * n, lapack_int * k, lapack_int * l, float * a, lapack_int * lda, float * b, lapack_int * ldb, float * tola, float * tolb, float * alpha, float * beta, float * u, lapack_int * ldu, float * v, lapack_int * ldv, float * q, lapack_int * ldq, float * work, lapack_int * ncycle, lapack_int * info) three job chars, then m, p, n, k, l — the alphabet gang 🌸 then a, b, tola, tolb, alpha, beta, u, v, q with all their lds, work, ncycle, info. no const anywhere, hold onto your matrices.
  • LAPACK_stgsna — void LAPACK_stgsna (char * job, char * howmny, const lapack_logical * select, lapack_int * n, const float * a, lapack_int * lda, const float * b, lapack_int * ldb, const float * vl, lapack_int * ldvl, const float * vr, lapack_int * ldvr, float * s, float * dif, lapack_int * mm, lapack_int * m, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info) const party 🎉 select, a, b, vl, vr are all read-only. outputs: s, dif, mm, m. and yeah, work+lwork+iwork+info because she's extra.
  • LAPACK_stgsyl — void LAPACK_stgsyl (char * trans, lapack_int * ijob, lapack_int * m, lapack_int * n, const float * a, lapack_int * lda, const float * b, lapack_int * ldb, float * c, lapack_int * ldc, const float * d, lapack_int * ldd, const float * e, lapack_int * lde, float * f, lapack_int * ldf, float * scale, float * dif, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * info) look at this alphabet soup 😭 a/b/d/e are const, c/f are not, scale and dif are outputs, and she still finds room for work, lwork, iwork, info. main character energy fr fr.
  • LAPACK_stpcon — void LAPACK_stpcon (char * norm, char * uplo, char * diag, lapack_int * n, const float * ap, float * rcond, float * work, lapack_int * iwork, lapack_int * info) packed (ap is const 💜) and she wants rcond, work, iwork, info. tidy.
  • LAPACK_stpmqrt — void LAPACK_stpmqrt (char * side, char * trans, lapack_int * m, lapack_int * n, lapack_int * k, lapack_int * l, lapack_int * nb, const float * v, lapack_int * ldv, const float * t, lapack_int * ldt, float * a, lapack_int * lda, float * b, lapack_int * ldb, float * work, lapack_int * info) side, trans, then m, n, k, l, nb (five ints, she's counting 🦋), v and t both const, a and b both writable, capped with work and info.
  • LAPACK_stpqrt — void LAPACK_stpqrt (lapack_int * m, lapack_int * n, lapack_int * l, lapack_int * nb, float * a, lapack_int * lda, float * b, lapack_int * ldb, float * t, lapack_int * ldt, float * work, lapack_int * info) NO char parameters at all, not a single one 😳 just m, n, l, nb and then the a/b/t trio with their lds, work, info.
  • LAPACK_stpqrt2 — void LAPACK_stpqrt2 (lapack_int * m, lapack_int * n, lapack_int * l, float * a, lapack_int * lda, float * b, lapack_int * ldb, float * t, lapack_int * ldt, lapack_int * info) the 2 is basically "same but she dropped nb and work" ✨ short and slay.
  • LAPACK_stprfb — void LAPACK_stprfb (char * side, char * trans, char * direct, char * storev, lapack_int * m, lapack_int * n, lapack_int * k, lapack_int * l, const float * v, lapack_int * ldv, const float * t, lapack_int * ldt, float * a, lapack_int * lda, float * b, lapack_int * ldb, const float * work, lapack_int * ldwork) FOUR chars (side, trans, direct, storev — yes storev 🤠), m, n, k, l, and get this: work is const float * with a lapack_int * ldwork, and there is no info. she's built different.
  • LAPACK_stprfs — void LAPACK_stprfs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * nrhs, const float * ap, const float * b, lapack_int * ldb, const float * x, lapack_int * ldx, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info) packed refinement 💖 ap, b, x all const; ldb and ldx still writable for some reason (that's the API's business, not ours). ferr, berr, work, iwork, info.
  • LAPACK_stptri — void LAPACK_stptri (char * uplo, char * diag, lapack_int * n, float * ap, lapack_int * info) tiny icon 🎀 two chars, n, a writable ap, info. five params and she's out.
  • LAPACK_stptrs — void LAPACK_stptrs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * nrhs, const float * ap, float * b, lapack_int * ldb, lapack_int * info) three chars, n, nrhs, const ap, writable b, ldb, info. no work arrays, no drama 💅
  • LAPACK_stpttf — void LAPACK_stpttf (char * transr, char * uplo, lapack_int * n, const float * ap, float * arf, lapack_int * info) packed ap → full arf (or however she likes it, transr is right there 😌). const in, writable out, info at the end.
  • LAPACK_stpttr — void LAPACK_stpttr (char * uplo, lapack_int * n, const float * ap, float * a, lapack_int * lda, lapack_int * info) packed ap in, full a out with lda 🌈 plus info. short queen.
  • LAPACK_strcon — void LAPACK_strcon (char * norm, char * uplo, char * diag, lapack_int * n, const float * a, lapack_int * lda, float * rcond, float * work, lapack_int * iwork, lapack_int * info) triangular condition estimating, three chars deep 💜 const a, output rcond, then work, iwork, info.
  • LAPACK_strevc — void LAPACK_strevc (char * side, char * howmny, lapack_logical * select, lapack_int * n, const float * t, lapack_int * ldt, float * vl, lapack_int * ldvl, float * vr, lapack_int * ldvr, lapack_int * mm, lapack_int * m, float * work, lapack_int * info) head empty, only select — and NOTE: here select is lapack_logical *, not const, unlike her cousin LAPACK_stgevc 👀. t is const, vl/vr are not, mm, m, work, info.
  • LAPACK_strexc — void LAPACK_strexc (char * compq, lapack_int * n, float * t, lapack_int * ldt, float * q, lapack_int * ldq, lapack_int * ifst, lapack_int * ilst, float * work, lapack_int * info) one char (compq), then t/q with ldt/ldq, positions ifst/ilst, work, info. no consts, we live dangerously ✨
  • LAPACK_strrfs — void LAPACK_strrfs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, const float * b, lapack_int * ldb, const float * x, lapack_int * ldx, float * ferr, float * berr, float * work, lapack_int * iwork, lapack_int * info) basically stbrfs but not banded 🦋 three consts (a, b, x), two f*err outputs, work, iwork, info.
  • LAPACK_strsen — void LAPACK_strsen (char * job, char * compq, const lapack_logical * select, lapack_int * n, float * t, lapack_int * ldt, float * q, lapack_int * ldq, float * wr, float * wi, lapack_int * m, float * s, float * sep, float * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info) job, compq, const select, then t, q, then wr/wi (split again 😭), m, s, sep, and the double trouble work+lwork+iwork+liwork, plus info. eighteen params, she's booked and busy.
  • LAPACK_strsna — void LAPACK_strsna (char * job, char * howmny, const lapack_logical * select, lapack_int * n, const float * t, lapack_int * ldt, const float * vl, lapack_int * ldvl, const float * vr, lapack_int * ldvr, float * s, float * sep, lapack_int * mm, lapack_int * m, float * work, lapack_int * ldwork, lapack_int * iwork, lapack_int * info) const girlie all over: select, t, vl, vr. outputs s, sep, mm, m. and heads up — this one's work comes with ldwork (not lwork!) 🙈 plus iwork and info.
  • LAPACK_strsyl — void LAPACK_strsyl (char * trana, char * tranb, lapack_int * isgn, lapack_int * m, lapack_int * n, const float * a, lapack_int * lda, const float * b, lapack_int * ldb, float * c, lapack_int * ldc, float * scale, lapack_int * info) TWO trans chars (trana, tranb — the Sylvester special 💅), then isgn, m, n, const a/b, writable c, scale, info. no work arrays, she's efficient.
  • LAPACK_strtri — void LAPACK_strtri (char * uplo, char * diag, lapack_int * n, float * a, lapack_int * lda, lapack_int * info) six params, in and out, same energy as stptri but unpacked 🎀
  • LAPACK_strtrs — void LAPACK_strtrs (char * uplo, char * trans, char * diag, lapack_int * n, lapack_int * nrhs, const float * a, lapack_int * lda, float * b, lapack_int * ldb, lapack_int * info) the unpacked twin of stptrs — three chars, n, nrhs, const a, writable b, ldb, info. classic.
  • LAPACK_strttf — void LAPACK_strttf (char * transr, char * uplo, lapack_int * n, const float * a, lapack_int * lda, float * arf, lapack_int * info) full a (const) → packed arf 🦋 she's the reverse of stfttr, and yes I noticed.
  • LAPACK_strttp — void LAPACK_strttp (char * uplo, lapack_int * n, const float * a, lapack_int * lda, float * ap, lapack_int * info) full a (const, with lda) → packed ap. two chars, two ints, two floats. balanced ✨
  • LAPACK_stzrzf — void LAPACK_stzrzf (lapack_int * m, lapack_int * n, float * a, lapack_int * lda, float * tau, float * work, lapack_int * lwork, lapack_int * info) no chars at all, just straight to business: m, n, a, lda, tau, work, lwork, info 🔥

okay and now we cross the threshold into the complex double era 💜🌊 everything below is lapack_complex_double and double — hold my hand, bestie.

  • LAPACK_zbbcsd — void LAPACK_zbbcsd (char * jobu1, char * jobu2, char * jobv1t, char * jobv2t, char * trans, lapack_int * m, lapack_int * p, lapack_int * q, double * theta, double * phi, lapack_complex_double * u1, lapack_int * ldu1, lapack_complex_double * u2, lapack_int * ldu2, lapack_complex_double * v1t, lapack_int * ldv1t, lapack_complex_double * v2t, lapack_int * ldv2t, double * b11d, double * b11e, double * b12d, double * b12e, double * b21d, double * b21e, double * b22d, double * b22e, double * rwork, lapack_int * lrwork, lapack_int * info) the absolute MONSTER of this page 😭 FIVE chars (jobu1, jobu2, jobv1t, jobv2t, trans), then m, p, q, then theta, phi, then four matrices u1, u2, v1t, v2t each with their own ld, then the entire b11d/b11e/b12d/b12e/b21d/b21e/b22d/b22e extended family, then rwork, lrwork, info. she's giving final boss 👑
  • LAPACK_zbdsqr — void LAPACK_zbdsqr (char * uplo, lapack_int * n, lapack_int * ncvt, lapack_int * nru, lapack_int * ncc, double * d, double * e, lapack_complex_double * vt, lapack_int * ldvt, lapack_complex_double * u, lapack_int * ldu, lapack_complex_double * c, lapack_int * ldc, double * work, lapack_int * info) uplo, n, then the trio of counts ncvt, nru, ncc 🌸 d and e are plain double *, the matrices vt, u, c are complex with ldvt/ldu/ldc, and she closes with work and info. note: no lwork, just work.
  • LAPACK_zcgesv — void LAPACK_zcgesv (lapack_int * n, lapack_int * nrhs, lapack_complex_double * a, lapack_int * lda, lapack_int * ipiv, lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, …and that's exactly where this chunk of the page ends 😭🫶
no cap, the signature cuts off mid-parameter list right there. that's not me being lazy, that's literally where the source hands off — next part picks it up from lapack_complex_double * x, lapack_int * ldx, and we keep it rolling 💖

...and we're picking right back up mid-signature, bestie — here's the tail end of the prototype we were wrapping up 💖:

lapack_complex_double * work, lapack_complex_float * swork, double *
    rwork, lapack_int * iter, lapack_int * info)

  • LAPACK_zcposv — mixed-precision princess energy, no cap. Takes uplo and the whole a/b/x/lda/ldb/ldx crew, plus a work buffer, a single-precision swork bestie, a double * rwork, an iter counter, and info so you know what's up. 💅
void LAPACK_zcposv (char * uplo, lapack_int * n, lapack_int * nrhs,
    lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
    lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx,
    lapack_complex_double * work, lapack_complex_float * swork, double *
    rwork, lapack_int * iter, lapack_int * info)
  • LAPACK_zgbbrd — the banded-to-bidiagonal serve ✨. vect walks in, then m, n, ncc, kl, ku, the band matrix ab with ldab, real d and e, then q/ldq, pt/ldpt, c with ldc, and a work + rwork duo for the encore.
void LAPACK_zgbbrd (char * vect, lapack_int * m, lapack_int * n, lapack_int
    * ncc, lapack_int * kl, lapack_int * ku, lapack_complex_double * ab,
    lapack_int * ldab, double * d, double * e, lapack_complex_double * q,
    lapack_int * ldq, lapack_complex_double * pt, lapack_int * ldpt,
    lapack_complex_double * c, lapack_int * ldc, lapack_complex_double *
    work, double * rwork, lapack_int * info)
  • LAPACK_zgbcon — condition-number vibe check 🎀. norm picks the flavor, n/kl/ku set the shape, ab is const and ldab-strided, ipiv is const too, and you hand over anorm to get rcond back. work and rwork come along, info reports.
void LAPACK_zgbcon (char * norm, lapack_int * n, lapack_int * kl, lapack_int
    * ku, const lapack_complex_double * ab, lapack_int * ldab, const
    lapack_int * ipiv, double * anorm, double * rcond, lapack_complex_double
    * work, double * rwork, lapack_int * info)
  • LAPACK_zgbequ — equilibration era 🌸. m, n, kl, ku, the const band matrix ab and ldab, then out come r, c, rowcnd, colcnd, amax, and yes, info.
void LAPACK_zgbequ (lapack_int * m, lapack_int * n, lapack_int * kl,
    lapack_int * ku, const lapack_complex_double * ab, lapack_int * ldab,
    double * r, double * c, double * rowcnd, double * colcnd, double * amax,
    lapack_int * info)
  • LAPACK_zgbequb — same squad, but with that extra b baddie energy 👑. Identical parameter lineup, bestie: r, c, rowcnd, colcnd, amax, info.
void LAPACK_zgbequb (lapack_int * m, lapack_int * n, lapack_int * kl,
    lapack_int * ku, const lapack_complex_double * ab, lapack_int * ldab,
    double * r, double * c, double * rowcnd, double * colcnd, double * amax,
    lapack_int * info)
  • LAPACK_zgbrfs — refinement o'clock 🔥. trans + n/kl/ku/nrhs, both the original ab/ldab and the factored afb/ldafb, the const ipiv, then const b/ldb in and x/ldx out. It gives you ferr and berr (the error baddies), with work, rwork, info.
void LAPACK_zgbrfs (char * trans, lapack_int * n, lapack_int * kl,
    lapack_int * ku, lapack_int * nrhs, const lapack_complex_double * ab,
    lapack_int * ldab, const lapack_complex_double * afb, lapack_int *
    ldafb, const lapack_int * ipiv, const lapack_complex_double * b,
    lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double *
    ferr, double * berr, lapack_complex_double * work, double * rwork,
    lapack_int * info)
  • LAPACK_zgbrfsx — the extended, main-character version of the above 😭. Adds equed, const double * r and const double * c, plus rcond, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params. Everything else? Still there, still iconic.
void LAPACK_zgbrfsx (char * trans, char * equed, lapack_int * n, lapack_int
    * kl, lapack_int * ku, lapack_int * nrhs, const lapack_complex_double *
    ab, lapack_int * ldab, const lapack_complex_double * afb, lapack_int *
    ldafb, const lapack_int * ipiv, const double * r, const double * c,
    const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double
    * x, lapack_int * ldx, double * rcond, double * berr, lapack_int *
    n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int *
    nparams, double * params, lapack_complex_double * work, double * rwork,
    lapack_int * info)
  • LAPACK_zgbsv — solving szn 🦋. n/kl/ku/nrhs, the mutable ab with ldab, ipiv, b/ldb, and info to spill the tea at the end.
void LAPACK_zgbsv (lapack_int * n, lapack_int * kl, lapack_int * ku,
    lapack_int * nrhs, lapack_complex_double * ab, lapack_int * ldab,
    lapack_int * ipiv, lapack_complex_double * b, lapack_int * ldb,
    lapack_int * info)
  • LAPACK_zgbsvx — the "also tell me about the error" edition 💀. fact decides if you're bringing factors, trans picks the direction, equed + r + c for equilibration, and out come rcond, ferr, berr. work, rwork, info as always.
void LAPACK_zgbsvx (char * fact, char * trans, lapack_int * n, lapack_int *
    kl, lapack_int * ku, lapack_int * nrhs, lapack_complex_double * ab,
    lapack_int * ldab, lapack_complex_double * afb, lapack_int * ldafb,
    lapack_int * ipiv, char * equed, double * r, double * c,
    lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x,
    lapack_int * ldx, double * rcond, double * ferr, double * berr,
    lapack_complex_double * work, double * rwork, lapack_int * info)
  • LAPACK_zgbsvxx — the XXL version, obviously 🙈. Adds rpvgrw, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params, and it's still packing rcond and berr. Big main character energy.
void LAPACK_zgbsvxx (char * fact, char * trans, lapack_int * n, lapack_int *
    kl, lapack_int * ku, lapack_int * nrhs, lapack_complex_double * ab,
    lapack_int * ldab, lapack_complex_double * afb, lapack_int * ldafb,
    lapack_int * ipiv, char * equed, double * r, double * c,
    lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x,
    lapack_int * ldx, double * rcond, double * rpvgrw, double * berr,
    lapack_int * n_err_bnds, double * err_bnds_norm, double * err_bnds_comp,
    lapack_int * nparams, double * params, lapack_complex_double * work,
    double * rwork, lapack_int * info)
  • LAPACK_zgbtrf — the factorization one, genuinely obsessed ✨. m, n, kl, ku, the in-place ab/ldab, the ipiv pivot squad, and info.
void LAPACK_zgbtrf (lapack_int * m, lapack_int * n, lapack_int * kl,
    lapack_int * ku, lapack_complex_double * ab, lapack_int * ldab,
    lapack_int * ipiv, lapack_int * info)
  • LAPACK_zgbtrs — solving with the factors you already made 🫶. trans, n, kl, ku, nrhs, const ab/ldab, const ipiv, then b/ldb gets overwritten like it's nothing, and info reports.
void LAPACK_zgbtrs (char * trans, lapack_int * n, lapack_int * kl,
    lapack_int * ku, lapack_int * nrhs, const lapack_complex_double * ab,
    lapack_int * ldab, const lapack_int * ipiv, lapack_complex_double * b,
    lapack_int * ldb, lapack_int * info)
  • LAPACK_zgebak — balancing but make it a callback era 🎀. job and side choose the vibe, n/ilo/ihi give the range, const double * scale comes in, m and v/ldv get worked on, info finishes.
void LAPACK_zgebak (char * job, char * side, lapack_int * n, lapack_int *
    ilo, lapack_int * ihi, const double * scale, lapack_int * m,
    lapack_complex_double * v, lapack_int * ldv, lapack_int * info)
  • LAPACK_zgebal — the balancing origin story 🌈. job, n, the matrix a/lda, then ilo and ihi come out, plus the double * scale array, and info.
void LAPACK_zgebal (char * job, lapack_int * n, lapack_complex_double * a,
    lapack_int * lda, lapack_int * ilo, lapack_int * ihi, double * scale,
    lapack_int * info)
  • LAPACK_zgebrd — bidiagonal reduction, the classic 💅. m, n, a/lda, real outputs d and e, the tauq and taup besties, work/lwork, info.
void LAPACK_zgebrd (lapack_int * m, lapack_int * n, lapack_complex_double *
    a, lapack_int * lda, double * d, double * e, lapack_complex_double *
    tauq, lapack_complex_double * taup, lapack_complex_double * work,
    lapack_int * lwork, lapack_int * info)
  • LAPACK_zgecon — condition number, general edition ⭐. norm, n, const a/lda, anorm in, rcond out, plus work, rwork, info.
void LAPACK_zgecon (char * norm, lapack_int * n, const lapack_complex_double
    * a, lapack_int * lda, double * anorm, double * rcond,
    lapack_complex_double * work, double * rwork, lapack_int * info)
  • LAPACK_zgeequ — equilibration, general flavor 🌸. m, n, const a/lda → r, c, rowcnd, colcnd, amax, info.
void LAPACK_zgeequ (lapack_int * m, lapack_int * n, const
    lapack_complex_double * a, lapack_int * lda, double * r, double * c,
    double * rowcnd, double * colcnd, double * amax, lapack_int * info)
  • LAPACK_zgeequb — the b version, same fit, still slaying 💜. Same exact parameter party.
void LAPACK_zgeequb (lapack_int * m, lapack_int * n, const
    lapack_complex_double * a, lapack_int * lda, double * r, double * c,
    double * rowcnd, double * colcnd, double * amax, lapack_int * info)
  • LAPACK_zgees — Schur-ish serve with a select callback 😭. jobvs, the sort flag, LAPACK_Z_SELECT1 select, n, a/lda, sdim, w, vs/ldvs, work/lwork, rwork, and a lapack_logical * bwork, then info.
void LAPACK_zgees (char * jobvs, char * sort, LAPACK_Z_SELECT1 select,
    lapack_int * n, lapack_complex_double * a, lapack_int * lda, lapack_int
    * sdim, lapack_complex_double * w, lapack_complex_double * vs,
    lapack_int * ldvs, lapack_complex_double * work, lapack_int * lwork,
    double * rwork, lapack_logical * bwork, lapack_int * info)
  • LAPACK_zgeesx — the extra version, and it brought sense 🙈. Also blessed us with rconde and rcondv on top of the whole zgees lineup.
void LAPACK_zgeesx (char * jobvs, char * sort, LAPACK_Z_SELECT1 select, char
    * sense, lapack_int * n, lapack_complex_double * a, lapack_int * lda,
    lapack_int * sdim, lapack_complex_double * w, lapack_complex_double *
    vs, lapack_int * ldvs, double * rconde, double * rcondv,
    lapack_complex_double * work, lapack_int * lwork, double * rwork,
    lapack_logical * bwork, lapack_int * info)
  • LAPACK_zgeev — eigenvalues and eigenvectors, the moment 🔥. jobvl and jobvr for which vectors you want, n, a/lda, then w, vl/ldvl, vr/ldvr, work/lwork, rwork, info.
void LAPACK_zgeev (char * jobvl, char * jobvr, lapack_int * n,
    lapack_complex_double * a, lapack_int * lda, lapack_complex_double * w,
    lapack_complex_double * vl, lapack_int * ldvl, lapack_complex_double *
    vr, lapack_int * ldvr, lapack_complex_double * work, lapack_int * lwork,
    double * rwork, lapack_int * info)
  • LAPACK_zgeevx — the deluxe zgeev, literally 👑. balanc plus sense, the jobvl/jobvr duo, ilo/ihi, scale, abnrm, rconde, rcondv, and the usual work/lwork + rwork + info.
void LAPACK_zgeevx (char * balanc, char * jobvl, char * jobvr, char * sense,
    lapack_int * n, lapack_complex_double * a, lapack_int * lda,
    lapack_complex_double * w, lapack_complex_double * vl, lapack_int *
    ldvl, lapack_complex_double * vr, lapack_int * ldvr, lapack_int * ilo,
    lapack_int * ihi, double * scale, double * abnrm, double * rconde,
    double * rcondv, lapack_complex_double * work, lapack_int * lwork,
    double * rwork, lapack_int * info)
  • LAPACK_zgehrd — Hessenberg reduction, he's a real one 🦋. n, ilo, ihi, a/lda, the tau array, work/lwork, info.
void LAPACK_zgehrd (lapack_int * n, lapack_int * ilo, lapack_int * ihi,
    lapack_complex_double * a, lapack_int * lda, lapack_complex_double *
    tau, lapack_complex_double * work, lapack_int * lwork, lapack_int *
    info)
  • LAPACK_zgejsv — the SVD with a whole personality quiz of flags 😭. joba, jobu, jobv, jobr, jobt, jobp, then m/n, a/lda, sva, u/ldu, v/ldv, cwork/lwork, work/lrwork, iwork, info. Not me counting them all.
void LAPACK_zgejsv (char * joba, char * jobu, char * jobv, char * jobr, char
    * jobt, char * jobp, lapack_int * m, lapack_int * n,
    lapack_complex_double * a, lapack_int * lda, double * sva,
    lapack_complex_double * u, lapack_int * ldu, lapack_complex_double * v,
    lapack_int * ldv, lapack_complex_double * cwork, lapack_int * lwork,
    double * work, lapack_int * lrwork, lapack_int * iwork, lapack_int *
    info)
  • LAPACK_zgelq — LQ representation, periodt 💅. m, n, a/lda, the t array with tsize, work/lwork, info.
void LAPACK_zgelq (lapack_int * m, lapack_int * n, lapack_complex_double *
    a, lapack_int * lda, lapack_complex_double * t, lapack_int * tsize,
    lapack_complex_double * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zgelq2 — the little unblocked sibling 🎀. m, n, a/lda, tau, work (no lwork bestie, sorry), info.
void LAPACK_zgelq2 (lapack_int * m, lapack_int * n, lapack_complex_double *
    a, lapack_int * lda, lapack_complex_double * tau, lapack_complex_double
    * work, lapack_int * info)
  • LAPACK_zgelqf — the blocked one, and yes it has lwork 🌟. m, n, a/lda, tau, work/lwork, info.
void LAPACK_zgelqf (lapack_int * m, lapack_int * n, lapack_complex_double *
    a, lapack_int * lda, lapack_complex_double * tau, lapack_complex_double
    * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zgels — least squares, the whole point let's be honest 😌. trans, m/n/nrhs, a/lda, b/ldb, work/lwork, info.
void LAPACK_zgels (char * trans, lapack_int * m, lapack_int * n, lapack_int
    * nrhs, lapack_complex_double * a, lapack_int * lda,
    lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
    work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zgelsd — d for divide-and-conquer, and it's giving extra buffers 🫶. Pulls in s, rcond, rank, work/lwork, rwork, iwork, info.
void LAPACK_zgelsd (lapack_int * m, lapack_int * n, lapack_int * nrhs,
    lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
    lapack_int * ldb, double * s, double * rcond, lapack_int * rank,
    lapack_complex_double * work, lapack_int * lwork, double * rwork,
    lapack_int * iwork, lapack_int * info)
  • LAPACK_zgelss — same energy, ss flavor, no iwork this time 💀. s, rcond, rank, work/lwork, rwork, info — that's the lineup.
void LAPACK_zgelss (lapack_int * m, lapack_int * n, lapack_int * nrhs,
    lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
    lapack_int * ldb, double * s, double * rcond, lapack_int * rank,
    lapack_complex_double * work, lapack_int * lwork, double * rwork,
    lapack_int * info)
  • LAPACK_zgelsy — the y one, and it brought jpvt to the party 🍓. Plus rcond, rank, work/lwork, rwork, info.
void LAPACK_zgelsy (lapack_int * m, lapack_int * n, lapack_int * nrhs,
    lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
    lapack_int * ldb, lapack_int * jpvt, double * rcond, lapack_int * rank,
    lapack_complex_double * work, lapack_int * lwork, double * rwork,
    lapack_int * info)
  • LAPACK_zgemlq — applies the LQ thing, side and trans and all 💜. side, trans, m/n/k, const a/lda, const t/tsize, and c/ldc gets the glow-up, with work/lwork, info.
void LAPACK_zgemlq (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * k, const lapack_complex_double * a, lapack_int * lda,
    const lapack_complex_double * t, lapack_int * tsize,
    lapack_complex_double * c, lapack_int * ldc, lapack_complex_double *
    work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zgemqr — same deal but the QR sibling 🌈. Identical parameter squad: side, trans, m/n/k, const a/lda, const t/tsize, c/ldc, work/lwork, info.
void LAPACK_zgemqr (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * k, const lapack_complex_double * a, lapack_int * lda,
    const lapack_complex_double * t, lapack_int * tsize,
    lapack_complex_double * c, lapack_int * ldc, lapack_complex_double *
    work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zgemqrt — the blocky t version, extra nb for spice ✨. v/ldv instead of a, plus const t/ldt, c/ldc, work, info.
void LAPACK_zgemqrt (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * k, lapack_int * nb, const lapack_complex_double * v,
    lapack_int * ldv, const lapack_complex_double * t, lapack_int * ldt,
    lapack_complex_double * c, lapack_int * ldc, lapack_complex_double *
    work, lapack_int * info)
  • LAPACK_zgeqlf — QL factorization, underrated honestly 🌸. m, n, a/lda, tau, work/lwork, info.
void LAPACK_zgeqlf (lapack_int * m, lapack_int * n, lapack_complex_double *
    a, lapack_int * lda, lapack_complex_double * tau, lapack_complex_double
    * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zgeqp3 — the p3 version with jpvt and rwork 🎀. m/n, a/lda, jpvt, tau, work/lwork, rwork, info.
void LAPACK_zgeqp3 (lapack_int * m, lapack_int * n, lapack_complex_double *
    a, lapack_int * lda, lapack_int * jpvt, lapack_complex_double * tau,
    lapack_complex_double * work, lapack_int * lwork, double * rwork,
    lapack_int * info)
  • LAPACK_zgeqpf — the older one, still has jpvt and rwork, but no lwork 😭.
void LAPACK_zgeqpf (lapack_int * m, lapack_int * n, lapack_complex_double *
    a, lapack_int * lda, lapack_int * jpvt, lapack_complex_double * tau,
    lapack_complex_double * work, double * rwork, lapack_int * info)
  • LAPACK_zgeqr — and we're cutting off right in the middle of this icon's parameter list, genuinely rude of the page break 💀:
void LAPACK_zgeqr (lapack_int * m, lapack_int * n, lapack_complex_double *
hold that thought bestie, the rest of LAPACK_zgeqr is waiting for you in the next part 🫶✨

Okay so this stretch is literally just the parade of z-squad declarations — every single one is lapack_complex_double everything, every argument is a pointer, and info is always last like the group chat member who always shows up right at the end 💅. Let's go through them one by one, no skipping, no cap.

First, the tail end of the function that got cut off at the end of the last part — pick up right here:

       a, lapack_int * lda, lapack_complex_double * t, lapack_int * tsize,
       lapack_complex_double * work, lapack_int * lwork, lapack_int * info)

✨ the QR crew 🎀

   void LAPACK_zgeqr2 (lapack_int * m, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_complex_double * tau, lapack_complex_double
       * work, lapack_int * info)
   void LAPACK_zgeqrf (lapack_int * m, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_complex_double * tau, lapack_complex_double
       * work, lapack_int * lwork, lapack_int * info)
   void LAPACK_zgeqrfp (lapack_int * m, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_complex_double * tau, lapack_complex_double
       * work, lapack_int * lwork, lapack_int * info)

zgeqr2 is the baby version (no lwork, it just brings its own work), and zgeqrf / zgeqrfp are the iconique ones with the lwork glow-up. Note the p on the end of zgeqrfp — yes it matters, don't drop it, it's giving ✨different function✨ energy.

Then the blocked / recursive besties:

   void LAPACK_zgeqrt (lapack_int * m, lapack_int * n, lapack_int * nb,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * t,
       lapack_int * ldt, lapack_complex_double * work, lapack_int * info)
   void LAPACK_zgeqrt2 (lapack_int * m, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_complex_double * t, lapack_int * ldt,
       lapack_int * info)
   void LAPACK_zgeqrt3 (lapack_int * m, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_complex_double * t, lapack_int * ldt,
       lapack_int * info)

The t/ldt duo is lowkey their whole personality 🦋. zgeqrt gets a nb (block size) and a work buffer; zgeqrt2 and zgeqrt3 are the no-work versions — they said "we travel light."

And rounding out the family:

   void LAPACK_zgerqf (lapack_int * m, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_complex_double * tau, lapack_complex_double
       * work, lapack_int * lwork, lapack_int * info)

Same shape as zgeqrf, note the f→q swap in the name, bestie, they are not the same function, do not confuse them 💀.


✨ refinement era 🔥

   void LAPACK_zgerfs (char * trans, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_double * a, lapack_int * lda, const lapack_complex_double
       * af, lapack_int * ldaf, const lapack_int * ipiv, const
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x,
       lapack_int * ldx, double * ferr, double * berr, lapack_complex_double *
       work, double * rwork, lapack_int * info)

Look at zgerfs — it's bringing both a lapack_complex_double * work and a double * rwork, plus the error twins ferr and berr. Oh she's thorough 💅. Also peep the const on a, af, ipiv, b but not on x — because x is the one getting refined, she's the main character.

   void LAPACK_zgerfsx (char * trans, char * equed, lapack_int * n, lapack_int
       * nrhs, const lapack_complex_double * a, lapack_int * lda, const
       lapack_complex_double * af, lapack_int * ldaf, const lapack_int * ipiv,
       const double * r, const double * c, const lapack_complex_double * b,
       lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double *
       rcond, double * berr, lapack_int * n_err_bnds, double * err_bnds_norm,
       double * err_bnds_comp, lapack_int * nparams, double * params,
       lapack_complex_double * work, double * rwork, lapack_int * info)

And then zgerfsx shows up with twenty-four arguments like it's nothing 😭. equed, r, c, rcond, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params — she ate and left no crumbs. This is the deluxe "x" edition, periodt.


✨ SVD supremacy 👑🌈

   void LAPACK_zgesdd (char * jobz, lapack_int * m, lapack_int * n,
       lapack_complex_double * a, lapack_int * lda, double * s,
       lapack_complex_double * u, lapack_int * ldu, lapack_complex_double * vt,
       lapack_int * ldvt, lapack_complex_double * work, lapack_int * lwork,
       double * rwork, lapack_int * iwork, lapack_int * info)

zgesdd is a whole vibe — jobz controls both u and vt at once (one char to rule them all), and she's bringing work, rwork and iwork. Three buffers. Three. Iconic ✨.

   void LAPACK_zgesvd (char * jobu, char * jobvt, lapack_int * m, lapack_int *
       n, lapack_complex_double * a, lapack_int * lda, double * s,
       lapack_complex_double * u, lapack_int * ldu, lapack_complex_double * vt,
       lapack_int * ldvt, lapack_complex_double * work, lapack_int * lwork,
       double * rwork, lapack_int * info)

zgesvd is the OG who does it the other way — separate jobu and jobvt chars, and no iwork because she's lowkey chill. Note the singular values s are plain double *, not complex — yeah, they're real like that 💖.

   void LAPACK_zgesvdx (char * jobu, char * jobvt, char * range, lapack_int *
       m, lapack_int * n, lapack_complex_double * a, lapack_int * lda, double *
       vl, double * vu, lapack_int * il, lapack_int * iu, lapack_int * ns,
       double * s, lapack_complex_double * u, lapack_int * ldu,
       lapack_complex_double * vt, lapack_int * ldvt, lapack_complex_double *
       work, lapack_int * lwork, double * rwork, lapack_int * iwork, lapack_int
       * info)

zgesvdx said "let me pick which ones" — range, vl, vu, il, iu, and out comes ns (how many she picked, slay). Full work + rwork + iwork loadout again.

   void LAPACK_zgesvj (char * joba, char * jobu, char * jobv, lapack_int * m,
       lapack_int * n, lapack_complex_double * a, lapack_int * lda, double *
       sva, lapack_int * mv, lapack_complex_double * v, lapack_int * ldv,
       lapack_complex_double * cwork, lapack_int * lwork, double * rwork,
       lapack_int * lrwork, lapack_int * info)

Now zgesvj is different and she wants you to know it 🦋 — three job chars (joba, jobu, jobv), sva instead of s, mv, and her workspace is literally named cwork with both lwork and lrwork (that's rwork's length, separate from work's length). Do not assume the usual names, bestie, read them again, iykyk.


✨ the solve-and-invert girlies 💜

   void LAPACK_zgesv (lapack_int * n, lapack_int * nrhs, lapack_complex_double
       * a, lapack_int * lda, lapack_int * ipiv, lapack_complex_double * b,
       lapack_int * ldb, lapack_int * info)

zgesv is refreshingly short — no work, no lwork, just vibes and ipiv. A minimalist queen 🌸.

   void LAPACK_zgesvx (char * fact, char * trans, lapack_int * n, lapack_int *
       nrhs, lapack_complex_double * a, lapack_int * lda, lapack_complex_double
       * af, lapack_int * ldaf, lapack_int * ipiv, char * equed, double * r,
       double * c, lapack_complex_double * b, lapack_int * ldb,
       lapack_complex_double * x, lapack_int * ldx, double * rcond, double *
       ferr, double * berr, lapack_complex_double * work, double * rwork,
       lapack_int * info)

zgesvx = the expert edition. fact, trans, af, ldaf, equed, r, c, rcond, ferr, berr, work + rwork. She is not playing around 🎀.

   void LAPACK_zgesvxx (char * fact, char * trans, lapack_int * n, lapack_int *
       nrhs, lapack_complex_double * a, lapack_int * lda, lapack_complex_double
       * af, lapack_int * ldaf, lapack_int * ipiv, char * equed, double * r,
       double * c, lapack_complex_double * b, lapack_int * ldb,
       lapack_complex_double * x, lapack_int * ldx, double * rcond, double *
       rpvgrw, double * berr, lapack_int * n_err_bnds, double * err_bnds_norm,
       double * err_bnds_comp, lapack_int * nparams, double * params,
       lapack_complex_double * work, double * rwork, lapack_int * info)

And zgesvxx is zgesvx with the double x, aka the "I have trust issues" build 😭 — she swaps ferr out for rpvgrw and adds the whole error-bound situation: n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. Absolutely unhinged in the best way. Obsessed.


✨ LU central 🧚

   void LAPACK_zgetf2 (lapack_int * m, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_int * ipiv, lapack_int * info)

zgetf2 — tiny, unblocked, straight to the point. No work at all. She said "I don't need a buffer, I need results" ✨.

   void LAPACK_zgetrf (lapack_int * m, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_int * ipiv, lapack_int * info)
   void LAPACK_zgetrf2 (lapack_int * m, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_int * ipiv, lapack_int * info)

zgetrf and zgetrf2 are literally identical signatures — same m, n, a, lda, ipiv, info, in that exact order. Yes bestie, that trailing 2 is the entire difference in the declaration. Not a typo, do not "fix" it 🙈.

   void LAPACK_zgetri (lapack_int * n, lapack_complex_double * a, lapack_int *
       lda, const lapack_int * ipiv, lapack_complex_double * work, lapack_int *
       lwork, lapack_int * info)
   void LAPACK_zgetrs (char * trans, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_double * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

zgetri takes n only (no m, she's square and she knows it 💅) and ipiv is const because she's only reading those pivots. zgetrs has trans, nrhs, and a const a + const ipiv while b stays mutable — she's doing the thing.

   void LAPACK_zgetsls (char * trans, lapack_int * m, lapack_int * n,
       lapack_int * nrhs, lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       work, lapack_int * lwork, lapack_int * info)

zgetsls — trans, m, n, nrhs, a, lda, b, ldb, work, lwork, info. Clean, no ipiv in sight. Sometimes you just don't need pivots, okay? 🫶


✨ balancing act 🌈

   void LAPACK_zggbak (char * job, char * side, lapack_int * n, lapack_int *
       ilo, lapack_int * ihi, const double * lscale, const double * rscale,
       lapack_int * m, lapack_complex_double * v, lapack_int * ldv, lapack_int
       * info)
   void LAPACK_zggbal (char * job, lapack_int * n, lapack_complex_double * a,
       lapack_int * lda, lapack_complex_double * b, lapack_int * ldb,
       lapack_int * ilo, lapack_int * ihi, double * lscale, double * rscale,
       double * work, lapack_int * info)

Cute detail: zggbak reads lscale and rscale as const double * (hands off, she's just applying them) while zggbal produces them as plain double *. Also zggbak has side, m and v/ldv; zggbal has a/lda, b/ldb and a work. Sisters, not twins 💖. Both carry ilo and ihi, no exceptions.


✨ generalized eigen, the whole saga 👑💀

   void LAPACK_zgges (char * jobvsl, char * jobvsr, char * sort,
       LAPACK_Z_SELECT2 selctg, lapack_int * n, lapack_complex_double * a,
       lapack_int * lda, lapack_complex_double * b, lapack_int * ldb,
       lapack_int * sdim, lapack_complex_double * alpha, lapack_complex_double
       * beta, lapack_complex_double * vsl, lapack_int * ldvsl,
       lapack_complex_double * vsr, lapack_int * ldvsr, lapack_complex_double *
       work, lapack_int * lwork, double * rwork, lapack_logical * bwork,
       lapack_int * info)

Okay so zgges — jobvsl, jobvsr, sort, and a LAPACK_Z_SELECT2 selctg callback in the mix (yes, that's a function pointer argument, she's fancy 🎀). Then sdim, the alpha/beta pair, vsl/ldvsl, vsr/ldvsr, work/lwork, rwork, and a lapack_logical * bwork — note that's not a lapack_int, it's lapack_logical, don't get it twisted 🙈.

   void LAPACK_zgges3 (char * jobvsl, char * jobvsr, char * sort,
       LAPACK_Z_SELECT2 selctg, lapack_int * n, lapack_complex_double * a,
       lapack_int * lda, lapack_complex_double * b, lapack_int * ldb,
       lapack_int * sdim, lapack_complex_double * alpha, lapack_complex_double
       * beta, lapack_complex_double * vsl, lapack_int * ldvsl,
       lapack_complex_double * vsr, lapack_int * ldvsr, lapack_complex_double *
       work, lapack_int * lwork, double * rwork, lapack_logical * bwork,
       lapack_int * info)

zgges3 is character-for-character the same signature as zgges — the 3 is doing all the work, and honestly, good for her ⭐.

   void LAPACK_zggesx (char * jobvsl, char * jobvsr, char * sort,
       LAPACK_Z_SELECT2 selctg, char * sense, lapack_int * n,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
       lapack_int * ldb, lapack_int * sdim, lapack_complex_double * alpha,
       lapack_complex_double * beta, lapack_complex_double * vsl, lapack_int *
       ldvsl, lapack_complex_double * vsr, lapack_int * ldvsr, double * rconde,
       double * rcondv, lapack_complex_double * work, lapack_int * lwork,
       double * rwork, lapack_int * iwork, lapack_int * liwork, lapack_logical
       * bwork, lapack_int * info)

zggesx said "add sense" and then kept going — rconde, rcondv, and iwork + liwork. Now there's lwork, liwork, and she still wants bwork. Three length params, bestie. THREE. 😭 Keep them straight.

   void LAPACK_zggev (char * jobvl, char * jobvr, lapack_int * n,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
       lapack_int * ldb, lapack_complex_double * alpha, lapack_complex_double *
       beta, lapack_complex_double * vl, lapack_int * ldvl,
       lapack_complex_double * vr, lapack_int * ldvr, lapack_complex_double *
       work, lapack_int * lwork, double * rwork, lapack_int * info)
   void LAPACK_zggev3 (char * jobvl, char * jobvr, lapack_int * n,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
       lapack_int * ldb, lapack_complex_double * alpha, lapack_complex_double *
       beta, lapack_complex_double * vl, lapack_int * ldvl,
       lapack_complex_double * vr, lapack_int * ldvr, lapack_complex_double *
       work, lapack_int * lwork, double * rwork, lapack_int * info)

zggev and zggev3 — same deal, identical signatures, the 3 is the whole plot twist 🌸. Note these use jobvl/jobvr (no s!) versus zgges's jobvsl/jobvsr. One tiny s difference and it's a whole different function. Be so serious right now 💀.

   void LAPACK_zggevx (char * balanc, char * jobvl, char * jobvr, char * sense,
       lapack_int * n, lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       alpha, lapack_complex_double * beta, lapack_complex_double * vl,
       lapack_int * ldvl, lapack_complex_double * vr, lapack_int * ldvr,
       lapack_int * ilo, lapack_int * ihi, double * lscale, double * rscale,
       double * abnrm, double * bbnrm, double * rconde, double * rcondv,
       lapack_complex_double * work, lapack_int * lwork, double * rwork,
       lapack_int * iwork, lapack_logical * bwork, lapack_int * info)

zggevx is the final boss 😤 — balanc, jobvl, jobvr, sense, then ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv, plus work/lwork, rwork, iwork, bwork. She has everything. Absolute main character energy, crown emoji, no notes 👑.


✨ the generalized least-squares / QZ corner 🫶🦋

   void LAPACK_zggglm (lapack_int * n, lapack_int * m, lapack_int * p,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
       lapack_int * ldb, lapack_complex_double * d, lapack_complex_double * x,
       lapack_complex_double * y, lapack_complex_double * work, lapack_int *
       lwork, lapack_int * info)

zggglm — peep the order: n, then m, then p. Not m, n, p. It's n first, bestie, I promise, look again 🙈. Then a/lda, b/ldb, d, x, y, work/lwork, info.

   void LAPACK_zgghd3 (char * compq, char * compz, lapack_int * n, lapack_int *
       ilo, lapack_int * ihi, lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * q,
       lapack_int * ldq, lapack_complex_double * z, lapack_int * ldz,
       lapack_complex_double * work, lapack_int * lwork, lapack_int * info)
   void LAPACK_zgghrd (char * compq, char * compz, lapack_int * n, lapack_int *
       ilo, lapack_int * ihi, lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * q,
       lapack_int * ldq, lapack_complex_double * z, lapack_int * ldz,
       lapack_int * info)

zgghd3 vs zgghrd — the only difference is that zgghd3 has work + lwork and zgghrd doesn't. Everything before info is identical: compq, compz, n, ilo, ihi, a, lda, b, ldb, q, ldq, z, ldz. Cute. Same outfit, one's just carrying a bag 💅.

   void LAPACK_zgglse (lapack_int * m, lapack_int * n, lapack_int * p,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
       lapack_int * ldb, lapack_complex_double * c, lapack_complex_double * d,
       lapack_complex_double * x, lapack_complex_double * work, lapack_int *
       lwork, lapack_int * info)

zgglse flips it back — here it's m, n, p (unlike zggglm's n, m, p, and yes that's on purpose, don't @ me). Then a, b, c, d, x, work/lwork, info. c and d, both present, both real 💖.

   void LAPACK_zggqrf (lapack_int * n, lapack_int * m, lapack_int * p,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double *
       taua, lapack_complex_double * b, lapack_int * ldb, lapack_complex_double
       * taub, lapack_complex_double * work, lapack_int * lwork, lapack_int *
       info)

And we close this batch with zggqrf — n, m, p again (matches zggglm's order, slay), the taua/taub twin situation (one tau for a, one for b, matching her a/lda and b/ldb), then work/lwork/info. That's the whole run for this part ✨🎀

  • LAPACK_zggrqf
void LAPACK_zggrqf (lapack_int * m, lapack_int * p, lapack_int * n,
    lapack_complex_double * a, lapack_int * lda, lapack_complex_double *
    taua, lapack_complex_double * b, lapack_int * ldb, lapack_complex_double
    * taub, lapack_complex_double * work, lapack_int * lwork, lapack_int *
    info)

okay so this one's giving "generalized RQ factorization of a complex pair" energy — it factors [A; B] with that m×n a and p×n b, spits out taua and taub on the side, and does all its scratch work in work with size lwork. info is your little status bestie at the end. 🎀

  • LAPACK_zggsvd
void LAPACK_zggsvd (char * jobu, char * jobv, char * jobq, lapack_int * m,
    lapack_int * n, lapack_int * p, lapack_int * k, lapack_int * l,
    lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
    lapack_int * ldb, double * alpha, double * beta, lapack_complex_double *
    u, lapack_int * ldu, lapack_complex_double * v, lapack_int * ldv,
    lapack_complex_double * q, lapack_int * ldq, lapack_complex_double *
    work, double * rwork, lapack_int * iwork, lapack_int * info)

the original complex generalized SVD, no cap — jobu/jobv/jobq tell it which unitary matrices you actually want, k and l come back as the effective rank and triangular part indices, and alpha/beta carry the generalized singular values. note: no lwork here, it's the legacy vibe. 💅

  • LAPACK_zggsvd3
void LAPACK_zggsvd3 (char * jobu, char * jobv, char * jobq, lapack_int * m,
    lapack_int * n, lapack_int * p, lapack_int * k, lapack_int * l,
    lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
    lapack_int * ldb, double * alpha, double * beta, lapack_complex_double *
    u, lapack_int * ldu, lapack_complex_double * v, lapack_int * ldv,
    lapack_complex_double * q, lapack_int * ldq, lapack_complex_double *
    work, lapack_int * lwork, double * rwork, lapack_int * iwork, lapack_int
    * info)

literally the glow-up of LAPACK_zggsvd — same whole generalized-SVD moment but now it takes lwork, so you can actually tell it how much work space it gets. the 3 is the main-character upgrade, periodt. ✨

  • LAPACK_zggsvp
void LAPACK_zggsvp (char * jobu, char * jobv, char * jobq, lapack_int * m,
    lapack_int * p, lapack_int * n, lapack_complex_double * a, lapack_int *
    lda, lapack_complex_double * b, lapack_int * ldb, double * tola, double
    * tolb, lapack_int * k, lapack_int * l, lapack_complex_double * u,
    lapack_int * ldu, lapack_complex_double * v, lapack_int * ldv,
    lapack_complex_double * q, lapack_int * ldq, lapack_int * iwork, double
    * rwork, lapack_complex_double * tau, lapack_complex_double * work,
    lapack_int * info)

the "pre-processing" bestie for the generalized SVD — it reduces a and b into a nice upper-triangular-ish form so the actual SVD step can slay. tola/tolb are your tolerance thresholds, k and l come back as the ranks, and yeah, this one packs iwork, rwork, tau AND work — she's high-maint. 🙈

  • LAPACK_zggsvp3
void LAPACK_zggsvp3 (char * jobu, char * jobv, char * jobq, lapack_int * m,
    lapack_int * p, lapack_int * n, lapack_complex_double * a, lapack_int *
    lda, lapack_complex_double * b, lapack_int * ldb, double * tola, double
    * tolb, lapack_int * k, lapack_int * l, lapack_complex_double * u,
    lapack_int * ldu, lapack_complex_double * v, lapack_int * ldv,
    lapack_complex_double * q, lapack_int * ldq, lapack_int * iwork, double
    * rwork, lapack_complex_double * tau, lapack_complex_double * work,
    lapack_int * lwork, lapack_int * info)

same as LAPACK_zggsvp but with one extra flex: lwork. everything else is identical, it's just the version that lets you control the work array size instead of having it hard-set. small upgrade, big vibes. 🦋

  • LAPACK_zgtcon
void LAPACK_zgtcon (char * norm, lapack_int * n, const lapack_complex_double
    * dl, const lapack_complex_double * d, const lapack_complex_double * du,
    const lapack_complex_double * du2, const lapack_int * ipiv, double *
    anorm, double * rcond, lapack_complex_double * work, lapack_int * info)

condition-number girlie for a complex tridiagonal matrix — feed it the dl/d/du/du2 factorization bands plus ipiv, tell it which norm you want, and it hands back rcond so you know how sketchy your system is. anorm is the norm you already computed, bestie. 👑

  • LAPACK_zgtrfs
void LAPACK_zgtrfs (char * trans, lapack_int * n, lapack_int * nrhs, const
    lapack_complex_double * dl, const lapack_complex_double * d, const
    lapack_complex_double * du, const lapack_complex_double * dlf, const
    lapack_complex_double * df, const lapack_complex_double * duf, const
    lapack_complex_double * du2, const lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x,
    lapack_int * ldx, double * ferr, double * berr, lapack_complex_double *
    work, double * rwork, lapack_int * info)

refines your solution and reports the error so you can vibe-check your answer — it takes the original bands (dl, d, du), the factored ones (dlf, df, duf, du2), ipiv, the RHS b, and improves x in place. ferr and berr are your forward/backward error besties. 🔥

  • LAPACK_zgtsv
void LAPACK_zgtsv (lapack_int * n, lapack_int * nrhs, lapack_complex_double
    * dl, lapack_complex_double * d, lapack_complex_double * du,
    lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

the no-thoughts-just-solve tridiagonal solver — n unknowns, nrhs right-hand sides, bands in dl/d/du, answer lives in b with leading dimension ldb. zero factorization babysitting required, she does it all. 🧚

  • LAPACK_zgtsvx
void LAPACK_zgtsvx (char * fact, char * trans, lapack_int * n, lapack_int *
    nrhs, const lapack_complex_double * dl, const lapack_complex_double * d,
    const lapack_complex_double * du, lapack_complex_double * dlf,
    lapack_complex_double * df, lapack_complex_double * duf,
    lapack_complex_double * du2, lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x,
    lapack_int * ldx, double * rcond, double * ferr, double * berr,
    lapack_complex_double * work, double * rwork, lapack_int * info)

the "expert" version that does solve PLUS gives you the condition estimate rcond and the errors ferr/berr. fact says whether you're bringing an already-factored matrix (the dlf/df/duf/du2/ipiv crew) or letting her factor it fresh. trans decides if you want A, A^T, or A^H. 🎀

  • LAPACK_zgttrf
void LAPACK_zgttrf (lapack_int * n, lapack_complex_double * dl,
    lapack_complex_double * d, lapack_complex_double * du,
    lapack_complex_double * du2, lapack_int * ipiv, lapack_int * info)

the factorization step for a complex tridiagonal matrix — turns dl/d/du into the factored goodies stored right back in there plus du2 and the pivot list ipiv. do this once, then LAPACK_zgttrs as many times as your heart desires. 💜

  • LAPACK_zgttrs
void LAPACK_zgttrs (char * trans, lapack_int * n, lapack_int * nrhs, const
    lapack_complex_double * dl, const lapack_complex_double * d, const
    lapack_complex_double * du, const lapack_complex_double * du2, const
    lapack_int * ipiv, lapack_complex_double * b, lapack_int * ldb,
    lapack_int * info)

the solve step that pairs with LAPACK_zgttrf — hand it the pre-factored bands, ipiv, and your b, and it solves A*X = B, A^T*X = B, or A^H*X = B depending on trans. result lands in b, obviously. ⭐

  • LAPACK_zhbev
void LAPACK_zhbev (char * jobz, char * uplo, lapack_int * n, lapack_int *
    kd, lapack_complex_double * ab, lapack_int * ldab, double * w,
    lapack_complex_double * z, lapack_int * ldz, lapack_complex_double *
    work, double * rwork, lapack_int * info)

eigenvalue moment for a complex Hermitian band matrix — ab holds the band storage with kd super/subdiagonals, uplo says which triangle you actually filled in, jobz decides if you want eigenvectors in z or just the values w. eigenvalues are real since she's Hermitian, as she should be. 🌸

  • LAPACK_zhbev_2stage
void LAPACK_zhbev_2stage (char * jobz, char * uplo, lapack_int * n,
    lapack_int * kd, lapack_complex_double * ab, lapack_int * ldab, double *
    w, lapack_complex_double * z, lapack_int * ldz, lapack_complex_double *
    work, lapack_int * lwork, double * rwork, lapack_int * info)

same LAPACK_zhbev energy but the two-stage algorithm edition, which is why it gets the extra lwork so you can size work yourself. same args otherwise, same real eigenvalues, same slay. 🦋

  • LAPACK_zhbevd
void LAPACK_zhbevd (char * jobz, char * uplo, lapack_int * n, lapack_int *
    kd, lapack_complex_double * ab, lapack_int * ldab, double * w,
    lapack_complex_double * z, lapack_int * ldz, lapack_complex_double *
    work, lapack_int * lwork, double * rwork, lapack_int * lrwork,
    lapack_int * iwork, lapack_int * liwork, lapack_int * info)

divide-and-conquer eigenvalues for the Hermitian band matrix — needs work/lwork, rwork/lrwork, and iwork/liwork because she's thorough like that. eigenvalues come out real in w, eigenvectors in z if jobz says so. 💅

  • LAPACK_zhbevd_2stage
void LAPACK_zhbevd_2stage (char * jobz, char * uplo, lapack_int * n,
    lapack_int * kd, lapack_complex_double * ab, lapack_int * ldab, double *
    w, lapack_complex_double * z, lapack_int * ldz, lapack_complex_double *
    work, lapack_int * lwork, double * rwork, lapack_int * lrwork,
    lapack_int * iwork, lapack_int * liwork, lapack_int * info)

LAPACK_zhbevd but with the two-stage glow — same signature, same lwork/lrwork/liwork family, same real w and optional z. it's the "same but faster algorithm" remix, iykyk. ✨

  • LAPACK_zhbevx
void LAPACK_zhbevx (char * jobz, char * range, char * uplo, lapack_int * n,
    lapack_int * kd, lapack_complex_double * ab, lapack_int * ldab,
    lapack_complex_double * q, lapack_int * ldq, double * vl, double * vu,
    lapack_int * il, lapack_int * iu, double * abstol, lapack_int * m,
    double * w, lapack_complex_double * z, lapack_int * ldz,
    lapack_complex_double * work, double * rwork, lapack_int * iwork,
    lapack_int * ifail, lapack_int * info)

the fancy "pick which eigenvalues I want" version — range says all / by index / by interval, vl/vu cover the interval case, il/iu cover the index case, and abstol is your tolerance. m comes back as how many you actually got, and ifail names any eigenvectors that didn't converge. genuinely iconic range-control energy. 🎯

  • LAPACK_zhbevx_2stage
void LAPACK_zhbevx_2stage (char * jobz, char * range, char * uplo,
    lapack_int * n, lapack_int * kd, lapack_complex_double * ab, lapack_int
    * ldab, lapack_complex_double * q, lapack_int * ldq, double * vl, double
    * vu, lapack_int * il, lapack_int * iu, double * abstol, lapack_int * m,
    double * w, lapack_complex_double * z, lapack_int * ldz,
    lapack_complex_double * work, lapack_int * lwork, double * rwork,
    lapack_int * iwork, lapack_int * ifail, lapack_int * info)

all the range-picking LAPACK_zhbevx drama, now in two-stage form so of course there's an extra lwork in the middle of the arg list. vl, vu, il, iu, abstol, m, ifail all doing exactly what they did before. 🫶

  • LAPACK_zhbgst
void LAPACK_zhbgst (char * vect, char * uplo, lapack_int * n, lapack_int *
    ka, lapack_int * kb, lapack_complex_double * ab, lapack_int * ldab,
    const lapack_complex_double * bb, lapack_int * ldbb,
    lapack_complex_double * x, lapack_int * ldx, lapack_complex_double *
    work, double * rwork, lapack_int * info)

reduces a complex Hermitian-definite banded generalized eigenproblem to standard form — ab is Hermitian band with ka, bb is the positive-definite band with kb, and the reduction gets applied out of ab/bb into x (leading dim ldx). vect decides whether the transformation matrix comes back. lowkey a lot, but she's got work and rwork to carry it. 💪

  • LAPACK_zhbgv
void LAPACK_zhbgv (char * jobz, char * uplo, lapack_int * n, lapack_int *
    ka, lapack_int * kb, lapack_complex_double * ab, lapack_int * ldab,
    lapack_complex_double * bb, lapack_int * ldbb, double * w,
    lapack_complex_double * z, lapack_int * ldz, lapack_complex_double *
    work, double * rwork, lapack_int * info)

solves the banded generalized Hermitian-definite eigenproblem A*x = lambda*B*x — ab (bandwidth ka) and bb (bandwidth kb, and she's positive definite), eigenvalues land real in w, eigenvectors in z if jobz is set. work + rwork are the usual support squad. 🌈

  • LAPACK_zhbgvd
void LAPACK_zhbgvd (char * jobz, char * uplo, lapack_int * n, lapack_int *
    ka, lapack_int * kb, lapack_complex_double * ab, lapack_int * ldab,
    lapack_complex_double * bb, lapack_int * ldbb, double * w,
    lapack_complex_double * z, lapack_int * ldz, lapack_complex_double *
    work, lapack_int * lwork, double * rwork, lapack_int * lrwork,
    lapack_int * iwork, lapack_int * liwork, lapack_int * info)

divide-and-conquer take on LAPACK_zhbgv — same banded generalized eigenproblem, but now with lwork/lrwork/liwork because the D&C algorithm needs its full entourage of workspace. real w, optional z, all the drama. 👑

  • LAPACK_zhbgvx
void LAPACK_zhbgvx (char * jobz, char * range, char * uplo, lapack_int * n,
    lapack_int * ka, lapack_int * kb, lapack_complex_double * ab, lapack_int
    * ldab, lapack_complex_double * bb, lapack_int * ldbb,
    lapack_complex_double * q, lapack_int * ldq, double * vl, double * vu,
    lapack_int * il, lapack_int * iu, double * abstol, lapack_int * m,
    double * w, lapack_complex_double * z, lapack_int * ldz,
    lapack_complex_double * work, double * rwork, lapack_int * iwork,
    lapack_int * ifail, lapack_int * info)

the picky-eigenvalue version of the banded generalized problem — range + vl/vu + il/iu + abstol choose exactly what you want, m tells you how many came back, q holds the transformation, and ifail rats out any non-converged eigenvectors. a whole personality, honestly. 🍓

  • LAPACK_zhbtrd
void LAPACK_zhbtrd (char * vect, char * uplo, lapack_int * n, lapack_int *
    kd, lapack_complex_double * ab, lapack_int * ldab, double * d, double *
    e, lapack_complex_double * q, lapack_int * ldq, lapack_complex_double *
    work, lapack_int * info)

reduces a complex Hermitian band matrix (ab, bandwidth kd) to real symmetric tridiagonal form — the diagonal lands in d, the off-diagonals in e, and if vect says go, the unitary q comes back too. classic "make the problem easier so the next algorithm can eat" step. 🎀

  • LAPACK_zhecon
void LAPACK_zhecon (char * uplo, lapack_int * n, const lapack_complex_double
    * a, lapack_int * lda, const lapack_int * ipiv, double * anorm, double *
    rcond, lapack_complex_double * work, lapack_int * info)

condition number for a complex Hermitian indefinite matrix — you bring the already-factored a (courtesy of LAPACK_zhetrf, ipiv included), the norm anorm, and she gives you rcond. uplo picks the triangle. simple, effective, no notes. 💜

  • LAPACK_zhecon_3
void LAPACK_zhecon_3 (char * uplo, lapack_int * n, const
    lapack_complex_double * a, lapack_int * lda, const lapack_complex_double
    * e, const lapack_int * ipiv, double * anorm, double * rcond,
    lapack_complex_double * work, lapack_int * info)

the _3 remix of LAPACK_zhecon — same condition-estimate job, but it also takes that extra e array (the tridiagonal-ish factor from the _3 factorization family). uplo, n, a, lda, ipiv, anorm, rcond, work, info all doing their thing. 🦋

  • LAPACK_zheequb
void LAPACK_zheequb (char * uplo, lapack_int * n, const
    lapack_complex_double * a, lapack_int * lda, double * s, double * scond,
    double * amax, lapack_complex_double * work, lapack_int * info)

computes the equilibration scaling factors for a complex Hermitian matrix — s holds the scale factors, scond is the ratio of the largest to smallest of them, and amax is the absolute max element you started with. uplo picks your triangle. it's the "make the numbers less feral before solving" prep bestie. 🌟

  • LAPACK_zheev
void LAPACK_zheev (char * jobz, char * uplo, lapack_int * n,
    lapack_complex_double * a, lapack_int * lda, double * w,
    lapack_complex_double * work, lapack_int * lwork, double * rwork,
    lapack_int * info)

THE classic — eigenvalues and (optionally) eigenvectors of a complex Hermitian matrix a, eigenvalues real in w, eigenvectors replacing a when jobz is on, and work/lwork/rwork along for the ride. she's the one everybody knows. 💅

  • LAPACK_zheev_2stage
void LAPACK_zheev_2stage (char * jobz, char * uplo, lapack_int * n,
    lapack_complex_double * a, lapack_int * lda, double * w,
    lapack_complex_double * work, lapack_int * lwork, double * rwork,
    lapack_int * info)

LAPACK_zheev's two-stage sibling — identical signature, identical real w output, just the different internal algorithm. honestly if you didn't read the name you couldn't tell, and that's the point. ✨

  • LAPACK_zheevd
void LAPACK_zheevd (char * jobz, char * uplo, lapack_int * n,
    lapack_complex_double * a, lapack_int * lda, double * w,
    lapack_complex_double * work, lapack_int * lwork, double * rwork,
    lapack_int * lrwork, lapack_int * iwork, lapack_int * liwork, lapack_int
    * info)

divide-and-conquer eigen-solver for the Hermitian matrix — same jobz/uplo/a/w deal, but now with the full workspace entourage: lwork, lrwork, liwork. eigenvalues real, eigenvectors in a when asked. she's extra but she earns it. 👑

  • LAPACK_zheevd_2stage
void LAPACK_zheevd_2stage (char * jobz, char * uplo, lapack_int * n,
    lapack_complex_double * a, lapack_int * lda, double * w,
    lapack_complex_double * work, lapack_int * lwork, double * rwork,
    lapack_int * lrwork, lapack_int * iwork, lapack_int * liwork, lapack_int
    * info)

LAPACK_zheevd with the two-stage algorithm underneath — signature matches LAPACK_zheevd point for point, all the lwork/lrwork/liwork girls included. real w, overachieving a. 🎀

  • LAPACK_zheevr
void LAPACK_zheevr (char * jobz, char * range, char * uplo, lapack_int * n,
    lapack_complex_double * a, lapack_int * lda, double * vl, double * vu,
    lapack_int * il, lapack_int * iu, double * abstol, lapack_int * m,
    double * w, lapack_complex_double * z, lapack_int * ldz, lapack_int *
    isuppz, lapack_complex_double * work, lapack_int * lwork, double *
    rwork, lapack_int * lrwork, lapack_int * iwork, lapack_int * liwork,
    lapack_int * info)

the MRRR range-selector icon — range + vl/vu + il/iu + abstol pick your faves, m says how many, w holds the real values, z holds the vectors, and isuppz tells you the support of each vector in z. full workspace entourage of course. truly the full package. 🌸

  • LAPACK_zheevr_2stage
void LAPACK_zheevr_2stage (char * jobz, char * range, char * uplo,
    lapack_int * n, lapack_complex_double * a, lapack_int * lda, double *
    vl, double * vu, lapack_int * il, lapack_int * iu, double * abstol,
    lapack_int * m, double * w, lapack_complex_double * z, lapack_int * ldz,
    lapack_int * isuppz, lapack_complex_double * work, lapack_int * lwork,
    double * rwork, lapack_int * lrwork, lapack_int * iwork, lapack_int *
    liwork, lapack_int * info)

same range-picking, support-reporting LAPACK_zheevr behavior but two-stage flavored — every arg lines up exactly with LAPACK_zheevr, isuppz and all. she's the remix that keeps every feature. 🦋

  • LAPACK_zheevx
void LAPACK_zheevx (char * jobz, char * range, char * uplo, lapack_int * n,
    lapack_complex_double * a, lapack_int * lda, double * vl, double * vu,
    lapack_int * il, lapack_int * iu, double * abstol, lapack_int * m,

the "select your eigenvalues by range or index" bestie for a complex Hermitian matrix — jobz, range, uplo, n, a, lda, vl, vu, il, iu, abstol, and m so far... and she keeps going. (the signature continues — no spoilers, next part's got the rest 💀)

...and picking up the exact tail end of LAPACK_zheevx that got rudely chopped by the part break 💀 — she's still mid-sentence, be respectful:

       double * w, lapack_complex_double * z, lapack_int * ldz,
       lapack_complex_double * work, lapack_int * lwork, double * rwork,
       lapack_int * iwork, lapack_int * ifail, lapack_int * info)

Right, so, back to the parade of zhe* declarations — the double-complex hermitian cinematic universe 🌌. Every single one, no skips, no cap:

  • LAPACK_zheevx_2stage — the two-stage glow-up of zheevx, and it kept all the drama: jobz, range, uplo, vl, vu, il, iu, abstol, m, w, z, ldz, plus work, lwork, rwork, iwork, ifail and info. Full glam, zero cuts. 💅
   void LAPACK_zheevx_2stage (char * jobz, char * range, char * uplo,
       lapack_int * n, lapack_complex_double * a, lapack_int * lda, double *
       vl, double * vu, lapack_int * il, lapack_int * iu, double * abstol,
       lapack_int * m, double * w, lapack_complex_double * z, lapack_int * ldz,
       lapack_complex_double * work, lapack_int * lwork, double * rwork,
       lapack_int * iwork, lapack_int * ifail, lapack_int * info)
  • LAPACK_zhegst — the low-maintenance icon of the family: no work, no lwork, no jobz, just itype, uplo, n, a, lda, a const b, ldb and info. Minimalist queen. 🎀
   void LAPACK_zhegst (lapack_int * itype, char * uplo, lapack_int * n,
       lapack_complex_double * a, lapack_int * lda, const lapack_complex_double
       * b, lapack_int * ldb, lapack_int * info)
  • LAPACK_zhegv — generalized eigen energy ✨, itype first, and yes bestie it brought rwork along.
   void LAPACK_zhegv (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, lapack_complex_double * a, lapack_int * lda, lapack_complex_double
       * b, lapack_int * ldb, double * w, lapack_complex_double * work,
       lapack_int * lwork, double * rwork, lapack_int * info)
  • LAPACK_zhegv_2stage — same vibe, extra stage, name says it all. 🔥
   void LAPACK_zhegv_2stage (lapack_int * itype, char * jobz, char * uplo,
       lapack_int * n, lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * b, lapack_int * ldb, double * w,
       lapack_complex_double * work, lapack_int * lwork, double * rwork,
       lapack_int * info)
  • LAPACK_zhegvd — the d is for divide and conquer, and the signature is giving "I brought extra luggage": lrwork, iwork, liwork all check in. 🧳
   void LAPACK_zhegvd (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, lapack_complex_double * a, lapack_int * lda, lapack_complex_double
       * b, lapack_int * ldb, double * w, lapack_complex_double * work,
       lapack_int * lwork, double * rwork, lapack_int * lrwork, lapack_int *
       iwork, lapack_int * liwork, lapack_int * info)
  • LAPACK_zhegvx — the expert one, so obviously she has a range, a vl, a vu, an il, an iu, an abstol, an m and an ifail. Overachiever behaviour, honestly iconic. 👑
   void LAPACK_zhegvx (lapack_int * itype, char * jobz, char * range, char *
       uplo, lapack_int * n, lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * b, lapack_int * ldb, double * vl, double * vu,
       lapack_int * il, lapack_int * iu, double * abstol, lapack_int * m,
       double * w, lapack_complex_double * z, lapack_int * ldz,
       lapack_complex_double * work, lapack_int * lwork, double * rwork,
       lapack_int * iwork, lapack_int * ifail, lapack_int * info)

🦋 the zherfs / zhesv cinematic universe

  • LAPACK_zherfs — refinement hours, bestie. Look at all those consts on a, af, ipiv and b — she does not touch your inputs, she's a respectful queen. Outputs ferr and berr for the accuracy tea. 🍓
   void LAPACK_zherfs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_double * a, lapack_int * lda, const lapack_complex_double
       * af, lapack_int * ldaf, const lapack_int * ipiv, const
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x,
       lapack_int * ldx, double * ferr, double * berr, lapack_complex_double *
       work, double * rwork, lapack_int * info)
  • LAPACK_zherfsx — the extended cut 🎬: equed and s slide in, and then the whole error-bound situation — rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. That's a lot of parameters and she's not sorry.
   void LAPACK_zherfsx (char * uplo, char * equed, lapack_int * n, lapack_int *
       nrhs, const lapack_complex_double * a, lapack_int * lda, const
       lapack_complex_double * af, lapack_int * ldaf, const lapack_int * ipiv,
       const double * s, const lapack_complex_double * b, lapack_int * ldb,
       lapack_complex_double * x, lapack_int * ldx, double * rcond, double *
       berr, lapack_int * n_err_bnds, double * err_bnds_norm, double *
       err_bnds_comp, lapack_int * nparams, double * params,
       lapack_complex_double * work, double * rwork, lapack_int * info)
  • LAPACK_zhesv — the classic solve. uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info. Clean, simple, ate. ✨
   void LAPACK_zhesv (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_double * a, lapack_int * lda, lapack_int * ipiv,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zhesv_aa — literally the same signature as zhesv but with _aa in the name, and honestly? Respect the consistency. 🫶
   void LAPACK_zhesv_aa (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_double * a, lapack_int * lda, lapack_int * ipiv,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zhesv_aa_2stage — now with a whole extra factorization friend (tb, ltb) and a second pivot array ipiv2. Two pivots, double the chaos, still slaying. 💀
   void LAPACK_zhesv_aa_2stage (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * tb,
       lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zhesv_rk — the _rk variant brings an e array to the party (right between lda and ipiv, bestie, keep up 💅).
   void LAPACK_zhesv_rk (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * e,
       lapack_int * ipiv, lapack_complex_double * b, lapack_int * ldb,
       lapack_complex_double * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zhesvx — the x means "expert", and the expert brought fact upfront, an af/ldaf, and outputs rcond, ferr, berr alongside the usual work, lwork, rwork. 🌸
   void LAPACK_zhesvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, const lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * af, lapack_int * ldaf, lapack_int * ipiv, const
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x,
       lapack_int * ldx, double * rcond, double * ferr, double * berr,
       lapack_complex_double * work, lapack_int * lwork, double * rwork,
       lapack_int * info)
  • LAPACK_zhesvxx — two x's, so you know she's extra. equed, s, rpvgrw, the full n_err_bnds / err_bnds_norm / err_bnds_comp / nparams / params suite. The whole dashboard. 🔥
   void LAPACK_zhesvxx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, lapack_complex_double * a, lapack_int * lda, lapack_complex_double
       * af, lapack_int * ldaf, lapack_int * ipiv, char * equed, double * s,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x,
       lapack_int * ldx, double * rcond, double * rpvgrw, double * berr,
       lapack_int * n_err_bnds, double * err_bnds_norm, double * err_bnds_comp,
       lapack_int * nparams, double * params, lapack_complex_double * work,
       double * rwork, lapack_int * info)
  • LAPACK_zheswapr — ok wait, notice something? No info argument 😭 she just takes uplo, n, a, lda, i1, i2 and leaves. No status report, no work. Chaotic and I respect it.
   void LAPACK_zheswapr (char * uplo, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_int * i1, lapack_int * i2)

🌈 tridiagonal & factorization crew

  • LAPACK_zhetrd — reduction hours: outputs d, e, tau, and needs work + lwork. Neat little assembly line. 🎀
   void LAPACK_zhetrd (char * uplo, lapack_int * n, lapack_complex_double * a,
       lapack_int * lda, double * d, double * e, lapack_complex_double * tau,
       lapack_complex_double * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zhetrf — factorization, basic edition. ipiv present, info present, vibes immaculate. 🌸
   void LAPACK_zhetrf (char * uplo, lapack_int * n, lapack_complex_double * a,
       lapack_int * lda, lapack_int * ipiv, lapack_complex_double * work,
       lapack_int * lwork, lapack_int * info)
  • LAPACK_zhetrf_aa — same signature, _aa suffix. Consistent queen. 🫶
   void LAPACK_zhetrf_aa (char * uplo, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_int * ipiv, lapack_complex_double * work,
       lapack_int * lwork, lapack_int * info)
  • LAPACK_zhetrf_aa_2stage — tb, ltb, ipiv, ipiv2. Two-stage means two pivots, I don't make the rules. 💅
   void LAPACK_zhetrf_aa_2stage (char * uplo, lapack_int * n,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * tb,
       lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,
       lapack_complex_double * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zhetrf_rk — hello e, my old friend 🎶 (sits right before ipiv).
   void LAPACK_zhetrf_rk (char * uplo, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_complex_double * e, lapack_int * ipiv,
       lapack_complex_double * work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zhetrf_rook — rook pivot era, and note the cute line break in the declaration: lapack_complex_double then * a on the next line. Keep it exactly like that, bestie, it's part of the lore. 🦋
   void LAPACK_zhetrf_rook (char * uplo, lapack_int * n, lapack_complex_double
       * a, lapack_int * lda, lapack_int * ipiv, lapack_complex_double * work,
       lapack_int * lwork, lapack_int * info)
  • LAPACK_zhetri — inverse time! And ipiv is const here because she reads your pivots, she doesn't rewrite them. Immaculate manners. ✨
   void LAPACK_zhetri (char * uplo, lapack_int * n, lapack_complex_double * a,
       lapack_int * lda, const lapack_int * ipiv, lapack_complex_double * work,
       lapack_int * info)
  • LAPACK_zhetri2 — same but with lwork tagging along. 🎀
   void LAPACK_zhetri2 (char * uplo, lapack_int * n, lapack_complex_double * a,
       lapack_int * lda, const lapack_int * ipiv, lapack_complex_double * work,
       lapack_int * lwork, lapack_int * info)
  • LAPACK_zhetri2x — and now there's an nb in there too. Block size says hi. 👑
   void LAPACK_zhetri2x (char * uplo, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, const lapack_int * ipiv, lapack_complex_double *
       work, lapack_int * nb, lapack_int * info)
  • LAPACK_zhetri_3 — the _3 one takes the e array as const lapack_complex_double * and ipiv as const lapack_int *, plus work + lwork. Fancy. 💜
   void LAPACK_zhetri_3 (char * uplo, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, const lapack_complex_double * e, const lapack_int *
       ipiv, lapack_complex_double * work, lapack_int * lwork, lapack_int *
       info)

💜 the zhetrs solve squad

  • LAPACK_zhetrs — solves, with a, lda, const ipiv, b, ldb, info. No work array, no notes. 🫶
   void LAPACK_zhetrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_double * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_double * b, lapack_int * ldb, lapack_int * info)
  • LAPACK_zhetrs2 — same but she brought work. 🌸
   void LAPACK_zhetrs2 (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_double * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       work, lapack_int * info)
  • LAPACK_zhetrs_3 — now with a const e wedged between a and ipiv. Three's company. 💅
   void LAPACK_zhetrs_3 (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_double * a, lapack_int * lda, const lapack_complex_double
       * e, const lapack_int * ipiv, lapack_complex_double * b, lapack_int *
       ldb, lapack_int * info)
  • LAPACK_zhetrs_aa — _aa plus work and lwork. Best of both worlds, honestly. ✨
   void LAPACK_zhetrs_aa (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_double * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       work, lapack_int * lwork, lapack_int * info)
  • LAPACK_zhetrs_aa_2stage — and here's the 2stage solve: tb, ltb, ipiv, ipiv2, and no work/lwork in sight. Period. 💀
   void LAPACK_zhetrs_aa_2stage (char * uplo, lapack_int * n, lapack_int *
       nrhs, lapack_complex_double * a, lapack_int * lda, lapack_complex_double
       * tb, lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,
       lapack_complex_double * b, lapack_int * ldb, lapack_int * info)
  • LAPACK_zhetrs_rook — rook flavour solve, all const where it counts. 🦋
   void LAPACK_zhetrs_rook (char * uplo, lapack_int * n, lapack_int * nrhs,
       const lapack_complex_double * a, lapack_int * lda, const lapack_int *
       ipiv, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

⭐ packed & generalized-adjacent girlies

  • LAPACK_zhfrk — ok so she has transr, uplo, trans, n, k, alpha, const a, lda, beta, c... and no info. None. Zero. She simply does not report back 😭 Also no work. Main character energy.
   void LAPACK_zhfrk (char * transr, char * uplo, char * trans, lapack_int * n,
       lapack_int * k, double * alpha, const lapack_complex_double * a,
       lapack_int * lda, double * beta, lapack_complex_double * c)
  • LAPACK_zhgeqz — the generalized Schur situation: job, compq, compz, n, ilo, ihi, h, ldh, t, ldt, alpha, beta, q, ldq, z, ldz, work, lwork, rwork, info. A whole cast list. 🎬
   void LAPACK_zhgeqz (char * job, char * compq, char * compz, lapack_int * n,
       lapack_int * ilo, lapack_int * ihi, lapack_complex_double * h,
       lapack_int * ldh, lapack_complex_double * t, lapack_int * ldt,
       lapack_complex_double * alpha, lapack_complex_double * beta,
       lapack_complex_double * q, lapack_int * ldq, lapack_complex_double * z,
       lapack_int * ldz, lapack_complex_double * work, lapack_int * lwork,
       double * rwork, lapack_int * info)
  • LAPACK_zhpcon — condition number checking on packed storage: const ap, const ipiv, plus anorm, rcond, work, info. Note the line break splitting const lapack_complex_double from * ap — that's canon, keep it. 🍓
   void LAPACK_zhpcon (char * uplo, lapack_int * n, const lapack_complex_double
       * ap, const lapack_int * ipiv, double * anorm, double * rcond,
       lapack_complex_double * work, lapack_int * info)
  • LAPACK_zhpev — packed eigen, simple era: jobz, uplo, n, ap, w, z, ldz, work, rwork, info. 🎀
   void LAPACK_zhpev (char * jobz, char * uplo, lapack_int * n,
       lapack_complex_double * ap, double * w, lapack_complex_double * z,
       lapack_int * ldz, lapack_complex_double * work, double * rwork,
       lapack_int * info)
  • LAPACK_zhpevd — the d version rolls in with lwork, lrwork, iwork, liwork. She packed for a whole weekend. 🧳
   void LAPACK_zhpevd (char * jobz, char * uplo, lapack_int * n,
       lapack_complex_double * ap, double * w, lapack_complex_double * z,
       lapack_int * ldz, lapack_complex_double * work, lapack_int * lwork,
       double * rwork, lapack_int * lrwork, lapack_int * iwork, lapack_int *
       liwork, lapack_int * info)
  • LAPACK_zhpevx — expert packed: range, vl, vu, il, iu, abstol, m, ifail. Full expert kit, packed storage edition. 👑
   void LAPACK_zhpevx (char * jobz, char * range, char * uplo, lapack_int * n,
       lapack_complex_double * ap, double * vl, double * vu, lapack_int * il,
       lapack_int * iu, double * abstol, lapack_int * m, double * w,
       lapack_complex_double * z, lapack_int * ldz, lapack_complex_double *
       work, double * rwork, lapack_int * iwork, lapack_int * ifail, lapack_int
       * info)
  • LAPACK_zhpgst — packed generalized, and like zhegst she's keeping it lean: itype, uplo, n, ap, const bp, info. No work, no drama. 🌸
   void LAPACK_zhpgst (lapack_int * itype, char * uplo, lapack_int * n,
       lapack_complex_double * ap, const lapack_complex_double * bp, lapack_int
       * info)
  • LAPACK_zhpgv — packed generalized eigen, with z, ldz, work, rwork, info along for the ride. 🦋
   void LAPACK_zhpgv (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, lapack_complex_double * ap, lapack_complex_double * bp, double * w,
       lapack_complex_double * z, lapack_int * ldz, lapack_complex_double *
       work, double * rwork, lapack_int * info)
  • LAPACK_zhpgvd — and we're ending this part on a literal cliffhanger 😭 she starts off itype, jobz, uplo, n, ap, bp, w... and then the part just stops, mid-signature, mid-breath. Not me getting cut off right at double * w,. To be continued, bestie — the rest of this one lands next part 💀💖
   void LAPACK_zhpgvd (lapack_int * itype, char * jobz, char * uplo, lapack_int
       * n, lapack_complex_double * ap, lapack_complex_double * bp, double * w,

...and it just keeps going, bestie, we're still in the z squad and the z squad is long 😭💜 Here's the tail end of the last one:

      lapack_complex_double * z, lapack_int * ldz, lapack_complex_double * work, lapack_int * lwork, double * rwork, lapack_int * lrwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

Ok so like — notice how everything here is a pointer? Even the plain ints. lapack_int * n. The count. A pointer to the count. That's just the vibe of this entire header and we're gonna respect it 💅


void LAPACK_zhpgvx (lapack_int * itype, char * jobz, char * range, char * uplo, lapack_int * n, lapack_complex_double * ap, lapack_complex_double * bp, double * vl, double * vu, lapack_int * il, lapack_int * iu, double * abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int * ldz, lapack_complex_double * work, double * rwork, lapack_int * iwork, lapack_int * ifail, lapack_int * info)
void LAPACK_zhprfs (char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * ap, const lapack_complex_double * afp, const lapack_int * ipiv, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)
void LAPACK_zhpsv (char * uplo, lapack_int * n, lapack_int * nrhs, lapack_complex_double * ap, lapack_int * ipiv, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)
void LAPACK_zhpsvx (char * fact, char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * ap, lapack_complex_double * afp, lapack_int * ipiv, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * rcond, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)

the zhp cluster — packed hermitian squad, all sharing that ap / ipiv / b / ldb / info skeleton. You could set a clock to these argument lists fr fr 🕰️✨

void LAPACK_zhptrd (char * uplo, lapack_int * n, lapack_complex_double * ap, double * d, double * e, lapack_complex_double * tau, lapack_int * info)
void LAPACK_zhptrf (char * uplo, lapack_int * n, lapack_complex_double * ap, lapack_int * ipiv, lapack_int * info)
void LAPACK_zhptri (char * uplo, lapack_int * n, lapack_complex_double * ap, const lapack_int * ipiv, lapack_complex_double * work, lapack_int * info)
void LAPACK_zhptrs (char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * ap, const lapack_int * ipiv, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

lowkey obsessed with the trd one? d and e are plain double * while everything around them is double-complex. little icon behavior 🎀


void LAPACK_zhsein (char * job, char * eigsrc, char * initv, const lapack_logical * select, lapack_int * n, const lapack_complex_double * h, lapack_int * ldh, lapack_complex_double * w, lapack_complex_double * vl, lapack_int * ldvl, lapack_complex_double * vr, lapack_int * ldvr, lapack_int * mm, lapack_int * m, lapack_complex_double * work, double * rwork, lapack_int * ifaill, lapack_int * ifailr, lapack_int * info)
void LAPACK_zhseqr (char * job, char * compz, lapack_int * n, lapack_int * ilo, lapack_int * ihi, lapack_complex_double * h, lapack_int * ldh, lapack_complex_double * w, lapack_complex_double * z, lapack_int * ldz, lapack_complex_double * work, lapack_int * lwork, lapack_int * info)

two ifail-flavoured outputs in zhsein — ifaill and ifailr — one for the left vectors, one for the right. left girlies and right girlies both get their own report card 💀💖


okay now we switch letters, hold on to something 🌀
void LAPACK_zlacgv (lapack_int * n, lapack_complex_double * x, lapack_int * incx)
void LAPACK_zlacn2 (lapack_int * n, lapack_complex_double * v, lapack_complex_double * x, double * est, lapack_int * kase, lapack_int * isave)
void LAPACK_zlacp2 (char * uplo, lapack_int * m, lapack_int * n, const double * a, lapack_int * lda, lapack_complex_double * b, lapack_int * ldb)
void LAPACK_zlacpy (char * uplo, lapack_int * m, lapack_int * n, const lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b, lapack_int * ldb)

zlacp2 takes a const double * a and writes a lapack_complex_double * b — real in, complex out, the glow-up pipeline 🦋 And zlacpy is the matching copy move, but complex-to-complex. Siblings, not twins, iykyk 👑

void LAPACK_zlacrm (lapack_int * m, lapack_int * n, const lapack_complex_double * a, lapack_int * lda, const double * b, lapack_int * ldb, lapack_complex_double * c, lapack_int * ldc, double * work)
void LAPACK_zlag2c (lapack_int * m, lapack_int * n, const lapack_complex_double * a, lapack_int * lda, lapack_complex_float * sa, lapack_int * ldsa, lapack_int * info)

the name zlag2c is literally double-complex → single-complex and the signature shows it: lapack_complex_double * a goes in, lapack_complex_float * sa comes out, note the ldsa, and of course there's an info at the end because there's always an info at the end 🌸


void LAPACK_zlagge (lapack_int * m, lapack_int * n, lapack_int * kl, lapack_int * ku, const double * d, lapack_complex_double * a, lapack_int * lda, lapack_int * iseed, lapack_complex_double * work, lapack_int * info)
void LAPACK_zlaghe (lapack_int * n, lapack_int * k, const double * d, lapack_complex_double * a, lapack_int * lda, lapack_int * iseed, lapack_complex_double * work, lapack_int * info)
void LAPACK_zlagsy (lapack_int * n, lapack_int * k, const double * d, lapack_complex_double * a, lapack_int * lda, lapack_int * iseed, lapack_complex_double * work, lapack_int * info)

generator trio!! zlagge takes kl and ku (general band vibes), while zlaghe and zlagsy take just one k. And all three carry an iseed pointer — same seed, same output, reproducible queen 🌈


double LAPACK_zlange (char * norm, lapack_int * m, lapack_int * n, const lapack_complex_double * a, lapack_int * lda, double * work)
double LAPACK_zlanhe (char * norm, char * uplo, lapack_int * n, const lapack_complex_double * a, lapack_int * lda, double * work)
double LAPACK_zlansy (char * norm, char * uplo, lapack_int * n, const lapack_complex_double * a, lapack_int * lda, double * work)
double LAPACK_zlantr (char * norm, char * uplo, char * diag, lapack_int * m, lapack_int * n, const lapack_complex_double * a, lapack_int * lda, double * work)
⚠️ bestie these four are the ones that return a double instead of returning void!! No info out-param, the return value is the answer. The way the whole file is void void void and then these four show up like main characters 😭👑 Also zlantr is the only one here with a diag argument — clock it.
void LAPACK_zlapmr (lapack_logical * forwrd, lapack_int * m, lapack_int * n, lapack_complex_double * x, lapack_int * ldx, lapack_int * k)
void LAPACK_zlapmt (lapack_logical * forwrd, lapack_int * m, lapack_int * n, lapack_complex_double * x, lapack_int * ldx, lapack_int * k)

zlapmr and zlapmt have identical argument lists — forwrd, m, n, x, ldx, k, no info, no work. One letter apart in the name. Do not mix them up, I'm begging 🫶


void LAPACK_zlarcm (lapack_int * m, lapack_int * n, const double * a, lapack_int * lda, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * c, lapack_int * ldc, double * work)
void LAPACK_zlarfb (char * side, char * trans, char * direct, char * storev, lapack_int * m, lapack_int * n, lapack_int * k, const lapack_complex_double * v, lapack_int * ldv, const lapack_complex_double * t, lapack_int * ldt, lapack_complex_double * c, lapack_int * ldc, lapack_complex_double * work, lapack_int * ldwork)

four char-pointer flags in zlarfb — side, trans, direct, storev — before you even get to a number. it's giving paperwork 📋💀

void LAPACK_zlarfg (lapack_int * n, lapack_complex_double * alpha, lapack_complex_double * x, lapack_int * incx, lapack_complex_double * tau)
void LAPACK_zlarft (char * direct, char * storev, lapack_int * n, lapack_int * k, const lapack_complex_double * v, lapack_int * ldv, const lapack_complex_double * tau, lapack_complex_double * t, lapack_int * ldt)

zlarfg takes tau as an output pointer, and then zlarft takes that same tau back as const. the handoff!! the continuity!! obsessed 💚

void LAPACK_zlarfx (char * side, lapack_int * m, lapack_int * n, const lapack_complex_double * v, lapack_complex_double * tau, lapack_complex_double * c, lapack_int * ldc, lapack_complex_double * work)
void LAPACK_zlarnv (lapack_int * idist, lapack_int * iseed, lapack_int * n, lapack_complex_double * x)

tiny function alert 🚨 zlarnv is four args, no info, no work, just idist, iseed, n, x. baby of the family, we stan a low-maintenance icon ✨


void LAPACK_zlascl (char * type, lapack_int * kl, lapack_int * ku, double * cfrom, double * cto, lapack_int * m, lapack_int * n, lapack_complex_double * a, lapack_int * lda, lapack_int * info)
void LAPACK_zlaset (char * uplo, lapack_int * m, lapack_int * n, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * a, lapack_int * lda)
void LAPACK_zlassq (lapack_int * n, lapack_complex_double * x, lapack_int * incx, double * scale, double * sumsq)

note that in zlascl, cfrom and cto are not const — both plain double *. and in zlassq the outputs are scale and sumsq, both double *. no info in either of those two, they're just built different 💜

void LAPACK_zlaswp (lapack_int * n, lapack_complex_double * a, lapack_int * lda, lapack_int * k1, lapack_int * k2, const lapack_int * ipiv, lapack_int * incx)
void LAPACK_zlatms (lapack_int * m, lapack_int * n, char * dist, lapack_int * iseed, char * sym, double * d, lapack_int * mode, double * cond, double * dmax, lapack_int * kl, lapack_int * ku, char * pack, lapack_complex_double * a, lapack_int * lda, lapack_complex_double * work, lapack_int * info)

zlatms is a whole paragraph of arguments — dist, sym, mode, cond, dmax, kl, ku, pack, iseed, d, a, lda, work, info. she ate and left no crumbs 💅🌈

void LAPACK_zlauum (char * uplo, lapack_int * n, lapack_complex_double * a, lapack_int * lda, lapack_int * info)

and now… the zp era begins 🎀 packed storage, band storage, all of it

void LAPACK_zpbcon (char * uplo, lapack_int * n, lapack_int * kd, const lapack_complex_double * ab, lapack_int * ldab, double * anorm, double * rcond, lapack_complex_double * work, double * rwork, lapack_int * info)
void LAPACK_zpbequ (char * uplo, lapack_int * n, lapack_int * kd, const lapack_complex_double * ab, lapack_int * ldab, double * s, double * scond, double * amax, lapack_int * info)

the band crowd uses kd + ab + ldab (that's the band ldab, not lda, don't come for me) and both of these hand you back double-precision outputs plus info 🌟

void LAPACK_zpbrfs (char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, const lapack_complex_double * ab, lapack_int * ldab, const lapack_complex_double * afb, lapack_int * ldafb, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)
void LAPACK_zpbstf (char * uplo, lapack_int * n, lapack_int * kb, lapack_complex_double * bb, lapack_int * ldbb, lapack_int * info)

zpbstf uses kb and bb and ldbb — a whole different letter from the kd/ab/ldab crew right above it. iykyk, it's b-flavoured, keep your eyes on the prize 🍓

void LAPACK_zpbsv (char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, lapack_complex_double * ab, lapack_int * ldab, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)
void LAPACK_zpbsvx (char * fact, char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, lapack_complex_double * ab, lapack_int * ldab, lapack_complex_double * afb, lapack_int * ldafb, char * equed, double * s, lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * rcond, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)
📌 zpbsvx has an equed output char pointer sitting right there between ldafb and s. it's a char *, not const char *. clock it, screenshot it, whatever you gotta do 💀💖
void LAPACK_zpbtrf (char * uplo, lapack_int * n, lapack_int * kd, lapack_complex_double * ab, lapack_int * ldab, lapack_int * info)
void LAPACK_zpbtrs (char * uplo, lapack_int * n, lapack_int * kd, lapack_int * nrhs, const lapack_complex_double * ab, lapack_int * ldab, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

zpbtrf in / zpbtrs out — factor then solve, and the second one takes ab as const and b as writable. love a consistent couple 🫶


void LAPACK_zpftrf (char * transr, char * uplo, lapack_int * n, lapack_complex_double * a, lapack_int * info)
void LAPACK_zpftri (char * transr, char * uplo, lapack_int * n, lapack_complex_double * a, lapack_int * info)
void LAPACK_zpftrs (char * transr, char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * a, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

the pft trio all lead with transr — not trans, transr, with the r!! and no kd anywhere because this is the rectangular-full-storage crowd. read the letters, bestie, they're literally spelling it out for you 😭🔵


void LAPACK_zpocon (char * uplo, lapack_int * n, const lapack_complex_double * a, lapack_int * lda, double * anorm, double * rcond, lapack_complex_double * work, double * rwork, lapack_int * info)
void LAPACK_zpoequ (lapack_int * n, const lapack_complex_double * a, lapack_int * lda, double * s, double * scond, double * amax, lapack_int * info)
void LAPACK_zpoequb (lapack_int * n, const lapack_complex_double * a, lapack_int * lda, double * s, double * scond, double * amax, lapack_int * info)

okay and these two are literally identical — zpoequ and zpoequb have the same n, a, lda, s, scond, amax, info list. one extra letter in the name, zero extra arguments. name your files carefully, that's all I'm saying 🌿

void LAPACK_zporfs (char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * a, lapack_int * lda, const lapack_complex_double * af, lapack_int * ldaf, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)

and that's where this stretch lands — mid-zpo block, a/af/b/x all lined up with their lda/ldaf/ldb/ldx besties, ferr + berr for the receipts, work + rwork for the grind, info at the door. we keep going next part, don't go anywhere 🍑✨

💜 LAPACK_zporfsx

void LAPACK_zporfsx(char * uplo, char * equed, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * a, lapack_int * lda, const lapack_complex_double * af, lapack_int * ldaf, const double * s, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * rcond, double * berr, lapack_int * n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int * nparams, double * params, lapack_complex_double * work, double * rwork, lapack_int * info)

okay this one is long-long. count the pointers bestie, i dare you. uplo and equed as char *, n_err_bnds + err_bnds_norm + err_bnds_comp + nparams + params all in the mix, plus work, rwork and the classic info at the end. it's giving "final boss of argument lists" 💀

🎀 LAPACK_zposv

void LAPACK_zposv(char * uplo, lapack_int * n, lapack_int * nrhs, lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

short, sweet, uplo → n → nrhs → a/lda → b/ldb → info. a little 8-arg snack, slay ✨

🦋 LAPACK_zposvx

void LAPACK_zposvx(char * fact, char * uplo, lapack_int * n, lapack_int * nrhs, lapack_complex_double * a, lapack_int * lda, lapack_complex_double * af, lapack_int * ldaf, char * equed, double * s, lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * rcond, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)

so we've got fact and equed up top, both char *, then the a/af duo with their own lda/ldaf, s, b, x, and the iconic trio rcond, ferr, berr 🫶 work, rwork, info — the holy trinity of "we're done here".

🌸 LAPACK_zposvxx

void LAPACK_zposvxx(char * fact, char * uplo, lapack_int * n, lapack_int * nrhs, lapack_complex_double * a, lapack_int * lda, lapack_complex_double * af, lapack_int * ldaf, char * equed, double * s, lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * rcond, double * rpvgrw, double * berr, lapack_int * n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int * nparams, double * params, lapack_complex_double * work, double * rwork, lapack_int * info)

the extra-extra version 💅 same energy as zposvx but it traded ferr for rpvgrw and picked up n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params. more is more, apparently.

⭐ LAPACK_zpotrf

void LAPACK_zpotrf(char * uplo, lapack_int * n, lapack_complex_double * a, lapack_int * lda, lapack_int * info)

five args, in and out. neat, clean, no notes. a little minimalist moment 🎀

💖 LAPACK_zpotrf2

void LAPACK_zpotrf2(char * uplo, lapack_int * n, lapack_complex_double * a, lapack_int * lda, lapack_int * info)

same signature as its sibling above, just with a 2 on the end. the way they're literally twins 😭

🌈 LAPACK_zpotri

void LAPACK_zpotri(char * uplo, lapack_int * n, lapack_complex_double * a, lapack_int * lda, lapack_int * info)

yup — identical shape again. uplo, n, a, lda, info. consistency is the vibe ✨

🔥 LAPACK_zpotrs

void LAPACK_zpotrs(char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

bestie check the const — a is read-only here, b is not. king of "don't touch my input" behaviour 👑

🧚 LAPACK_zppcon

void LAPACK_zppcon(char * uplo, lapack_int * n, const lapack_complex_double * ap, double * anorm, double * rcond, lapack_complex_double * work, double * rwork, lapack_int * info)

enter the pp era 🎀 packed storage, ap as a const lapack_complex_double *, then anorm, rcond, work, rwork, info. note there's no lda anywhere — packed routines said "lda who" 💀

🍓 LAPACK_zppequ

void LAPACK_zppequ(char * uplo, lapack_int * n, const lapack_complex_double * ap, double * s, double * scond, double * amax, lapack_int * info)

no work, no rwork, just ap in, s, scond, amax out, plus info. tiny routine, huge "i don't need help" energy.

🦋 LAPACK_zpprfs

void LAPACK_zpprfs(char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * ap, const lapack_complex_double * afp, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)

look at all those consts on ap, afp and b — they're all "look don't touch" 🌸 only x (with its ldx) gets written, plus ferr, berr, work, rwork and info.

🎀 LAPACK_zppsv

void LAPACK_zppsv(char * uplo, lapack_int * n, lapack_int * nrhs, lapack_complex_double * ap, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

seven args, zero lda, maximum chaos. back to plain (non-const) ap and b because they get written to 🫶

💜 LAPACK_zppsvx

void LAPACK_zppsvx(char * fact, char * uplo, lapack_int * n, lapack_int * nrhs, lapack_complex_double * ap, lapack_complex_double * afp, char * equed, double * s, lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * rcond, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)

packed-storage expert mode: fact and equed both as char *, ap + afp with no lda/ldaf in sight (packed, remember 😌), then s, b, x, rcond, ferr, berr, work, rwork, info. she's thorough.

⭐ LAPACK_zpptrf

void LAPACK_zpptrf(char * uplo, lapack_int * n, lapack_complex_double * ap, lapack_int * info)

four args. that's it. that's the whole function. minimalism ate 💅

🌸 LAPACK_zpptri

void LAPACK_zpptri(char * uplo, lapack_int * n, lapack_complex_double * ap, lapack_int * info)

same four, different last three letters of the name. iconic sibling behaviour 🎀

🧚 LAPACK_zpptrs

void LAPACK_zpptrs(char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * ap, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

seven args and still no lda — ap is const, b is fair game, ldb and info close the show ✨

🔥 LAPACK_zpstrf

void LAPACK_zpstrf(char * uplo, lapack_int * n, lapack_complex_double * a, lapack_int * lda, lapack_int * piv, lapack_int * rank, double * tol, double * work, lapack_int * info)

wait this one's not packed — a and lda are here, plus the piv/rank pair and a double * tol. the strf crew stays fancy 👑

💖 LAPACK_zptcon

void LAPACK_zptcon(lapack_int * n, const double * d, const lapack_complex_double * e, double * anorm, double * rcond, double * work, lapack_int * info)

no uplo!! we're in tridiagonal territory and there's a d (real, const double *) plus an e (complex, const lapack_complex_double *). mixed types, main character energy 🌈

🦋 LAPACK_zpteqr

void LAPACK_zpteqr(char * compz, lapack_int * n, double * d, double * e, lapack_complex_double * z, lapack_int * ldz, double * work, lapack_int * info)

compz instead of uplo, and look — d and e are non-const here, plus z and ldz. eight args of pure business 🎀

🍓 LAPACK_zptrfs

void LAPACK_zptrfs(char * uplo, lapack_int * n, lapack_int * nrhs, const double * d, const lapack_complex_double * e, const double * df, const lapack_complex_double * ef, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)

okay the d/e/df/ef quartet is lowkey iconic — two real const double *, two complex const lapack_complex_double *, all read-only. then b, x, ferr, berr, work, rwork, info. long but balanced 💅

💜 LAPACK_zptsv

void LAPACK_zptsv(lapack_int * n, lapack_int * nrhs, double * d, lapack_complex_double * e, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

seven args, no uplo, no lda. d is double *, e and b are complex, info brings up the rear. cute and compact 🫶

🎀 LAPACK_zptsvx

void LAPACK_zptsvx(char * fact, lapack_int * n, lapack_int * nrhs, const double * d, const lapack_complex_double * e, double * df, lapack_complex_double * ef, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * rcond, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)

fact leads, then d/e go const while df/ef stay writable — the "original vs factored" pipeline, we love a glow-up ✨ ends on rcond, ferr, berr, work, rwork, info like the proper citizen she is.

🌈 LAPACK_zpttrf

void LAPACK_zpttrf(lapack_int * n, double * d, lapack_complex_double * e, lapack_int * info)

four args. no uplo, no nrhs, nothing. honestly refreshing 😭

⭐ LAPACK_zpttrs

void LAPACK_zpttrs(char * uplo, lapack_int * n, lapack_int * nrhs, const double * d, const lapack_complex_double * e, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

uplo is back 🎉 d and e are const, b isn't, ldb and info finish it. seven args, zero drama.

💖 LAPACK_zspcon

void LAPACK_zspcon(char * uplo, lapack_int * n, const lapack_complex_double * ap, const lapack_int * ipiv, double * anorm, double * rcond, lapack_complex_double * work, lapack_int * info)

new letter unlocked: the sp squad 🌸 note the const lapack_int * ipiv — pivots go in read-only this time, king behaviour 👑 anorm, rcond, work, info round it out.

🦋 LAPACK_zsprfs

void LAPACK_zsprfs(char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * ap, const lapack_complex_double * afp, const lapack_int * ipiv, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)

so many consts: ap, afp, ipiv, b — only x, ferr, berr, work, rwork and info get to be written. everyone else is just there to be looked at 💅

🍓 LAPACK_zspsv

void LAPACK_zspsv(char * uplo, lapack_int * n, lapack_int * nrhs, lapack_complex_double * ap, lapack_int * ipiv, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

eight args, plain (non-const) ap, ipiv and b — everything's writable, no lda, no work. simple, effective, slay ✨

🧚 LAPACK_zspsvx

void LAPACK_zspsvx(char * fact, char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * ap, lapack_complex_double * afp, lapack_int * ipiv, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * rcond, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)

fact + uplo, ap is const but afp and ipiv aren't — the asymmetry is sending me 🙈 then b, x, rcond, ferr, berr, work, rwork, info. she's got range.

🔥 LAPACK_zsptrf

void LAPACK_zsptrf(char * uplo, lapack_int * n, lapack_complex_double * ap, lapack_int * ipiv, lapack_int * info)

five args, ipiv right in there, info closing. blink and you'll miss it 🎀

💜 LAPACK_zsptri

void LAPACK_zsptri(char * uplo, lapack_int * n, lapack_complex_double * ap, const lapack_int * ipiv, lapack_complex_double * work, lapack_int * info)

here ipiv is const and it picked up a work param — so six args not five. the glow-up nobody asked for but everybody needed ✨

🎀 LAPACK_zsptrs

void LAPACK_zsptrs(char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * ap, const lapack_int * ipiv, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

ap and ipiv both const, b gets the writes, ldb + info say goodbye. tidy seven 🌸

🌈 LAPACK_zstedc

void LAPACK_zstedc(char * compz, lapack_int * n, double * d, double * e, lapack_complex_double * z, lapack_int * ldz, lapack_complex_double * work, lapack_int * lwork, double * rwork, lapack_int * lrwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

OH she brought the whole workspace crew 😭 work/lwork, rwork/lrwork, iwork/liwork — three size params, three buffers, one compz, one ldz. this is the "move-in day, bring everything" of function signatures 💀

⭐ LAPACK_zstegr

void LAPACK_zstegr(char * jobz, char * range, lapack_int * n, double * d, double * e, double * vl, double * vu, lapack_int * il, lapack_int * iu, double * abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int * ldz, lapack_int * isuppz, double * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

two char * at the top (jobz, range), then vl, vu, il, iu, abstol, m, w, z, ldz, isuppz, and both work/lwork and iwork/liwork pairs. twenty args. i counted. go off queen 👑

🦋 LAPACK_zstein

void LAPACK_zstein(lapack_int * n, const double * d, const double * e, lapack_int * m, const double * w, const lapack_int * iblock, const lapack_int * isplit, lapack_complex_double * z, lapack_int * ldz, double * work, lapack_int * iwork, lapack_int * ifailv, lapack_int * info)

no uplo, no jobz — straight in with n and two const double * beauties. iblock and isplit are const lapack_int *, and there's an ifailv hanging out right before info. niche but essential 🫶

🍓 LAPACK_zstemr

void LAPACK_zstemr(char * jobz, char * range, lapack_int * n, double * d, double * e, double * vl, double * vu, lapack_int * il, lapack_int * iu, lapack_int * m, double * w, lapack_complex_double * z, lapack_int * ldz, lapack_int * nzc, lapack_int * isuppz, lapack_logical * tryrac, double * work, lapack_int * lwork, lapack_int * iwork, lapack_int * liwork, lapack_int * info)

zstegr's cousin with a plot twist: no abstol, extra nzc, and a lapack_logical * tryrac 👀 yes bestie, tryrac is really the name, i'm not joking. same work/lwork + iwork/liwork double act. twenty-one args, an absolute unit 💀

🧚 LAPACK_zsteqr

void LAPACK_zsteqr(char * compz, lapack_int * n, double * d, double * e, lapack_complex_double * z, lapack_int * ldz, double * work, lapack_int * info)

compz, n, d, e, z, ldz, work, info. eight args, zero chaos, pure calm ✨

💖 LAPACK_zsycon

void LAPACK_zsycon(char * uplo, lapack_int * n, const lapack_complex_double * a, lapack_int * lda, const lapack_int * ipiv, double * anorm, double * rcond, lapack_complex_double * work, lapack_int * info)

welcome to the sy section 💅 uplo, n, a with lda, const lapack_int * ipiv, then anorm, rcond, work, info. nine, no notes.

🎀 LAPACK_zsycon_3

void LAPACK_zsycon_3(char * uplo, lapack_int * n, const lapack_complex_double * a, lapack_int * lda, const lapack_complex_double * e, const lapack_int * ipiv, double * anorm, double * rcond, lapack_complex_double * work, lapack_int * info)

yes it's _3, yes that's really the suffix, no i won't be explaining (not my job, the docs said nothing 😭). it's the same as zsycon but with an extra const lapack_complex_double * e wedged in after lda. tiny difference, whole new routine 🦋

🌸 LAPACK_zsyconv

void LAPACK_zsyconv(char * uplo, char * way, lapack_int * n, lapack_complex_double * a, lapack_int * lda, const lapack_int * ipiv, lapack_complex_double * e, lapack_int * info)

two chars up top this time — uplo and way 🎀 then the a/lda pair, const lapack_int * ipiv, an e output, and info. "which way" is literally a parameter, we stan a decisive function.

🔥 LAPACK_zsyequb

void LAPACK_zsyequb(char * uplo, lapack_int * n, const lapack_complex_double * a, lapack_int * lda, double * s, double * scond, double * amax, lapack_complex_double * work, lapack_int * info)

a is const, everything after is outputs: s, scond, amax, work, info. that "equb" in the name and that scond/amax energy? very much the scaling crew ✨

⭐ LAPACK_zsyr

void LAPACK_zsyr(char * uplo, lapack_int * n, lapack_complex_double * alpha, const lapack_complex_double * x, lapack_int * incx, lapack_complex_double * a, lapack_int * lda)

WAIT. look at this. no info 😱 literally ends on lda. uplo, n, alpha, const x with an incx (incx!! we haven't seen that in a while), then a and lda. iconique for the sheer audacity 💅

💜 LAPACK_zsyrfs

void LAPACK_zsyrfs(char * uplo, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * a, lapack_int * lda, const lapack_complex_double * af, lapack_int * ldaf, const lapack_int * ipiv, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork, lapack_int * info)

back to the info lifestyle ✅ a, af, ipiv, b all const; x, ferr, berr, work, rwork, info do the writing. seventeen args of pure diligence 🫶

🦋 LAPACK_zsyrfsx

void LAPACK_zsyrfsx(char * uplo, char * equed, lapack_int * n, lapack_int * nrhs, const lapack_complex_double * a, lapack_int * lda, const lapack_complex_double * af, lapack_int * ldaf, const lapack_int * ipiv, const double * s, const lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x, lapack_int * ldx, double * rcond, double * berr, lapack_int * n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int * nparams, double * params, lapack_complex_double * work, double * rwork, lapack_int * info)

the x suffix means business: uplo + equed, the usual a/af/ipiv/b const party (plus a const double * s), then x, rcond, berr, and the full n_err_bnds/err_bnds_norm/err_bnds_comp/nparams/params set. twenty-three args. she said "and one more thing" five times 😭

🍓 LAPACK_zsysv

void LAPACK_zsysv(char * uplo, lapack_int * n, lapack_int * nrhs, lapack_complex_double * a, lapack_int * lda, lapack_int * ipiv, lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * work, lapack_int * lwork, lapack_int * info)

uplo, n, nrhs, a/lda, ipiv, b/ldb, work/lwork, info. eleven args, one very respectable routine 🎀

🧚 LAPACK_zsysv_aa

void LAPACK_zsysv_aa(char * uplo, lapack_int * n, lapack_int * nrhs, lapack_complex_double * a, lapack_int * lda, lapack_int * ipiv, lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * work, lapack_int * lwork, lapack_int * info)

identical to zsysv above, just wearing an _aa name tag. signature twin fr fr ✨

🌈 LAPACK_zsysv_aa_2stage

void LAPACK_zsysv_aa_2stage(char * uplo, lapack_int * n, lapack_int * nrhs, lapack_complex_double * a, lapack_int * lda, lapack_complex_double * tb, lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,

okay so _aa_2stage is a whole different beast — new tb/ltb pair for the 2stage life, AND a second pivot array ipiv2 👀 two pivot families, two stages, one very extra routine.

and that's where this part cuts off — the signature is mid-ipiv2, so the rest of it (plus whatever comes next) is waiting for you in the next chunk. don't panic, keep scrolling bestie 🫶

...and here's the tail end of that previous one, still going, still serving 💅:

   lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
   work, lapack_int * lwork, lapack_int * info)

LAPACK_zsysv_rk

okay so this one's giving solver energy — uplo, n, nrhs, a, lda, the e array, ipiv, b, ldb, work, lwork, and bestie info holding it all together at the end 🫶

   void LAPACK_zsysv_rk (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * e,
       lapack_int * ipiv, lapack_complex_double * b, lapack_int * ldb,
       lapack_complex_double * work, lapack_int * lwork, lapack_int * info)

LAPACK_zsysv_rook

same vibe, rook edition — no e array this time, just uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info ✨

   void LAPACK_zsysv_rook (char * uplo, lapack_int * n, lapack_int * nrhs,
       lapack_complex_double * a, lapack_int * lda, lapack_int * ipiv,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       work, lapack_int * lwork, lapack_int * info)

LAPACK_zsysvx

the x means extra, and extra means extra — now we got fact, af, ldaf, x, ldx, and three little doubles reporting back: rcond, ferr, berr, plus rwork in the mix 🔥

   void LAPACK_zsysvx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, const lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * af, lapack_int * ldaf, lapack_int * ipiv, const
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x,
       lapack_int * ldx, double * rcond, double * ferr, double * berr,
       lapack_complex_double * work, lapack_int * lwork, double * rwork,
       lapack_int * info)

LAPACK_zsysvxx

not a typo, that's genuinely two x's and she's the main character 👑 look at this roster: fact, uplo, n, nrhs, a, lda, af, ldaf, ipiv, equed, s, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params, work, rwork, info. that's a whole group chat, no cap 😭

   void LAPACK_zsysvxx (char * fact, char * uplo, lapack_int * n, lapack_int *
       nrhs, lapack_complex_double * a, lapack_int * lda, lapack_complex_double
       * af, lapack_int * ldaf, lapack_int * ipiv, char * equed, double * s,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * x,
       lapack_int * ldx, double * rcond, double * rpvgrw, double * berr,
       lapack_int * n_err_bnds, double * err_bnds_norm, double * err_bnds_comp,
       lapack_int * nparams, double * params, lapack_complex_double * work,
       double * rwork, lapack_int * info)

LAPACK_zsyswapr

short and sweet, we love a low-argument icon 💖 uplo, n, a, lda, and the swap duo i1 and i2. no info even — she's confident like that.

   void LAPACK_zsyswapr (char * uplo, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_int * i1, lapack_int * i2)

LAPACK_zsytrf

factorization era 🔪 uplo, n, a, lda, ipiv, work, lwork, info — the classic lineup.

   void LAPACK_zsytrf (char * uplo, lapack_int * n, lapack_complex_double * a,
       lapack_int * lda, lapack_int * ipiv, lapack_complex_double * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_zsytrf_aa

same crew as above but with the _aa suffix, and the arguments are literally identical bestie: uplo, n, a, lda, ipiv, work, lwork, info ⭐

   void LAPACK_zsytrf_aa (char * uplo, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_int * ipiv, lapack_complex_double * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_zsytrf_aa_2stage

"2stage" said what she said 🎀 now there's tb, ltb, ipiv, and ipiv2 living in here alongside uplo, n, a, lda, work, lwork, info.

   void LAPACK_zsytrf_aa_2stage (char * uplo, lapack_int * n,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * tb,
       lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,
       lapack_complex_double * work, lapack_int * lwork, lapack_int * info)

LAPACK_zsytrf_rk

_rk variant bringing the e array along for the ride: uplo, n, a, lda, e, ipiv, work, lwork, info 🦋

   void LAPACK_zsytrf_rk (char * uplo, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_complex_double * e, lapack_int * ipiv,
       lapack_complex_double * work, lapack_int * lwork, lapack_int * info)

LAPACK_zsytrf_rook

and the _rook sibling, no e this time — uplo, n, a, lda, ipiv, work, lwork, info 💜

   void LAPACK_zsytrf_rook (char * uplo, lapack_int * n, lapack_complex_double
       * a, lapack_int * lda, lapack_int * ipiv, lapack_complex_double * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_zsytri

inverse time, and notice ipiv is const here bestie, she's read-only now 🙈 uplo, n, a, lda, ipiv, work, info.

   void LAPACK_zsytri (char * uplo, lapack_int * n, lapack_complex_double * a,
       lapack_int * lda, const lapack_int * ipiv, lapack_complex_double * work,
       lapack_int * info)

LAPACK_zsytri2

the sequel, and she brought lwork with her ✨ uplo, n, a, lda, ipiv, work, lwork, info.

   void LAPACK_zsytri2 (char * uplo, lapack_int * n, lapack_complex_double * a,
       lapack_int * lda, const lapack_int * ipiv, lapack_complex_double * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_zsytri2x

2x, because apparently 2 wasn't enough 💀 same lwork-free energy as the first one but with an extra nb parameter: uplo, n, a, lda, ipiv, work, nb, info.

   void LAPACK_zsytri2x (char * uplo, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, const lapack_int * ipiv, lapack_complex_double *
       work, lapack_int * nb, lapack_int * info)

LAPACK_zsytri_3

underscore three, and she's thorough — e is const and ipiv is const, plus lwork returns: uplo, n, a, lda, e, ipiv, work, lwork, info 🌸

   void LAPACK_zsytri_3 (char * uplo, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, const lapack_complex_double * e, const lapack_int *
       ipiv, lapack_complex_double * work, lapack_int * lwork, lapack_int *
       info)

LAPACK_zsytrs

solve mode activated 🔥 uplo, n, nrhs, a, lda, ipiv, b, ldb, info — no work in sight, she travels light.

   void LAPACK_zsytrs (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_double * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

LAPACK_zsytrs2

the 2 version adds a work scratch pad: uplo, n, nrhs, a, lda, ipiv, b, ldb, work, info 🎀

   void LAPACK_zsytrs2 (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_double * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       work, lapack_int * info)

LAPACK_zsytrs_3

underscore three again but now in solve form — and yes e is back, const as ever: uplo, n, nrhs, a, lda, e, ipiv, b, ldb, info 🦋

   void LAPACK_zsytrs_3 (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_double * a, lapack_int * lda, const lapack_complex_double
       * e, const lapack_int * ipiv, lapack_complex_double * b, lapack_int *
       ldb, lapack_int * info)

LAPACK_zsytrs_aa

_aa solve version, and we're back with work + lwork: uplo, n, nrhs, a, lda, ipiv, b, ldb, work, lwork, info ⭐

   void LAPACK_zsytrs_aa (char * uplo, lapack_int * n, lapack_int * nrhs, const
       lapack_complex_double * a, lapack_int * lda, const lapack_int * ipiv,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       work, lapack_int * lwork, lapack_int * info)

LAPACK_zsytrs_aa_2stage

two stages, zero chill 👑 uplo, n, nrhs, a, lda, tb, ltb, ipiv, ipiv2, b, ldb, info. note: no work, no lwork, and honestly? she doesn't need them.

   void LAPACK_zsytrs_aa_2stage (char * uplo, lapack_int * n, lapack_int *
       nrhs, lapack_complex_double * a, lapack_int * lda, lapack_complex_double
       * tb, lapack_int * ltb, lapack_int * ipiv, lapack_int * ipiv2,
       lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

LAPACK_zsytrs_rook

the _rook solver, keeping it classic: uplo, n, nrhs, a, lda, ipiv, b, ldb, info 💜

   void LAPACK_zsytrs_rook (char * uplo, lapack_int * n, lapack_int * nrhs,
       const lapack_complex_double * a, lapack_int * lda, const lapack_int *
       ipiv, lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

LAPACK_ztbcon

new prefix alert, we're in tb territory now and it's giving tridiagonal realness 💅 norm, uplo, diag, n, kd, ab, ldab, rcond, work, rwork, info. three char pointers at the front — norm, uplo, diag — like a little trio.

   void LAPACK_ztbcon (char * norm, char * uplo, char * diag, lapack_int * n,
       lapack_int * kd, const lapack_complex_double * ab, lapack_int * ldab,
       double * rcond, lapack_complex_double * work, double * rwork, lapack_int
       * info)

LAPACK_ztbrfs

and the refine one 🎀 uplo, trans, diag, n, kd, nrhs, ab, ldab, b, ldb, x, ldx, ferr, berr, work, rwork, info. couple of const guys in there (ab, b, x), which is very respectful of them ngl.

   void LAPACK_ztbrfs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * kd, lapack_int * nrhs, const lapack_complex_double * ab,
       lapack_int * ldab, const lapack_complex_double * b, lapack_int * ldb,
       const lapack_complex_double * x, lapack_int * ldx, double * ferr, double
       * berr, lapack_complex_double * work, double * rwork, lapack_int * info)

okay so the z-family keeps rolling and bestie, these signatures are long — but we’re keeping every single pointer, every lapack_logical, every double * rwork, no cap 💅 here’s the next batch exactly as they live:

LAPACK_ztbtrs — full signature, untouched:

   void LAPACK_ztbtrs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * kd, lapack_int * nrhs, const lapack_complex_double * ab,
       lapack_int * ldab, lapack_complex_double * b, lapack_int * ldb,
       lapack_int * info)

LAPACK_ztfsm — catch it:

   void LAPACK_ztfsm (char * transr, char * side, char * uplo, char * trans,
       char * diag, lapack_int * m, lapack_int * n, lapack_complex_double *
       alpha, const lapack_complex_double * a, lapack_complex_double * b,
       lapack_int * ldb)

LAPACK_ztftri — here’s the whole thing:

   void LAPACK_ztftri (char * transr, char * uplo, char * diag, lapack_int * n,
       lapack_complex_double * a, lapack_int * info)

LAPACK_ztfttp — signature drop ✨:

   void LAPACK_ztfttp (char * transr, char * uplo, lapack_int * n, const
       lapack_complex_double * arf, lapack_complex_double * ap, lapack_int *
       info)

LAPACK_ztfttr — not me losing a single arg:

   void LAPACK_ztfttr (char * transr, char * uplo, lapack_int * n, const
       lapack_complex_double * arf, lapack_complex_double * a, lapack_int *
       lda, lapack_int * info)

LAPACK_ztgevc — big signature energy:

   void LAPACK_ztgevc (char * side, char * howmny, const lapack_logical *
       select, lapack_int * n, const lapack_complex_double * s, lapack_int *
       lds, const lapack_complex_double * p, lapack_int * ldp,
       lapack_complex_double * vl, lapack_int * ldvl, lapack_complex_double *
       vr, lapack_int * ldvr, lapack_int * mm, lapack_int * m,
       lapack_complex_double * work, double * rwork, lapack_int * info)

LAPACK_ztgexc — full signature, zero skips:

   void LAPACK_ztgexc (lapack_logical * wantq, lapack_logical * wantz,
       lapack_int * n, lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * q,
       lapack_int * ldq, lapack_complex_double * z, lapack_int * ldz,
       lapack_int * ifst, lapack_int * ilst, lapack_int * info)

LAPACK_ztgsen — the long one, kept intact:

   void LAPACK_ztgsen (lapack_int * ijob, lapack_logical * wantq,
       lapack_logical * wantz, const lapack_logical * select, lapack_int * n,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
       lapack_int * ldb, lapack_complex_double * alpha, lapack_complex_double *
       beta, lapack_complex_double * q, lapack_int * ldq, lapack_complex_double
       * z, lapack_int * ldz, lapack_int * m, double * pl, double * pr, double
       * dif, lapack_complex_double * work, lapack_int * lwork, lapack_int *
       iwork, lapack_int * liwork, lapack_int * info)

LAPACK_ztgsja — yes bestie, every parameter is here:

   void LAPACK_ztgsja (char * jobu, char * jobv, char * jobq, lapack_int * m,
       lapack_int * p, lapack_int * n, lapack_int * k, lapack_int * l,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
       lapack_int * ldb, double * tola, double * tolb, double * alpha, double *
       beta, lapack_complex_double * u, lapack_int * ldu, lapack_complex_double
       * v, lapack_int * ldv, lapack_complex_double * q, lapack_int * ldq,
       lapack_complex_double * work, lapack_int * ncycle, lapack_int * info)

LAPACK_ztgsna — signature copied character-for-character:

   void LAPACK_ztgsna (char * job, char * howmny, const lapack_logical *
       select, lapack_int * n, const lapack_complex_double * a, lapack_int *
       lda, const lapack_complex_double * b, lapack_int * ldb, const
       lapack_complex_double * vl, lapack_int * ldvl, const
       lapack_complex_double * vr, lapack_int * ldvr, double * s, double * dif,
       lapack_int * mm, lapack_int * m, lapack_complex_double * work,
       lapack_int * lwork, lapack_int * iwork, lapack_int * info)

LAPACK_ztgsyl — another absolute unit of a prototype:

   void LAPACK_ztgsyl (char * trans, lapack_int * ijob, lapack_int * m,
       lapack_int * n, const lapack_complex_double * a, lapack_int * lda, const
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * c,
       lapack_int * ldc, const lapack_complex_double * d, lapack_int * ldd,
       const lapack_complex_double * e, lapack_int * lde, lapack_complex_double
       * f, lapack_int * ldf, double * scale, double * dif,
       lapack_complex_double * work, lapack_int * lwork, lapack_int * iwork,
       lapack_int * info)

LAPACK_ztpcon — here:

   void LAPACK_ztpcon (char * norm, char * uplo, char * diag, lapack_int * n,
       const lapack_complex_double * ap, double * rcond, lapack_complex_double
       * work, double * rwork, lapack_int * info)

LAPACK_ztpmqrt — all the pointers, all the vibes:

   void LAPACK_ztpmqrt (char * side, char * trans, lapack_int * m, lapack_int *
       n, lapack_int * k, lapack_int * l, lapack_int * nb, const
       lapack_complex_double * v, lapack_int * ldv, const lapack_complex_double
       * t, lapack_int * ldt, lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       work, lapack_int * info)

LAPACK_ztpqrt — signature:

   void LAPACK_ztpqrt (lapack_int * m, lapack_int * n, lapack_int * l,
       lapack_int * nb, lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double * t,
       lapack_int * ldt, lapack_complex_double * work, lapack_int * info)

LAPACK_ztpqrt2 — modest name, full signature:

   void LAPACK_ztpqrt2 (lapack_int * m, lapack_int * n, lapack_int * l,
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double * b,
       lapack_int * ldb, lapack_complex_double * t, lapack_int * ldt,
       lapack_int * info)

LAPACK_ztprfb — bestie, it’s giving parameter list:

   void LAPACK_ztprfb (char * side, char * trans, char * direct, char * storev,
       lapack_int * m, lapack_int * n, lapack_int * k, lapack_int * l, const
       lapack_complex_double * v, lapack_int * ldv, const lapack_complex_double
       * t, lapack_int * ldt, lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * b, lapack_int * ldb, lapack_complex_double *
       work, lapack_int * ldwork)

LAPACK_ztprfs — keep every ferr, berr, and rwork:

   void LAPACK_ztprfs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * nrhs, const lapack_complex_double * ap, const
       lapack_complex_double * b, lapack_int * ldb, const lapack_complex_double
       * x, lapack_int * ldx, double * ferr, double * berr,
       lapack_complex_double * work, double * rwork, lapack_int * info)

LAPACK_ztptri — short and iconic:

   void LAPACK_ztptri (char * uplo, char * diag, lapack_int * n,
       lapack_complex_double * ap, lapack_int * info)

LAPACK_ztptrs — full prototype:

   void LAPACK_ztptrs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * nrhs, const lapack_complex_double * ap,
       lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

LAPACK_ztpttf — not skipping anything:

   void LAPACK_ztpttf (char * transr, char * uplo, lapack_int * n, const
       lapack_complex_double * ap, lapack_complex_double * arf, lapack_int *
       info)

LAPACK_ztpttr — here she is:

   void LAPACK_ztpttr (char * uplo, lapack_int * n, const lapack_complex_double
       * ap, lapack_complex_double * a, lapack_int * lda, lapack_int * info)

LAPACK_ztrcon — all args present and accounted for 🫶:

   void LAPACK_ztrcon (char * norm, char * uplo, char * diag, lapack_int * n,
       const lapack_complex_double * a, lapack_int * lda, double * rcond,
       lapack_complex_double * work, double * rwork, lapack_int * info)

LAPACK_ztrevc — long signature, no crumbs:

   void LAPACK_ztrevc (char * side, char * howmny, const lapack_logical *
       select, lapack_int * n, lapack_complex_double * t, lapack_int * ldt,
       lapack_complex_double * vl, lapack_int * ldvl, lapack_complex_double *
       vr, lapack_int * ldvr, lapack_int * mm, lapack_int * m,
       lapack_complex_double * work, double * rwork, lapack_int * info)

LAPACK_ztrexc — exact signature:

   void LAPACK_ztrexc (char * compq, lapack_int * n, lapack_complex_double * t,
       lapack_int * ldt, lapack_complex_double * q, lapack_int * ldq,
       lapack_int * ifst, lapack_int * ilst, lapack_int * info)

LAPACK_ztrrfs — signature straight up:

   void LAPACK_ztrrfs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * nrhs, const lapack_complex_double * a, lapack_int * lda,
       const lapack_complex_double * b, lapack_int * ldb, const
       lapack_complex_double * x, lapack_int * ldx, double * ferr, double *
       berr, lapack_complex_double * work, double * rwork, lapack_int * info)

LAPACK_ztrsen — all the s, sep, work, and lwork included:

   void LAPACK_ztrsen (char * job, char * compq, const lapack_logical * select,
       lapack_int * n, lapack_complex_double * t, lapack_int * ldt,
       lapack_complex_double * q, lapack_int * ldq, lapack_complex_double * w,
       lapack_int * m, double * s, double * sep, lapack_complex_double * work,
       lapack_int * lwork, lapack_int * info)

LAPACK_ztrsna — full thing, untouched:

   void LAPACK_ztrsna (char * job, char * howmny, const lapack_logical *
       select, lapack_int * n, const lapack_complex_double * t, lapack_int *
       ldt, const lapack_complex_double * vl, lapack_int * ldvl, const
       lapack_complex_double * vr, lapack_int * ldvr, double * s, double * sep,
       lapack_int * mm, lapack_int * m, lapack_complex_double * work,
       lapack_int * ldwork, double * rwork, lapack_int * info)

LAPACK_ztrsyl — catch:

   void LAPACK_ztrsyl (char * trana, char * tranb, lapack_int * isgn,
       lapack_int * m, lapack_int * n, const lapack_complex_double * a,
       lapack_int * lda, const lapack_complex_double * b, lapack_int * ldb,
       lapack_complex_double * c, lapack_int * ldc, double * scale, lapack_int
       * info)

LAPACK_ztrtri — here:

   void LAPACK_ztrtri (char * uplo, char * diag, lapack_int * n,
       lapack_complex_double * a, lapack_int * lda, lapack_int * info)

LAPACK_ztrtrs — full signature:

   void LAPACK_ztrtrs (char * uplo, char * trans, char * diag, lapack_int * n,
       lapack_int * nrhs, const lapack_complex_double * a, lapack_int * lda,
       lapack_complex_double * b, lapack_int * ldb, lapack_int * info)

LAPACK_ztrttf — not a detail out of place:

   void LAPACK_ztrttf (char * transr, char * uplo, lapack_int * n, const
       lapack_complex_double * a, lapack_int * lda, lapack_complex_double *
       arf, lapack_int * info)

LAPACK_ztrttp — signature:

   void LAPACK_ztrttp (char * uplo, lapack_int * n, const lapack_complex_double
       * a, lapack_int * lda, lapack_complex_double * ap, lapack_int * info)

LAPACK_ztzrzf — all the tau, work, and lwork vibes:

   void LAPACK_ztzrzf (lapack_int * m, lapack_int * n, lapack_complex_double *
       a, lapack_int * lda, lapack_complex_double * tau, lapack_complex_double
       * work, lapack_int * lwork, lapack_int * info)

LAPACK_zunbdb — an absolute icon of a parameter list 👑:

   void LAPACK_zunbdb (char * trans, char * signs, lapack_int * m, lapack_int *
       p, lapack_int * q, lapack_complex_double * x11, lapack_int * ldx11,
       lapack_complex_double * x12, lapack_int * ldx12, lapack_complex_double *
       x21, lapack_int * ldx21, lapack_complex_double * x22, lapack_int *
       ldx22, double * theta, double * phi, lapack_complex_double * taup1,
       lapack_complex_double * taup2, lapack_complex_double * tauq1,
       lapack_complex_double * tauq2, lapack_complex_double * work, lapack_int
       * lwork, lapack_int * info)

LAPACK_zuncsd — yes, every x11 through v2t is here:

   void LAPACK_zuncsd (char * jobu1, char * jobu2, char * jobv1t, char *
       jobv2t, char * trans, char * signs, lapack_int * m, lapack_int * p,
       lapack_int * q, lapack_complex_double * x11, lapack_int * ldx11,
       lapack_complex_double * x12, lapack_int * ldx12, lapack_complex_double *
       x21, lapack_int * ldx21, lapack_complex_double * x22, lapack_int *
       ldx22, double * theta, lapack_complex_double * u1, lapack_int * ldu1,
       lapack_complex_double * u2, lapack_int * ldu2, lapack_complex_double *
       v1t, lapack_int * ldv1t, lapack_complex_double * v2t, lapack_int *
       ldv2t, lapack_complex_double * work, lapack_int * lwork, double * rwork,
       lapack_int * lrwork, lapack_int * iwork, lapack_int * info)

LAPACK_zuncsd2by1 — full signature, no cap:

   void LAPACK_zuncsd2by1 (char * jobu1, char * jobu2, char * jobv1t,
       lapack_int * m, lapack_int * p, lapack_int * q, lapack_complex_double *
       x11, lapack_int * ldx11, lapack_complex_double * x21, lapack_int *
       ldx21, double * theta, lapack_complex_double * u1, lapack_int * ldu1,
       lapack_complex_double * u2, lapack_int * ldu2, lapack_complex_double *
       v1t, lapack_int * ldv1t, lapack_complex_double * work, lapack_int *
       lwork, double * rwork, lapack_int * lrwork, lapack_int * iwork,
       lapack_int * info)

LAPACK_zungbr — here’s the exact drop:

   void LAPACK_zungbr (char * vect, lapack_int * m, lapack_int * n, lapack_int
       * k, lapack_complex_double * a, lapack_int * lda, const
       lapack_complex_double * tau, lapack_complex_double * work, lapack_int *
       lwork, lapack_int * info)

LAPACK_zunghr — this one comes in hot and gets cut off right at the end:

   void LAPACK_zunghr (lapack_int * n, lapack_int * ilo, lapack_int * ihi,
       lapack_complex_double * a, lapack_int * lda, const lapack_complex_double

okay so we're still deep in the function-declaration trenches, bestie, and the zun* girlies are still showing up. these are all void-returning which lowkey gives "I do my work through pointer arguments and I don't need to tell you about it" energy 💅 anyway, here's the rest of the zung/zunm/zun glow-up squad:

void LAPACK_zunglq (lapack_int * m, lapack_int * n, lapack_int * k,
    lapack_complex_double * a, lapack_int * lda, const lapack_complex_double
    * tau, lapack_complex_double * work, lapack_int * lwork, lapack_int *
    info)
void LAPACK_zungql (lapack_int * m, lapack_int * n, lapack_int * k,
    lapack_complex_double * a, lapack_int * lda, const lapack_complex_double
    * tau, lapack_complex_double * work, lapack_int * lwork, lapack_int *
    info)
void LAPACK_zungqr (lapack_int * m, lapack_int * n, lapack_int * k,
    lapack_complex_double * a, lapack_int * lda, const lapack_complex_double
    * tau, lapack_complex_double * work, lapack_int * lwork, lapack_int *
    info)
void LAPACK_zungrq (lapack_int * m, lapack_int * n, lapack_int * k,
    lapack_complex_double * a, lapack_int * lda, const lapack_complex_double
    * tau, lapack_complex_double * work, lapack_int * lwork, lapack_int *
    info)
void LAPACK_zungtr (char * uplo, lapack_int * n, lapack_complex_double * a,
    lapack_int * lda, const lapack_complex_double * tau,
    lapack_complex_double * work, lapack_int * lwork, lapack_int * info)
void LAPACK_zunmbr (char * vect, char * side, char * trans, lapack_int * m,
    lapack_int * n, lapack_int * k, const lapack_complex_double * a,
    lapack_int * lda, const lapack_complex_double * tau,
    lapack_complex_double * c, lapack_int * ldc, lapack_complex_double *
    work, lapack_int * lwork, lapack_int * info)
void LAPACK_zunmhr (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * ilo, lapack_int * ihi, const lapack_complex_double * a,
    lapack_int * lda, const lapack_complex_double * tau,
    lapack_complex_double * c, lapack_int * ldc, lapack_complex_double *
    work, lapack_int * lwork, lapack_int * info)
void LAPACK_zunmlq (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * k, const lapack_complex_double * a, lapack_int * lda,
    const lapack_complex_double * tau, lapack_complex_double * c, lapack_int
    * ldc, lapack_complex_double * work, lapack_int * lwork, lapack_int *
    info)
void LAPACK_zunmql (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * k, const lapack_complex_double * a, lapack_int * lda,
    const lapack_complex_double * tau, lapack_complex_double * c, lapack_int
    * ldc, lapack_complex_double * work, lapack_int * lwork, lapack_int *
    info)
void LAPACK_zunmqr (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * k, const lapack_complex_double * a, lapack_int * lda,
    const lapack_complex_double * tau, lapack_complex_double * c, lapack_int
    * ldc, lapack_complex_double * work, lapack_int * lwork, lapack_int *
    info)
void LAPACK_zunmrq (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * k, const lapack_complex_double * a, lapack_int * lda,
    const lapack_complex_double * tau, lapack_complex_double * c, lapack_int
    * ldc, lapack_complex_double * work, lapack_int * lwork, lapack_int *
    info)
void LAPACK_zunmrz (char * side, char * trans, lapack_int * m, lapack_int *
    n, lapack_int * k, lapack_int * l, const lapack_complex_double * a,
    lapack_int * lda, const lapack_complex_double * tau,
    lapack_complex_double * c, lapack_int * ldc, lapack_complex_double *
    work, lapack_int * lwork, lapack_int * info)
void LAPACK_zunmtr (char * side, char * uplo, char * trans, lapack_int * m,
    lapack_int * n, const lapack_complex_double * a, lapack_int * lda, const
    lapack_complex_double * tau, lapack_complex_double * c, lapack_int *
    ldc, lapack_complex_double * work, lapack_int * lwork, lapack_int *
    info)
void LAPACK_zupgtr (char * uplo, lapack_int * n, const lapack_complex_double
    * ap, const lapack_complex_double * tau, lapack_complex_double * q,
    lapack_int * ldq, lapack_complex_double * work, lapack_int * info)
void LAPACK_zupmtr (char * side, char * uplo, char * trans, lapack_int * m,
    lapack_int * n, const lapack_complex_double * ap, const
    lapack_complex_double * tau, lapack_complex_double * c, lapack_int *
    ldc, lapack_complex_double * work, lapack_int * info)

now we pivot, bestie — say hi to the LAPACKE_c* complex-float crew 🫶 every single one of these returns a lapack_int, and each comes with its own _work twin. matching set, no cap. ✨

  • LAPACKE_cbbcsd — takes int matrix_layout, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p, lapack_int q, float * theta, float * phi, lapack_complex_float * u1, lapack_int ldu1, lapack_complex_float * u2, lapack_int ldu2, lapack_complex_float * v1t, lapack_int ldv1t, lapack_complex_float * v2t, lapack_int ldv2t, float * b11d, float * b11e, float * b12d, float * b12e, float * b21d, float * b21e, float * b22d, float * b22e. Definition at line 36 of file lapacke_cbbcsd.c.
lapack_int LAPACKE_cbbcsd (int matrix_layout, char jobu1, char jobu2, char
    jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p, lapack_int
    q, float * theta, float * phi, lapack_complex_float * u1, lapack_int
    ldu1, lapack_complex_float * u2, lapack_int ldu2, lapack_complex_float *
    v1t, lapack_int ldv1t, lapack_complex_float * v2t, lapack_int ldv2t,
    float * b11d, float * b11e, float * b12d, float * b12e, float * b21d,
    float * b21e, float * b22d, float * b22e)
  • LAPACKE_cbbcsd_work — same roster as above, then float * rwork, lapack_int lrwork. Definition at line 36 of file lapacke_cbbcsd_work.c.
lapack_int LAPACKE_cbbcsd_work (int matrix_layout, char jobu1, char jobu2,
    char jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p,
    lapack_int q, float * theta, float * phi, lapack_complex_float * u1,
    lapack_int ldu1, lapack_complex_float * u2, lapack_int ldu2,
    lapack_complex_float * v1t, lapack_int ldv1t, lapack_complex_float *
    v2t, lapack_int ldv2t, float * b11d, float * b11e, float * b12d, float *
    b12e, float * b21d, float * b21e, float * b22d, float * b22e, float *
    rwork, lapack_int lrwork)
  • LAPACKE_cbdsqr — int matrix_layout, char uplo, lapack_int n, lapack_int ncvt, lapack_int nru, lapack_int ncc, float * d, float * e, lapack_complex_float * vt, lapack_int ldvt, lapack_complex_float * u, lapack_int ldu, lapack_complex_float * c, lapack_int ldc. Definition at line 36 of file lapacke_cbdsqr.c.
lapack_int LAPACKE_cbdsqr (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, float * d, float * e,
    lapack_complex_float * vt, lapack_int ldvt, lapack_complex_float * u,
    lapack_int ldu, lapack_complex_float * c, lapack_int ldc)
  • LAPACKE_cbdsqr_work — the whole cbdsqr list, then one more little guy: float * work. Definition at line 36 of file lapacke_cbdsqr_work.c.
lapack_int LAPACKE_cbdsqr_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, float * d, float * e,
    lapack_complex_float * vt, lapack_int ldvt, lapack_complex_float * u,
    lapack_int ldu, lapack_complex_float * c, lapack_int ldc, float * work)
  • LAPACKE_cgbbrd — int matrix_layout, char vect, lapack_int m, lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku, lapack_complex_float * ab, lapack_int ldab, float * d, float * e, lapack_complex_float * q, lapack_int ldq, lapack_complex_float * pt, lapack_int ldpt, lapack_complex_float * c, lapack_int ldc. Definition at line 36 of file lapacke_cgbbrd.c.
lapack_int LAPACKE_cgbbrd (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku,
    lapack_complex_float * ab, lapack_int ldab, float * d, float * e,
    lapack_complex_float * q, lapack_int ldq, lapack_complex_float * pt,
    lapack_int ldpt, lapack_complex_float * c, lapack_int ldc)
  • LAPACKE_cgbbrd_work — same deal, plus lapack_complex_float * work and float * rwork. Definition at line 36 of file lapacke_cgbbrd_work.c.
lapack_int LAPACKE_cgbbrd_work (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku,
    lapack_complex_float * ab, lapack_int ldab, float * d, float * e,
    lapack_complex_float * q, lapack_int ldq, lapack_complex_float * pt,
    lapack_int ldpt, lapack_complex_float * c, lapack_int ldc,
    lapack_complex_float * work, float * rwork)
  • LAPACKE_cgbcon — int matrix_layout, char norm, lapack_int n, lapack_int kl, lapack_int ku, const lapack_complex_float * ab, lapack_int ldab, const lapack_int * ipiv, float anorm, float * rcond. Definition at line 36 of file lapacke_cgbcon.c.
lapack_int LAPACKE_cgbcon (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const lapack_complex_float * ab,
    lapack_int ldab, const lapack_int * ipiv, float anorm, float * rcond)
  • LAPACKE_cgbcon_work — the cgbcon squad plus lapack_complex_float * work and float * rwork. Definition at line 36 of file lapacke_cgbcon_work.c.
lapack_int LAPACKE_cgbcon_work (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const lapack_complex_float * ab,
    lapack_int ldab, const lapack_int * ipiv, float anorm, float * rcond,
    lapack_complex_float * work, float * rwork)
  • LAPACKE_cgbequ — int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const lapack_complex_float * ab, lapack_int ldab, float * r, float * c, float * rowcnd, float * colcnd, float * amax. Definition at line 36 of file lapacke_cgbequ.c.
lapack_int LAPACKE_cgbequ (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, const lapack_complex_float * ab,
    lapack_int ldab, float * r, float * c, float * rowcnd, float * colcnd,
    float * amax)
  • LAPACKE_cgbequ_work — literally the same argument list, no extra friends. Definition at line 36 of file lapacke_cgbequ_work.c.
lapack_int LAPACKE_cgbequ_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const lapack_complex_float * ab,
    lapack_int ldab, float * r, float * c, float * rowcnd, float * colcnd,
    float * amax)
  • LAPACKE_cgbequb — again the exact same signature as LAPACKE_cgbequ: int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const lapack_complex_float * ab, lapack_int ldab, float * r, float * c, float * rowcnd, float * colcnd, float * amax. Definition at line 36 of file lapacke_cgbequb.c.
lapack_int LAPACKE_cgbequb (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, const lapack_complex_float * ab,
    lapack_int ldab, float * r, float * c, float * rowcnd, float * colcnd,
    float * amax)
  • LAPACKE_cgbequb_work — twin of the above, arguments identical, definition at line 36 of file lapacke_cgbequb_work.c.
lapack_int LAPACKE_cgbequb_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const lapack_complex_float * ab,
    lapack_int ldab, float * r, float * c, float * rowcnd, float * colcnd,
    float * amax)
  • LAPACKE_cgbrfs — int matrix_layout, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const lapack_complex_float * ab, lapack_int ldab, const lapack_complex_float * afb, lapack_int ldafb, const lapack_int * ipiv, const lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * ferr, float * berr. Definition at line 36 of file lapacke_cgbrfs.c.
lapack_int LAPACKE_cgbrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_float * ab, lapack_int ldab, const lapack_complex_float *
    afb, lapack_int ldafb, const lapack_int * ipiv, const
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * ferr, float * berr)
  • LAPACKE_cgbrfs_work — everything from cgbrfs, then lapack_complex_float * work and float * rwork at the end. Definition at line 36 of file lapacke_cgbrfs_work.c.
lapack_int LAPACKE_cgbrfs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_float * ab, lapack_int ldab, const lapack_complex_float *
    afb, lapack_int ldafb, const lapack_int * ipiv, const
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * ferr, float * berr, lapack_complex_float * work,
    float * rwork)
  • LAPACKE_cgbrfsx — okay this one's got range, bestie: int matrix_layout, char trans, char equed, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const lapack_complex_float * ab, lapack_int ldab, const lapack_complex_float * afb, lapack_int ldafb, const lapack_int * ipiv, const float * r, const float * c, const lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * rcond, float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int nparams, float * params. Definition at line 36 of file lapacke_cgbrfsx.c.
lapack_int LAPACKE_cgbrfsx (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_float * ab, lapack_int ldab, const lapack_complex_float *
    afb, lapack_int ldafb, const lapack_int * ipiv, const float * r, const
    float * c, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * berr,
    lapack_int n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
    lapack_int nparams, float * params)
  • LAPACKE_cgbrfsx_work — hold onto your seat, it's the cgbrfsx roster plus lapack_complex_float * work and float * rwork tacked on at the end. Definition at line 36 of file lapacke_cgbrfsx_work.c.
lapack_int LAPACKE_cgbrfsx_work (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_float * ab, lapack_int ldab, const lapack_complex_float *
    afb, lapack_int ldafb, const lapack_int * ipiv, const float * r, const
    float * c, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * berr,
    lapack_int n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
    lapack_int nparams, float * params, lapack_complex_float * work, float *
    rwork)
  • LAPACKE_cgbsv — int matrix_layout, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, lapack_complex_float * ab, lapack_int ldab, lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb. Definition at line 36 of file lapacke_cgbsv.c.
lapack_int LAPACKE_cgbsv (int matrix_layout, lapack_int n, lapack_int kl,
    lapack_int ku, lapack_int nrhs, lapack_complex_float * ab, lapack_int
    ldab, lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)
  • LAPACKE_cgbsv_work — the same list as cgbsv with zero extra arguments. Definition at line 36 of file lapacke_cgbsv_work.c.
lapack_int LAPACKE_cgbsv_work (int matrix_layout, lapack_int n, lapack_int
    kl, lapack_int ku, lapack_int nrhs, lapack_complex_float * ab,
    lapack_int ldab, lapack_int * ipiv, lapack_complex_float * b, lapack_int
    ldb)

and that's where this chunk wraps — the c* banded girlies are keeping the party going and honestly? the *work twins are giving "same but with extra scratch space" and we love the consistency 💖

LAPACKE_cgbsvx

lapack_int LAPACKE_cgbsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
    lapack_complex_float * ab, lapack_int ldab, lapack_complex_float * afb,
    lapack_int ldafb, lapack_int * ipiv, char * equed, float * r, float * c,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * rcond, float * ferr, float * berr, float *
    rpivot)

okay so this is the big one — complex single precision, banded, and it gives you everything back: equed, r, c, rcond, ferr, berr, and even rpivot at the end. Definition at line 36 of lapacke_cgbsvx.c. 💅

LAPACKE_cgbsvx_work

lapack_int LAPACKE_cgbsvx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
    lapack_complex_float * ab, lapack_int ldab, lapack_complex_float * afb,
    lapack_int ldafb, lapack_int * ipiv, char * equed, float * r, float * c,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * rcond, float * ferr, float * berr,
    lapack_complex_float * work, float * rwork)

same bestie, but now with work and rwork bolted on the end — that's the whole _work vibe right there. Definition at line 36 of lapacke_cgbsvx_work.c. ✨

LAPACKE_cgbsvxx

lapack_int LAPACKE_cgbsvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
    lapack_complex_float * ab, lapack_int ldab, lapack_complex_float * afb,
    lapack_int ldafb, lapack_int * ipiv, char * equed, float * r, float * c,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * rcond, float * rpvgrw, float * berr, lapack_int
    n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int
    nparams, float * params)

double-x, double trouble 😭 — n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params are all hanging out in the parameter list, and rpvgrw replaced the plain rpivot from before. Definition at line 36 of lapacke_cgbsvxx.c. 🔥

LAPACKE_cgbsvxx_work

lapack_int LAPACKE_cgbsvxx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
    lapack_complex_float * ab, lapack_int ldab, lapack_complex_float * afb,
    lapack_int ldafb, lapack_int * ipiv, char * equed, float * r, float * c,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * rcond, float * rpvgrw, float * berr, lapack_int
    n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int
    nparams, float * params, lapack_complex_float * work, float * rwork)

yep, the _work twin again, rocking work + rwork at the tail end. Definition at line 36 of lapacke_cgbsvxx_work.c. 🫶

LAPACKE_cgbtrf

lapack_int LAPACKE_cgbtrf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_complex_float * ab, lapack_int
    ldab, lapack_int * ipiv)

short, sweet, and it's giving "the f is for factor" energy. Definition at line 36 of lapacke_cgbtrf.c. 🎀

LAPACKE_cgbtrf_work

lapack_int LAPACKE_cgbtrf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, lapack_complex_float * ab, lapack_int
    ldab, lapack_int * ipiv)

literally the same list of args, no extra work param in sight — sometimes the _work version just matches its parent. Definition at line 36 of lapacke_cgbtrf_work.c. ⭐

LAPACKE_cgbtrs

lapack_int LAPACKE_cgbtrs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_float * ab, lapack_int ldab, const lapack_int * ipiv,
    lapack_complex_float * b, lapack_int ldb)

not me noticing the const on ab and ipiv 🙈 — those babies are strictly read-only here. Definition at line 36 of lapacke_cgbtrs.c.

LAPACKE_cgbtrs_work

lapack_int LAPACKE_cgbtrs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_float * ab, lapack_int ldab, const lapack_int * ipiv,
    lapack_complex_float * b, lapack_int ldb)

same consts, same args, zero extra params — the work version is keeping it lowkey identical. Definition at line 36 of lapacke_cgbtrs_work.c. 🌸

LAPACKE_cgebak

lapack_int LAPACKE_cgebak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const float * scale,
    lapack_int m, lapack_complex_float * v, lapack_int ldv)

job, side, ilo, ihi, and a const float * scale — the whole back-transformation starter pack. Definition at line 36 of lapacke_cgebak.c. 🦋

LAPACKE_cgebak_work

lapack_int LAPACKE_cgebak_work (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const float * scale,
    lapack_int m, lapack_complex_float * v, lapack_int ldv)

identical signature, work-flavoured name, still holding that const float * scale respectfully. Definition at line 36 of lapacke_cgebak_work.c. 💜

LAPACKE_cgebal

lapack_int LAPACKE_cgebal (int matrix_layout, char job, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ilo, lapack_int *
    ihi, float * scale)

ilo and ihi show up as pointers here, so the function's handing values back out to you 👑. Definition at line 36 of lapacke_cgebal.c.

LAPACKE_cgebal_work

lapack_int LAPACKE_cgebal_work (int matrix_layout, char job, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ilo, lapack_int *
    ihi, float * scale)

same pointer-y ilo / ihi situation, same everything tbh. Definition at line 36 of lapacke_cgebal_work.c. ✨

LAPACKE_cgebrd

lapack_int LAPACKE_cgebrd (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, float * d, float * e,
    lapack_complex_float * tauq, lapack_complex_float * taup)

real d and e, complex tauq and taup — it's giving mixed-vibes-on-purpose. Definition at line 36 of lapacke_cgebrd.c. 🌈

LAPACKE_cgebrd_work

lapack_int LAPACKE_cgebrd_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, float * d, float * e,
    lapack_complex_float * tauq, lapack_complex_float * taup,
    lapack_complex_float * work, lapack_int lwork)

classic _work behaviour: everything from cgebrd plus work and lwork at the end. Definition at line 36 of lapacke_cgebrd_work.c. 💖

LAPACKE_cgecon

lapack_int LAPACKE_cgecon (int matrix_layout, char norm, lapack_int n, const
    lapack_complex_float * a, lapack_int lda, float anorm, float * rcond)

note the const on a and the plain float anorm getting passed in by value — rcond is the one coming back out. Definition at line 36 of lapacke_cgecon.c. 🎀

LAPACKE_cgecon_work

lapack_int LAPACKE_cgecon_work (int matrix_layout, char norm, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, float anorm, float *
    rcond, lapack_complex_float * work, float * rwork)

now with work and rwork — complex work array plus a real one, because of course. Definition at line 36 of lapacke_cgecon_work.c. 🍓

LAPACKE_cgeequ

lapack_int LAPACKE_cgeequ (int matrix_layout, lapack_int m, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, float * r, float * c,
    float * rowcnd, float * colcnd, float * amax)

r, c, rowcnd, colcnd, amax — five output-ish pointers and a const input, busy busy. Definition at line 36 of lapacke_cgeequ.c. 🧚

LAPACKE_cgeequ_work

lapack_int LAPACKE_cgeequ_work (int matrix_layout, lapack_int m, lapack_int
    n, const lapack_complex_float * a, lapack_int lda, float * r, float * c,
    float * rowcnd, float * colcnd, float * amax)

same five pointers, same const, still no extra work params — it said "I'm fine as I am" 💅. Definition at line 36 of lapacke_cgeequ_work.c.

LAPACKE_cgeequb

lapack_int LAPACKE_cgeequb (int matrix_layout, lapack_int m, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, float * r, float * c,
    float * rowcnd, float * colcnd, float * amax)

the b on the end is doing a lot of heavy lifting in that name, but the parameter list is a full-on carbon copy of cgeequ. Definition at line 36 of lapacke_cgeequb.c. ⭐

LAPACKE_cgeequb_work

lapack_int LAPACKE_cgeequb_work (int matrix_layout, lapack_int m, lapack_int
    n, const lapack_complex_float * a, lapack_int lda, float * r, float * c,
    float * rowcnd, float * colcnd, float * amax)

and the _work version keeps the exact same lineup. consistent queen 👑. Definition at line 36 of lapacke_cgeequb_work.c.

LAPACKE_cgees

lapack_int LAPACKE_cgees (int matrix_layout, char jobvs, char sort,
    LAPACK_C_SELECT1 select, lapack_int n, lapack_complex_float * a,
    lapack_int lda, lapack_int * sdim, lapack_complex_float * w,
    lapack_complex_float * vs, lapack_int ldvs)

okay the LAPACK_C_SELECT1 select parameter is kind of iconic ngl — a whole function-pointer type just vibing in the middle of the arg list. Definition at line 36 of lapacke_cgees.c. 🔥

LAPACKE_cgees_work

lapack_int LAPACKE_cgees_work (int matrix_layout, char jobvs, char sort,
    LAPACK_C_SELECT1 select, lapack_int n, lapack_complex_float * a,
    lapack_int lda, lapack_int * sdim, lapack_complex_float * w,
    lapack_complex_float * vs, lapack_int ldvs, lapack_complex_float * work,
    lapack_int lwork, float * rwork, lapack_logical * bwork)

same select, but now trailing work, lwork, rwork and a lapack_logical * bwork — the whole squad came along. Definition at line 36 of lapacke_cgees_work.c. 💀

LAPACKE_cgeesx

lapack_int LAPACKE_cgeesx (int matrix_layout, char jobvs, char sort,
    LAPACK_C_SELECT1 select, char sense, lapack_int n, lapack_complex_float
    * a, lapack_int lda, lapack_int * sdim, lapack_complex_float * w,
    lapack_complex_float * vs, lapack_int ldvs, float * rconde, float *
    rcondv)

the x version brought a sense char and two extra float pointers, rconde and rcondv. glow-up fr fr ✨ Definition at line 36 of lapacke_cgeesx.c.

LAPACKE_cgeesx_work

lapack_int LAPACKE_cgeesx_work (int matrix_layout, char jobvs, char sort,
    LAPACK_C_SELECT1 select, char sense, lapack_int n, lapack_complex_float
    * a, lapack_int lda, lapack_int * sdim, lapack_complex_float * w,
    lapack_complex_float * vs, lapack_int ldvs, float * rconde, float *
    rcondv, lapack_complex_float * work, lapack_int lwork, float * rwork,
    lapack_logical * bwork)

everything from cgeesx plus the full work/lwork/rwork/bwork finale. Definition at line 36 of lapacke_cgeesx_work.c. 🫶

LAPACKE_cgeev

lapack_int LAPACKE_cgeev (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * w, lapack_complex_float * vl, lapack_int ldvl,
    lapack_complex_float * vr, lapack_int ldvr)

jobvl and jobvr are a matched set, and so are vl/ldvl and vr/ldvr — symmetry, we love to see it. Definition at line 36 of lapacke_cgeev.c. 🌸

LAPACKE_cgeev_work

lapack_int LAPACKE_cgeev_work (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * w, lapack_complex_float * vl, lapack_int ldvl,
    lapack_complex_float * vr, lapack_int ldvr, lapack_complex_float * work,
    lapack_int lwork, float * rwork)

add work, lwork, rwork, stir gently. Definition at line 36 of lapacke_cgeev_work.c. 🎀

LAPACKE_cgeevx

lapack_int LAPACKE_cgeevx (int matrix_layout, char balanc, char jobvl, char
    jobvr, char sense, lapack_int n, lapack_complex_float * a, lapack_int
    lda, lapack_complex_float * w, lapack_complex_float * vl, lapack_int
    ldvl, lapack_complex_float * vr, lapack_int ldvr, lapack_int * ilo,
    lapack_int * ihi, float * scale, float * abnrm, float * rconde, float *
    rcondv)

three leading chars (balanc, jobvl, jobvr), then sense, then a whole parade of pointer outputs: ilo, ihi, scale, abnrm, rconde, rcondv. main character energy 👑. Definition at line 36 of lapacke_cgeevx.c.

LAPACKE_cgeevx_work

lapack_int LAPACKE_cgeevx_work (int matrix_layout, char balanc, char jobvl,
    char jobvr, char sense, lapack_int n, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * w, lapack_complex_float * vl,
    lapack_int ldvl, lapack_complex_float * vr, lapack_int ldvr, lapack_int
    * ilo, lapack_int * ihi, float * scale, float * abnrm, float * rconde,
    float * rcondv, lapack_complex_float * work, lapack_int lwork, float *
    rwork)

same parade, plus work, lwork, rwork bringing up the rear. Definition at line 36 of lapacke_cgeevx_work.c. 🦋

LAPACKE_cgehrd

lapack_int LAPACKE_cgehrd (int matrix_layout, lapack_int n, lapack_int ilo,
    lapack_int ihi, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tau)

no job char here, just straight into n, ilo, ihi, a, lda, tau. efficient. Definition at line 36 of lapacke_cgehrd.c. ⭐

LAPACKE_cgehrd_work

lapack_int LAPACKE_cgehrd_work (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tau, lapack_complex_float * work, lapack_int
    lwork)

the _work one does add work and lwork though — no gatekeeping. Definition at line 36 of lapacke_cgehrd_work.c. 💜

LAPACKE_cgejsv

lapack_int LAPACKE_cgejsv (int matrix_layout, char joba, char jobu, char
    jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, float * sva,
    lapack_complex_float * u, lapack_int ldu, lapack_complex_float * v,
    lapack_int ldv, float * stat, lapack_int * istat)

SIX consecutive job chars: joba, jobu, jobv, jobr, jobt, jobp. not me counting them twice 😭. plus stat and istat living together at the end, one real one integer. Definition at line 36 of lapacke_cgejsv.c. 🔥

LAPACKE_cgejsv_work

lapack_int LAPACKE_cgejsv_work (int matrix_layout, char joba, char jobu,
    char jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, float * sva,
    lapack_complex_float * u, lapack_int ldu, lapack_complex_float * v,
    lapack_int ldv, lapack_complex_float * cwork, lapack_int lwork, float *
    work, lapack_int lrwork, lapack_int * iwork)

all six jobs again, and then the workspace situation goes full maximalist: cwork, lwork, work, lrwork, iwork. it's giving prepared ✨. Definition at line 36 of lapacke_cgejsv_work.c.

LAPACKE_cgelq

lapack_int LAPACKE_cgelq (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * t,
    lapack_int tsize)

m, n, a, lda, t, tsize — six params, clean, minimal, ate 💅. Definition at line 36 of lapacke_cgelq.c.

LAPACKE_cgelq2

lapack_int LAPACKE_cgelq2 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau)

the 2 version swaps that t/tsize pair for a single tau pointer. small difference, big vibe shift. Definition at line 36 of lapacke_cgelq2.c. 🌈

🦋 LAPACKE_cgelq2_work

okay so this one's the _work twin — same crew of args, but you're handing it the scratch space yourself. a, lda, tau, and the work buffer, all up to you bestie 💅

lapack_int LAPACKE_cgelq2_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau,
    lapack_complex_float * work)

Definition at line 36 of file lapacke_cgelq2_work.c.


✨ LAPACKE_cgelq_work

t AND tsize AND lwork — she's high maintenance but she's iconic for it 🎀

lapack_int LAPACKE_cgelq_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * t,
    lapack_int tsize, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cgelq_work.c.


🌸 LAPACKE_cgelqf

no work buffer, no lwork, no thoughts, just vibes and a/lda/tau 🫶

lapack_int LAPACKE_cgelqf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau)

Definition at line 36 of file lapacke_cgelqf.c.


💜 LAPACKE_cgelqf_work

same cgelqf energy but now you're bringing the work and the lwork like a responsible main character ⭐

lapack_int LAPACKE_cgelqf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cgelqf_work.c.


🌈 LAPACKE_cgels

trans is here, nrhs is here, b and ldb are here — the whole squad fr fr 💖

lapack_int LAPACKE_cgels (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cgels.c.


🔥 LAPACKE_cgels_work

literally the same gang plus work and lwork tagging along at the end, no cap 😌

lapack_int LAPACKE_cgels_work (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_cgels_work.c.


🎀 LAPACKE_cgelsd

ooh she brought friends: s, rcond, and rank — a float and a lapack_int * walked in 💀

lapack_int LAPACKE_cgelsd (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * s, float rcond,
    lapack_int * rank)

Definition at line 36 of file lapacke_cgelsd.c.


🧚 LAPACKE_cgelsd_work

the way this signature just keeps GOING — work, lwork, rwork, iwork, she's collecting buffers like Pokémon 😭

lapack_int LAPACKE_cgelsd_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * s, float rcond,
    lapack_int * rank, lapack_complex_float * work, lapack_int lwork, float
    * rwork, lapack_int * iwork)

Definition at line 36 of file lapacke_cgelsd_work.c.


🍓 LAPACKE_cgelss

double-s at the end, double the slay — s, rcond, rank, periodt ✨

lapack_int LAPACKE_cgelss (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * s, float rcond,
    lapack_int * rank)

Definition at line 36 of file lapacke_cgelss.c.


💅 LAPACKE_cgelss_work

cgelss but with the work/lwork/rwork trio added, and honestly? obsessed 🫶

lapack_int LAPACKE_cgelss_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * s, float rcond,
    lapack_int * rank, lapack_complex_float * work, lapack_int lwork, float
    * rwork)

Definition at line 36 of file lapacke_cgelss_work.c.


🌟 LAPACKE_cgelsy

the y stands for "yes bestie" and also there's jpvt now — a lapack_int *, very demure 👑

lapack_int LAPACKE_cgelsy (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_int * jpvt, float
    rcond, lapack_int * rank)

Definition at line 36 of file lapacke_cgelsy.c.


💫 LAPACKE_cgelsy_work

jpvt stays, work, lwork, rwork join — it's giving full house 🎰

lapack_int LAPACKE_cgelsy_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_int * jpvt, float
    rcond, lapack_int * rank, lapack_complex_float * work, lapack_int lwork,
    float * rwork)

Definition at line 36 of file lapacke_cgelsy_work.c.


🦋 LAPACKE_cgemlq

side + trans + everything const that can be const — she's respectful of your data, we love a considerate queen 💖

lapack_int LAPACKE_cgemlq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float *
    a, lapack_int lda, const lapack_complex_float * t, lapack_int tsize,
    lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_cgemlq.c.


⭐ LAPACKE_cgemlq_work

same deal but work and lwork show up at the end like "sorry I'm late" 🙈

lapack_int LAPACKE_cgemlq_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float *
    a, lapack_int lda, const lapack_complex_float * t, lapack_int tsize,
    lapack_complex_float * c, lapack_int ldc, lapack_complex_float * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_cgemlq_work.c.


🌸 LAPACKE_cgemqr

cgemlq's sister, same arg list, different letters in the name — iykyk 💅

lapack_int LAPACKE_cgemqr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float *
    a, lapack_int lda, const lapack_complex_float * t, lapack_int tsize,
    lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_cgemqr.c.


🎀 LAPACKE_cgemqr_work

and here's her _work version with the work/lwork add-on, slaying as usual ✨

lapack_int LAPACKE_cgemqr_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float *
    a, lapack_int lda, const lapack_complex_float * t, lapack_int tsize,
    lapack_complex_float * c, lapack_int ldc, lapack_complex_float * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_cgemqr_work.c.


🔥 LAPACKE_cgemqrt

the T version has BOTH nb and ldt — she said "I'm not doing this without my blocksize" 😤

lapack_int LAPACKE_cgemqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const
    lapack_complex_float * v, lapack_int ldv, const lapack_complex_float *
    t, lapack_int ldt, lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_cgemqrt.c.


💜 LAPACKE_cgemqrt_work

same as cgemqrt but with a work pointer tacked on, as is tradition 🫶

lapack_int LAPACKE_cgemqrt_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const
    lapack_complex_float * v, lapack_int ldv, const lapack_complex_float *
    t, lapack_int ldt, lapack_complex_float * c, lapack_int ldc,
    lapack_complex_float * work)

Definition at line 36 of file lapacke_cgemqrt_work.c.


🌈 LAPACKE_cgeqlf

back to the simple life: a, lda, tau, and nothing else bothering us 💖

lapack_int LAPACKE_cgeqlf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau)

Definition at line 36 of file lapacke_cgeqlf.c.


🧚 LAPACKE_cgeqlf_work

cgeqlf but she brought a work buffer and a lwork to match — prepared icon 👑

lapack_int LAPACKE_cgeqlf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cgeqlf_work.c.


🍓 LAPACKE_cgeqp3

jpvt is a lapack_int * so yes, she's going to be writing into it — not me being dramatic, it's just literally not const 😭

lapack_int LAPACKE_cgeqp3 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * jpvt,
    lapack_complex_float * tau)

Definition at line 36 of file lapacke_cgeqp3.c.


💅 LAPACKE_cgeqp3_work

now with work, lwork, and a float * rwork guest appearance, absolutely ate 💀

lapack_int LAPACKE_cgeqp3_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_int * jpvt,
    lapack_complex_float * tau, lapack_complex_float * work, lapack_int
    lwork, float * rwork)

Definition at line 36 of file lapacke_cgeqp3_work.c.


🌟 LAPACKE_cgeqpf

p3 but pf — different last letters, same jpvt-carrying energy 🎀

lapack_int LAPACKE_cgeqpf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * jpvt,
    lapack_complex_float * tau)

Definition at line 36 of file lapacke_cgeqpf.c.


🦋 LAPACKE_cgeqpf_work

note the rwork here with NO lwork — she keeps it short and slightly mysterious 🕵️‍♀️

lapack_int LAPACKE_cgeqpf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_int * jpvt,
    lapack_complex_float * tau, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cgeqpf_work.c.


⭐ LAPACKE_cgeqr

t + tsize, no work in sight, living that minimalist lifestyle ✨

lapack_int LAPACKE_cgeqr (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * t,
    lapack_int tsize)

Definition at line 36 of file lapacke_cgeqr.c.


💜 LAPACKE_cgeqr2

the tiny one. a, lda, tau, done. short king energy 👑 (affectionate)

lapack_int LAPACKE_cgeqr2 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau)

Definition at line 36 of file lapacke_cgeqr2.c.


🌈 LAPACKE_cgeqr2_work

cgeqr2 with a work pointer added, because even the tiny ones need scratch space sometimes 🫶

lapack_int LAPACKE_cgeqr2_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau,
    lapack_complex_float * work)

Definition at line 36 of file lapacke_cgeqr2_work.c.


🔥 LAPACKE_cgeqr_work

t, tsize, work, lwork — she's fully packed for the trip, no cap 🎒

lapack_int LAPACKE_cgeqr_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * t,
    lapack_int tsize, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cgeqr_work.c.


🌸 LAPACKE_cgeqrf

THE classic. a, lda, tau. if you know you know 🤫

lapack_int LAPACKE_cgeqrf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau)

Definition at line 36 of file lapacke_cgeqrf.c.


🎀 LAPACKE_cgeqrf_work

same as cgeqrf with the work/lwork duo — a matching set, we stan a coordinated moment 💖

lapack_int LAPACKE_cgeqrf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cgeqrf_work.c.


🧚 LAPACKE_cgeqrfp

the extra p and nothing else changed — subtle, chic, lowkey iconic 💅

lapack_int LAPACKE_cgeqrfp (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau)

Definition at line 36 of file lapacke_cgeqrfp.c.


🍓 LAPACKE_cgeqrfp_work

and her _work twin, with work and lwork politely appended 🌟

lapack_int LAPACKE_cgeqrfp_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cgeqrfp_work.c.


💫 LAPACKE_cgeqrt

nb AND ldt in the same signature — she has OPINIONS about blocks and I respect it 😤

lapack_int LAPACKE_cgeqrt (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int nb, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * t, lapack_int ldt)

Definition at line 36 of file lapacke_cgeqrt.c.


⭐ LAPACKE_cgeqrt2

no nb here, just m, n, a, lda, t, ldt — the block size said "not today" 🙈

lapack_int LAPACKE_cgeqrt2 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * t,
    lapack_int ldt)

Definition at line 36 of file lapacke_cgeqrt2.c.


💜 LAPACKE_cgeqrt2_work

exciting plot twist: the _work here has the EXACT same arg list as the plain one. no extra buffer. a mystery, a moment 🫶

lapack_int LAPACKE_cgeqrt2_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * t,
    lapack_int ldt)

Definition at line 36 of file lapacke_cgeqrt2_work.c.


🌈 LAPACKE_cgeqrt3

three's the charm bestie, same arg roster, new number 🎀

lapack_int LAPACKE_cgeqrt3 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * t,
    lapack_int ldt)

Definition at line 36 of file lapacke_cgeqrt3.c.


🔥 LAPACKE_cgeqrt3_work

and _work version of the 3, once again identical args — consistency queen 👑

lapack_int LAPACKE_cgeqrt3_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * t,
    lapack_int ldt)

Definition at line 36 of file lapacke_cgeqrt3_work.c.


🌸 LAPACKE_cgeqrt_work

okay back to the normal pattern — cgeqrt's args plus a work at the end, order restored ✨

lapack_int LAPACKE_cgeqrt_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nb, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * t, lapack_int ldt, lapack_complex_float * work)

Definition at line 36 of file lapacke_cgeqrt_work.c.


💅 LAPACKE_cgerfs

LOOK at all these consts — a, af, ipiv, b are all read-only and she's being SO respectful. x is not though. x is getting written to 😌

lapack_int LAPACKE_cgerfs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * af, lapack_int ldaf, const lapack_int * ipiv,
    const lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_cgerfs.c.


🦋 LAPACKE_cgerfs_work

the grand finale of this batch 💖 same lineup, ferr and berr still pointing at your floats, plus work and rwork right at the end like a lil bow on top 🎀

lapack_int LAPACKE_cgerfs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * af, lapack_int ldaf, const lapack_int * ipiv,
    const lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    x, lapack_int ldx, float * ferr, float * berr, lapack_complex_float *
    work, float * rwork)

Definition at line 36 of file lapacke_cgerfs_work.c.

💅 LAPACKE_cgerfsx

the "hey bestie, how wrong is my answer actually" one 🫶 it refines a solution and hands you back error bounds like receipts.

lapack_int LAPACKE_cgerfsx (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * af, lapack_int ldaf, const
    lapack_int * ipiv, const float * r, const float * c, const
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * rcond, float * berr, lapack_int n_err_bnds,
    float * err_bnds_norm, float * err_bnds_comp, lapack_int nparams, float
    * params)

Definition at line 36 of file lapacke_cgerfsx.c.

🧚 LAPACKE_cgerfsx_work

literally the same function but you're the one bringing the workspace — work and rwork are on you, no cap.

lapack_int LAPACKE_cgerfsx_work (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * af, lapack_int ldaf, const
    lapack_int * ipiv, const float * r, const float * c, const
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * rcond, float * berr, lapack_int n_err_bnds,
    float * err_bnds_norm, float * err_bnds_comp, lapack_int nparams, float
    * params, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cgerfsx_work.c.

🎀 LAPACKE_cgerqf

RQ factorization moment ✨ you get the tau scalars back and everything.

lapack_int LAPACKE_cgerqf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau)

Definition at line 36 of file lapacke_cgerqf.c.

🌸 LAPACKE_cgerqf_work

same RQ glow-up, except you're supplying work + lwork yourself 💅

lapack_int LAPACKE_cgerqf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cgerqf_work.c.

👑 LAPACKE_cgesdd

the SVD icon — divide-and-conquer energy, singular values in s, and it fills in u and vt for you. main character behavior fr.

lapack_int LAPACKE_cgesdd (int matrix_layout, char jobz, lapack_int m,
    lapack_int n, lapack_complex_float * a, lapack_int lda, float * s,
    lapack_complex_float * u, lapack_int ldu, lapack_complex_float * vt,
    lapack_int ldvt)

Definition at line 36 of file lapacke_cgesdd.c.

🦋 LAPACKE_cgesdd_work

same SVD slay, but now work, lwork, rwork and iwork are all in your hands 🫶

lapack_int LAPACKE_cgesdd_work (int matrix_layout, char jobz, lapack_int m,
    lapack_int n, lapack_complex_float * a, lapack_int lda, float * s,
    lapack_complex_float * u, lapack_int ldu, lapack_complex_float * vt,
    lapack_int ldvt, lapack_complex_float * work, lapack_int lwork, float *
    rwork, lapack_int * iwork)

Definition at line 36 of file lapacke_cgesdd_work.c.

🔥 LAPACKE_cgesv

the classic: solve A * X = B. Pivot city, but make it fashion. ipiv comes back filled in.

lapack_int LAPACKE_cgesv (int matrix_layout, lapack_int n, lapack_int nrhs,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cgesv.c.

⭐ LAPACKE_cgesv_work

identical parameter list, zero extra drama — just the workspace-flavored twin 💖

lapack_int LAPACKE_cgesv_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, lapack_complex_float * a, lapack_int lda, lapack_int * ipiv,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cgesv_work.c.

🌈 LAPACKE_cgesvd

the other SVD bestie — QR-iteration flavor. superb is where the superdiagonal leftovers go btw, don't forget it exists 😭

lapack_int LAPACKE_cgesvd (int matrix_layout, char jobu, char jobvt,
    lapack_int m, lapack_int n, lapack_complex_float * a, lapack_int lda,
    float * s, lapack_complex_float * u, lapack_int ldu,
    lapack_complex_float * vt, lapack_int ldvt, float * superb)

Definition at line 36 of file lapacke_cgesvd.c.

🍓 LAPACKE_cgesvd_work

same superb situation, plus work, lwork and rwork — you're the workspace manager now ✨

lapack_int LAPACKE_cgesvd_work (int matrix_layout, char jobu, char jobvt,
    lapack_int m, lapack_int n, lapack_complex_float * a, lapack_int lda,
    float * s, lapack_complex_float * u, lapack_int ldu,
    lapack_complex_float * vt, lapack_int ldvt, lapack_complex_float * work,
    lapack_int lwork, float * rwork)

Definition at line 36 of file lapacke_cgesvd_work.c.

🧚‍♀️ LAPACKE_cgesvdx

the choose-your-own-singular-values one 🎯 range, vl, vu, il, iu — you literally get to pick which ones. ns tells you how many you actually got.

lapack_int LAPACKE_cgesvdx (int matrix_layout, char jobu, char jobvt, char
    range, lapack_int m, lapack_int n, lapack_complex_float * a, lapack_int
    lda, float vl, float vu, lapack_int il, lapack_int iu, lapack_int * ns,
    float * s, lapack_complex_float * u, lapack_int ldu,
    lapack_complex_float * vt, lapack_int ldvt, lapack_int * superb)

Definition at line 36 of file lapacke_cgesvdx.c.

💜 LAPACKE_cgesvdx_work

same picky-singular-values energy, now with work, lwork, rwork and iwork handed over 🫶

lapack_int LAPACKE_cgesvdx_work (int matrix_layout, char jobu, char jobvt,
    char range, lapack_int m, lapack_int n, lapack_complex_float * a,
    lapack_int lda, float vl, float vu, lapack_int il, lapack_int iu,
    lapack_int * ns, float * s, lapack_complex_float * u, lapack_int ldu,
    lapack_complex_float * vt, lapack_int ldvt, lapack_complex_float * work,
    lapack_int lwork, float * rwork, lapack_int * iwork)

Definition at line 36 of file lapacke_cgesvdx_work.c.

🎀 LAPACKE_cgesvj

Jacobi SVD!! lowkey the underrated one 💅 joba, jobu, jobv control the whole vibe, sva holds the singular values, and stat reports back on convergence.

lapack_int LAPACKE_cgesvj (int matrix_layout, char joba, char jobu, char
    jobv, lapack_int m, lapack_int n, lapack_complex_float * a, lapack_int
    lda, float * sva, lapack_int mv, lapack_complex_float * v, lapack_int
    ldv, float * stat)

Definition at line 36 of file lapacke_cgesvj.c.

🌸 LAPACKE_cgesvj_work

Jacobi but you're carrying cwork, lwork, rwork and lrwork — highkey a lot, but she's worth it ✨

lapack_int LAPACKE_cgesvj_work (int matrix_layout, char joba, char jobu,
    char jobv, lapack_int m, lapack_int n, lapack_complex_float * a,
    lapack_int lda, float * sva, lapack_int mv, lapack_complex_float * v,
    lapack_int ldv, lapack_complex_float * cwork, lapack_int lwork, float *
    rwork, lapack_int lrwork)

Definition at line 36 of file lapacke_cgesvj_work.c.

🔥 LAPACKE_cgesvx

the expert-mode solve 👑 factors, equilibrates, solves, and reports rcond, ferr, berr. equed says what scaling got applied, and rpivot is chillin' at the end.

lapack_int LAPACKE_cgesvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, lapack_int * ipiv, char *
    equed, float * r, float * c, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr,
    float * berr, float * rpivot)

Definition at line 36 of file lapacke_cgesvx.c.

🦋 LAPACKE_cgesvx_work

same expert solve, except work and rwork are your responsibility, and notice there's no rpivot here 💅

lapack_int LAPACKE_cgesvx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, lapack_int * ipiv, char *
    equed, float * r, float * c, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr,
    float * berr, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cgesvx_work.c.

🫶 LAPACKE_cgesvxx

the extra-extra expert solve — now with rpvgrw, plus the whole n_err_bnds / err_bnds_norm / err_bnds_comp / nparams / params error-bound situation. it's giving thorough 💖

lapack_int LAPACKE_cgesvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, lapack_int * ipiv, char *
    equed, float * r, float * c, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * rpvgrw,
    float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float *
    err_bnds_comp, lapack_int nparams, float * params)

Definition at line 36 of file lapacke_cgesvxx.c.

🌈 LAPACKE_cgesvxx_work

everything from cgesvxx but now with work + rwork bolted on the end, because of course 🎀

lapack_int LAPACKE_cgesvxx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, lapack_int * ipiv, char *
    equed, float * r, float * c, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * rpvgrw,
    float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float *
    err_bnds_comp, lapack_int nparams, float * params, lapack_complex_float
    * work, float * rwork)

Definition at line 36 of file lapacke_cgesvxx_work.c.

🍓 LAPACKE_cgetf2

the unblocked baby LU 💅 small matrices only, but she's the blueprint for everything else. ipiv comes back, obviously.

lapack_int LAPACKE_cgetf2 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_cgetf2.c.

🧚 LAPACKE_cgetf2_work

literally the same parameter list as its sibling — unblocked LU, no extras, no notes 🫶

lapack_int LAPACKE_cgetf2_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_cgetf2_work.c.

👑 LAPACKE_cgetrf

the LU factorization main event 🔥 blocked, iconic, ipiv filled in, exactly what you want before calling LAPACKE_cgetrs or LAPACKE_cgetri.

lapack_int LAPACKE_cgetrf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_cgetrf.c.

🌸 LAPACKE_cgetrf2

the recursive-flavored LU twin 🌱 same signature vibe, different sauce underneath.

lapack_int LAPACKE_cgetrf2 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_cgetrf2.c.

🦋 LAPACKE_cgetrf2_work

recursive LU again, same params, no extra workspace handed over 😌

lapack_int LAPACKE_cgetrf2_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_cgetrf2_work.c.

⭐ LAPACKE_cgetrf_work

the _work edition of the classic LU — identical parameter list, she just lives in a different file 💖

lapack_int LAPACKE_cgetrf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_cgetrf_work.c.

🎀 LAPACKE_cgetri

inverse time!! 💅 needs the ipiv from a prior LAPACKE_cgetrf, so don't skip steps bestie.

lapack_int LAPACKE_cgetri (int matrix_layout, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv)

Definition at line 36 of file lapacke_cgetri.c.

🎯 LAPACKE_cgetri_work

same inverse, plus work and lwork because you're doing the workspace math now 🫶

lapack_int LAPACKE_cgetri_work (int matrix_layout, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cgetri_work.c.

🔥 LAPACKE_cgetrs

solve using the LU you already factored ✨ trans says whether you want A, A^T or A^H, and a + ipiv must be from LAPACKE_cgetrf. no shortcuts 🫶

lapack_int LAPACKE_cgetrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cgetrs.c.

🧚‍♀️ LAPACKE_cgetrs_work

same solve, same params, _work energy 💅

lapack_int LAPACKE_cgetrs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cgetrs_work.c.

🌈 LAPACKE_cgetsls

least-squares via SVD vibes 🎀 gets you the minimum-norm solution when the system is being extra. trans again decides which flavor you're solving.

lapack_int LAPACKE_cgetsls (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cgetsls.c.

🍓 LAPACKE_cgetsls_work

least-squares but with work + lwork in the mix 🫶

lapack_int LAPACKE_cgetsls_work (int matrix_layout, char trans, lapack_int
    m, lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int
    lda, lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_cgetsls_work.c.

💜 LAPACKE_cggbak

the "put my eigenvectors back how they were" function bestie 😭 it undoes the balancing from LAPACKE_cggbal using lscale and rscale. job and side decide the scope.

lapack_int LAPACKE_cggbak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const float * lscale,
    const float * rscale, lapack_int m, lapack_complex_float * v, lapack_int
    ldv)

Definition at line 36 of file lapacke_cggbak.c.

🌸 LAPACKE_cggbak_work

identical signature to cggbak, just chilling in the _work file 🎀

lapack_int LAPACKE_cggbak_work (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const float * lscale,
    const float * rscale, lapack_int m, lapack_complex_float * v, lapack_int
    ldv)

Definition at line 36 of file lapacke_cggbak_work.c.

🧚 LAPACKE_cggbal

the balancing act 💅 permutes and scales your pencil (a, b) so the eigenvalues behave, then hands you back ilo, ihi, lscale and rscale.

lapack_int LAPACKE_cggbal (int matrix_layout, char job, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * b,
    lapack_int ldb, lapack_int * ilo, lapack_int * ihi, float * lscale,
    float * rscale)

Definition at line 36 of file lapacke_cggbal.c.

🦋 LAPACKE_cggbal_work

same balancing slay, with one bonus work array tacked on at the end ✨

lapack_int LAPACKE_cggbal_work (int matrix_layout, char job, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * b,
    lapack_int ldb, lapack_int * ilo, lapack_int * ihi, float * lscale,
    float * rscale, float * work)

Definition at line 36 of file lapacke_cggbal_work.c.

💜 LAPACKE_cgges

lapack_int LAPACKE_cgges (int matrix_layout, char jobvsl, char jobvsr, char
    sort, LAPACK_C_SELECT2 selctg, lapack_int n, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb, lapack_int *
    sdim, lapack_complex_float * alpha, lapack_complex_float * beta,
    lapack_complex_float * vsl, lapack_int ldvsl, lapack_complex_float *
    vsr, lapack_int ldvsr)

Definition at line 36 of file lapacke_cgges.c.

okay so this one is the full-glam version — you get the sort char and a selctg selector up in there, plus both vsl/vsr slots with their own ldvsl/ldvsr leading dims. It returns a lapack_int, like basically every single one of these, and it lives at line 36. 💅


🦋 LAPACKE_cgges3

lapack_int LAPACKE_cgges3 (int matrix_layout, char jobvsl, char jobvsr, char
    sort, LAPACK_C_SELECT2 selctg, lapack_int n, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb, lapack_int *
    sdim, lapack_complex_float * alpha, lapack_complex_float * beta,
    lapack_complex_float * vsl, lapack_int ldvsl, lapack_complex_float *
    vsr, lapack_int ldvsr)

Definition at line 36 of file lapacke_cgges3.c.

the way that this signature is identical to LAPACKE_cgges — same args, same order, same everything — but it's the 3 situation and it points at a whole different file. Yes bestie, they're twins. No, you may not merge them. 😭


✨ LAPACKE_cgges3_work

lapack_int LAPACKE_cgges3_work (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_C_SELECT2 selctg, lapack_int n, lapack_complex_float *
    a, lapack_int lda, lapack_complex_float * b, lapack_int ldb, lapack_int
    * sdim, lapack_complex_float * alpha, lapack_complex_float * beta,
    lapack_complex_float * vsl, lapack_int ldvsl, lapack_complex_float *
    vsr, lapack_int ldvsr, lapack_complex_float * work, lapack_int lwork,
    float * rwork, lapack_logical * bwork)

Definition at line 36 of file lapacke_cgges3_work.c.

the _work variant!! 🫶 Same crew as above, but now you're hand-delivering the scratch space: work + lwork, rwork, and bwork (that one's lapack_logical *, don't @ me). If you like controlling your own buffers, this is your main character era.


🎀 LAPACKE_cgges_work

lapack_int LAPACKE_cgges_work (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_C_SELECT2 selctg, lapack_int n, lapack_complex_float *
    a, lapack_int lda, lapack_complex_float * b, lapack_int ldb, lapack_int
    * sdim, lapack_complex_float * alpha, lapack_complex_float * beta,
    lapack_complex_float * vsl, lapack_int ldvsl, lapack_complex_float *
    vsr, lapack_int ldvsr, lapack_complex_float * work, lapack_int lwork,
    float * rwork, lapack_logical * bwork)

Definition at line 36 of file lapacke_cgges_work.c.

fr fr the non-3 _work sibling — argument list is character-for-character the same shape as LAPACKE_cgges3_work, tail and all: work, lwork, rwork, bwork. Two files, one aesthetic. 💀


🌈 LAPACKE_cggesx

lapack_int LAPACKE_cggesx (int matrix_layout, char jobvsl, char jobvsr, char
    sort, LAPACK_C_SELECT2 selctg, char sense, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * b,
    lapack_int ldb, lapack_int * sdim, lapack_complex_float * alpha,
    lapack_complex_float * beta, lapack_complex_float * vsl, lapack_int
    ldvsl, lapack_complex_float * vsr, lapack_int ldvsr, float * rconde,
    float * rcondv)

Definition at line 36 of file lapacke_cggesx.c.

Obsessed with the x — it brings a new bestie to the group chat: sense (a char, right after selctg), and it signs off with rconde and rcondv, both float *. Everything else is the familiar lineup. 👑


🔥 LAPACKE_cggesx_work

lapack_int LAPACKE_cggesx_work (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_C_SELECT2 selctg, char sense, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * b,
    lapack_int ldb, lapack_int * sdim, lapack_complex_float * alpha,
    lapack_complex_float * beta, lapack_complex_float * vsl, lapack_int
    ldvsl, lapack_complex_float * vsr, lapack_int ldvsr, float * rconde,
    float * rcondv, lapack_complex_float * work, lapack_int lwork, float *
    rwork, lapack_int * iwork, lapack_int liwork, lapack_logical * bwork)

Definition at line 36 of file lapacke_cggesx_work.c.

not me counting the trailing scratch args — work, lwork, rwork, then the integer duo iwork / liwork, then bwork. That's the longest tail in this little cluster and I respect the hustle. 🍓


💖 LAPACKE_cggev

lapack_int LAPACKE_cggev (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * alpha,
    lapack_complex_float * beta, lapack_complex_float * vl, lapack_int ldvl,
    lapack_complex_float * vr, lapack_int ldvr)

Definition at line 36 of file lapacke_cggev.c.

New family, new vibe check ✨ — no sort, no selctg, no sdim. Just jobvl/jobvr, n, the a/lda + b/ldb pair, then alpha, beta, and the vl/ldvl + vr/ldvr duo. Clean, simple, iconic.


🧚 LAPACKE_cggev3

lapack_int LAPACKE_cggev3 (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * alpha,
    lapack_complex_float * beta, lapack_complex_float * vl, lapack_int ldvl,
    lapack_complex_float * vr, lapack_int ldvr)

Definition at line 36 of file lapacke_cggev3.c.

Again with the matching signatures 😭 — LAPACKE_cggev3 mirrors LAPACKE_cggev exactly, but it's living its own life in lapacke_cggev3.c. Respect the separate file, she has her own identity.


🎀 LAPACKE_cggev3_work

lapack_int LAPACKE_cggev3_work (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * alpha,
    lapack_complex_float * beta, lapack_complex_float * vl, lapack_int ldvl,
    lapack_complex_float * vr, lapack_int ldvr, lapack_complex_float * work,
    lapack_int lwork, float * rwork)

Definition at line 36 of file lapacke_cggev3_work.c.

The _work glow-up 🌸: same thirteen args, then work, lwork, rwork tacked on the end. Note there's no bwork here — this family keeps the tail short and cute. 🦋


💅 LAPACKE_cggev_work

lapack_int LAPACKE_cggev_work (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * alpha,
    lapack_complex_float * beta, lapack_complex_float * vl, lapack_int ldvl,
    lapack_complex_float * vr, lapack_int ldvr, lapack_complex_float * work,
    lapack_int lwork, float * rwork)

Definition at line 36 of file lapacke_cggev_work.c.

Same shape as LAPACKE_cggev3_work, different file. iykyk — the pattern is the pattern and I'm at peace with it. 🫶


⭐ LAPACKE_cggevx

lapack_int LAPACKE_cggevx (int matrix_layout, char balanc, char jobvl, char
    jobvr, char sense, lapack_int n, lapack_complex_float * a, lapack_int
    lda, lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    alpha, lapack_complex_float * beta, lapack_complex_float * vl,
    lapack_int ldvl, lapack_complex_float * vr, lapack_int ldvr, lapack_int
    * ilo, lapack_int * ihi, float * lscale, float * rscale, float * abnrm,
    float * bbnrm, float * rconde, float * rcondv)

Definition at line 36 of file lapacke_cggevx.c.

the extended one ate 🌈 — leading chars balanc, jobvl, jobvr, sense, then n, then the matrix block, then a whole parade of outputs: ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv. That's a lot of pointers and every single one matters. 🔥


💀 LAPACKE_cggevx_work

lapack_int LAPACKE_cggevx_work (int matrix_layout, char balanc, char jobvl,
    char jobvr, char sense, lapack_int n, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * alpha, lapack_complex_float * beta,
    lapack_complex_float * vl, lapack_int ldvl, lapack_complex_float * vr,
    lapack_int ldvr, lapack_int * ilo, lapack_int * ihi, float * lscale,
    float * rscale, float * abnrm, float * bbnrm, float * rconde, float *
    rcondv, lapack_complex_float * work, lapack_int lwork, float * rwork,
    lapack_int * iwork, lapack_logical * bwork)

Definition at line 36 of file lapacke_cggevx_work.c.

Longest guest list in this batch, no cap 😭 — everything from LAPACKE_cggevx plus work, lwork, rwork, iwork, bwork. Do not lose track of which pointer is which, I'm begging. 🙈


🌸 LAPACKE_cggglm

lapack_int LAPACKE_cggglm (int matrix_layout, lapack_int n, lapack_int m,
    lapack_int p, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * d,
    lapack_complex_float * x, lapack_complex_float * y)

Definition at line 36 of file lapacke_cggglm.c.

hi bestie — three plain integer dims up front (n, m, p), then a/lda, b/ldb, then the trio d, x, y. No char options at all, which honestly? Kind of refreshing. 🍓


🦋 LAPACKE_cggglm_work

lapack_int LAPACKE_cggglm_work (int matrix_layout, lapack_int n, lapack_int
    m, lapack_int p, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * d,
    lapack_complex_float * x, lapack_complex_float * y, lapack_complex_float
    * work, lapack_int lwork)

Definition at line 36 of file lapacke_cggglm_work.c.

Just bolts work and lwork onto the end and calls it a day. Minimalist queen. 💅


🧚 LAPACKE_cgghd3

lapack_int LAPACKE_cgghd3 (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * q, lapack_int ldq, lapack_complex_float * z,
    lapack_int ldz)

Definition at line 36 of file lapacke_cgghd3.c.

Two char flags (compq, compz), three ints (n, ilo, ihi), then the matched pairs a/lda, b/ldb, q/ldq, z/ldz. Symmetry!! We love to see it. ✨


🎀 LAPACKE_cgghd3_work

lapack_int LAPACKE_cgghd3_work (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * q, lapack_int ldq, lapack_complex_float * z,
    lapack_int ldz, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cgghd3_work.c.

Same as LAPACKE_cgghd3 with work + lwork appended, and yes that's the entire diff. Slay. 🫶


🌈 LAPACKE_cgghrd

lapack_int LAPACKE_cgghrd (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * q, lapack_int ldq, lapack_complex_float * z,
    lapack_int ldz)

Definition at line 36 of file lapacke_cgghrd.c.

Signature identical to LAPACKE_cgghd3 — compq, compz, n, ilo, ihi, then a/lda, b/ldb, q/ldq, z/ldz. Two routines, twin energy, separate files. 😭


⭐ LAPACKE_cgghrd_work

lapack_int LAPACKE_cgghrd_work (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * q, lapack_int ldq, lapack_complex_float * z,
    lapack_int ldz)

Definition at line 36 of file lapacke_cgghrd_work.c.

Plot twist 🔥 — this _work version has no work/lwork args at all. The signature is exactly the same as the non-_work one. Don't ask me why, that's just what's written here. 💀


💖 LAPACKE_cgglse

lapack_int LAPACKE_cgglse (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int p, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * c,
    lapack_complex_float * d, lapack_complex_float * x)

Definition at line 36 of file lapacke_cgglse.c.

Note the order bestie: m, n, p — not n, m, p. read twice, code once 💅. Then a/lda, b/ldb, and the c, d, x trio.


🍓 LAPACKE_cgglse_work

lapack_int LAPACKE_cgglse_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int p, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * c,
    lapack_complex_float * d, lapack_complex_float * x, lapack_complex_float
    * work, lapack_int lwork)

Definition at line 36 of file lapacke_cgglse_work.c.

m, n, p again — same order, she's consistent — plus work and lwork at the end. 🦋


🧚 LAPACKE_cggqrf

lapack_int LAPACKE_cggqrf (int matrix_layout, lapack_int n, lapack_int m,
    lapack_int p, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * taua, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * taub)

Definition at line 36 of file lapacke_cggqrf.c.

And here it's n, m, p — opposite order from the lse one, I know, I know 😭. Then a/lda with taua, and b/ldb with taub. Tau besties, we stan.


🎀 LAPACKE_cggqrf_work

lapack_int LAPACKE_cggqrf_work (int matrix_layout, lapack_int n, lapack_int
    m, lapack_int p, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * taua, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * taub, lapack_complex_float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_cggqrf_work.c.

Adds work + lwork, keeps n, m, p and both taus intact. Nothing lost, nothing invented. 💜


🌸 LAPACKE_cggrqf

lapack_int LAPACKE_cggrqf (int matrix_layout, lapack_int m, lapack_int p,
    lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * taua, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * taub)

Definition at line 36 of file lapacke_cggrqf.c.

Careful now 👀 — this one's m, p, n. The rqf sibling flipped the trio again, so please don't muscle-memory your way through it. taua and taub are still right where you left them.


🦋 LAPACKE_cggrqf_work

lapack_int LAPACKE_cggrqf_work (int matrix_layout, lapack_int m, lapack_int
    p, lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * taua, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * taub, lapack_complex_float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_cggrqf_work.c.

m, p, n preserved ✨ plus work/lwork. That's the whole story, and it's a good one.


👑 LAPACKE_cggsvd

lapack_int LAPACKE_cggsvd (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * alpha, float * beta,
    lapack_complex_float * u, lapack_int ldu, lapack_complex_float * v,
    lapack_int ldv, lapack_complex_float * q, lapack_int ldq, lapack_int *
    iwork)

Definition at line 36 of file lapacke_cggsvd.c.

main character energy 🌈 — three job chars (jobu, jobv, jobq), the dims m, n, p, then pointers k and l (those are lapack_int *, watch out), then a/lda, b/ldb, alpha & beta as float *, then u/ldu, v/ldv, q/ldq, and finally iwork. A whole journey. 👑


💜 LAPACKE_cggsvd3

lapack_int LAPACKE_cggsvd3 (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * alpha, float * beta,
    lapack_complex_float * u, lapack_int ldu, lapack_complex_float * v,
    lapack_int ldv, lapack_complex_float * q, lapack_int ldq, lapack_int *
    iwork)

Definition at line 36 of file lapacke_cggsvd3.c.

Last one in this batch and it's a full-on twin of LAPACKE_cggsvd 🫶 — same arguments, same iwork ending, same everything, just living in lapacke_cggsvd3.c. Periodt. More coming, don't go anywhere 💖

LAPACKE_cggsvd3_work

lapack_int LAPACKE_cggsvd3_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * alpha, float * beta,
    lapack_complex_float * u, lapack_int ldu, lapack_complex_float * v,
    lapack_int ldv, lapack_complex_float * q, lapack_int ldq,
    lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int
    * iwork)

Definition at line 36 of file lapacke_cggsvd3_work.c.

okay bestie, this one is the full-workspace era ✨ — the _work version of the generalized SVD, so yes, you bring your own work, your own lwork, your own rwork, and your own iwork. Not me counting the pointers 💀. There's the jobu/jobv/jobq trio making their little appearance, m, n, p doing the dimension thing, and k and l sitting there as lapack_int * outputs. All the arrays are lapack_complex_float, all the strides are named ld + the array letter (lda, ldb, ldu, ldv, ldq) — the naming convention is literally carrying the whole family on its back 🫶.


LAPACKE_cggsvd_work

lapack_int LAPACKE_cggsvd_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * alpha, float * beta,
    lapack_complex_float * u, lapack_int ldu, lapack_complex_float * v,
    lapack_int ldv, lapack_complex_float * q, lapack_int ldq,
    lapack_complex_float * work, float * rwork, lapack_int * iwork)

Definition at line 36 of file lapacke_cggsvd_work.c.

And here's the older sibling 👑 — same squad of arguments as LAPACKE_cggsvd3_work right down the line, jobu, jobv, jobq, m, n, p, k, l, a/lda, b/ldb, alpha, beta, u/ldu, v/ldv, q/ldq, work, rwork, iwork — except there's no lwork in the signature here, bestie. It's giving "read the parameter list, it will tell you everything" 💅. Ngl the way these two are basically twins and the only way to tell them apart is the 3 is so iconic.


LAPACKE_cggsvp

lapack_int LAPACKE_cggsvp (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, lapack_complex_float *
    a, lapack_int lda, lapack_complex_float * b, lapack_int ldb, float tola,
    float tolb, lapack_int * k, lapack_int * l, lapack_complex_float * u,
    lapack_int ldu, lapack_complex_float * v, lapack_int ldv,
    lapack_complex_float * q, lapack_int ldq)

Definition at line 36 of file lapacke_cggsvp.c.

🎀 careful, the parameter order shifted on you: after jobq it's m, p, n — not m, n, p. The audacity 😭. You get tola and tolb as plain float tolerances (two of them, a and b, matching the two matrices a and b), plus k and l as lapack_int * outputs, and the triple u, v, q with ldu, ldv, ldq doing the stride duty. No _work in the name, so this is the pretty one you call directly — she's lowkey self-sufficient 💖.


LAPACKE_cggsvp3

lapack_int LAPACKE_cggsvp3 (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, lapack_complex_float *
    a, lapack_int lda, lapack_complex_float * b, lapack_int ldb, float tola,
    float tolb, lapack_int * k, lapack_int * l, lapack_complex_float * u,
    lapack_int ldu, lapack_complex_float * v, lapack_int ldv,
    lapack_complex_float * q, lapack_int ldq)

Definition at line 36 of file lapacke_cggsvp3.c.

The 3 girlie ✨ — and if you go line by line against LAPACKE_cggsvp, the signature is character-for-character the same catalogue of arguments: matrix_layout, jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola, tolb, k, l, u, ldu, v, ldv, q, ldq. The only thing that changed is the file and the name. Slay, honestly 🌸.


LAPACKE_cggsvp3_work

lapack_int LAPACKE_cggsvp3_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * b,
    lapack_int ldb, float tola, float tolb, lapack_int * k, lapack_int * l,
    lapack_complex_float * u, lapack_int ldu, lapack_complex_float * v,
    lapack_int ldv, lapack_complex_float * q, lapack_int ldq, lapack_int *
    iwork, float * rwork, lapack_complex_float * tau, lapack_complex_float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_cggsvp3_work.c.

and now we're in workspace central 🫶 — this one adds iwork, rwork, tau (yes, a lapack_complex_float * tau, she's back), work, and lwork on the tail end. Everything before that is the same m, p, n order as its non-working cousin, tola/tolb, k, l, and the u/v/q trio with their ld besties. Note the parameter order of iwork, rwork, tau, work, lwork — don't shuffle them, the compiler will not be nice about it 💀.


LAPACKE_cggsvp_work

lapack_int LAPACKE_cggsvp_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * b,
    lapack_int ldb, float tola, float tolb, lapack_int * k, lapack_int * l,
    lapack_complex_float * u, lapack_int ldu, lapack_complex_float * v,
    lapack_int ldv, lapack_complex_float * q, lapack_int ldq, lapack_int *
    iwork, float * rwork, lapack_complex_float * tau, lapack_complex_float *
    work)

Definition at line 36 of file lapacke_cggsvp_work.c.

Obsessed with the way this is the _work version WITHOUT lwork 👀 — read it, bestie, work is there at the end but lwork is not. So if you're pattern-matching from LAPACKE_cggsvp3_work, mind the difference fr fr. Same jobu/jobv/jobq head, same m, p, n, same tola/tolb, same k and l outputs, same u/ldu, v/ldv, q/ldq trio, then iwork, rwork, tau, work.


LAPACKE_cgtcon

lapack_int LAPACKE_cgtcon (char norm, lapack_int n, const
    lapack_complex_float * dl, const lapack_complex_float * d, const
    lapack_complex_float * du, const lapack_complex_float * du2, const
    lapack_int * ipiv, float anorm, float * rcond)

Definition at line 36 of file lapacke_cgtcon.c.

🎀 no matrix_layout here, which honestly feels like a little plot twist — this one starts straight in with norm (a char) and n. The tridiagonal gang is all present: dl, d, du, and the second superdiagonal du2, all const lapack_complex_float * (const and proud 🫶), plus a const lapack_int * ipiv for the pivots. You hand over anorm as a float and get float * rcond back. She's a condensation queen, and the consts mean she's not touching your arrays 💅.


LAPACKE_cgtcon_work

lapack_int LAPACKE_cgtcon_work (char norm, lapack_int n, const
    lapack_complex_float * dl, const lapack_complex_float * d, const
    lapack_complex_float * du, const lapack_complex_float * du2, const
    lapack_int * ipiv, float anorm, float * rcond, lapack_complex_float *
    work)

Definition at line 36 of file lapacke_cgtcon_work.c.

Same exact ride as LAPACKE_cgtcon bestie, except there's a lapack_complex_float * work tacked on the very end so you can bring your own scratch space ✨. Still no matrix_layout, still norm, n, dl, d, du, du2, ipiv, anorm, rcond. And still consts everywhere so she can't mess with your inputs 😌.


LAPACKE_cgtrfs

lapack_int LAPACKE_cgtrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * dl, const
    lapack_complex_float * d, const lapack_complex_float * du, const
    lapack_complex_float * dlf, const lapack_complex_float * df, const
    lapack_complex_float * duf, const lapack_complex_float * du2, const
    lapack_int * ipiv, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_cgtrfs.c.

Refinement time 🌈 — matrix_layout is back, then trans and n, then nrhs, then the full tridiagonal cast: dl, d, du, AND the factored dlf, df, duf, du2 (note: four factored args, in that order, don't get cute), plus const lapack_int * ipiv. The const squad covers the whole factor set and the RHS b (ldb), while x (ldx) is your mutable answer slot and ferr/berr are float * outputs. Not me counting the consts, it's twelve of them 😭.


LAPACKE_cgtrfs_work

lapack_int LAPACKE_cgtrfs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * dl, const
    lapack_complex_float * d, const lapack_complex_float * du, const
    lapack_complex_float * dlf, const lapack_complex_float * df, const
    lapack_complex_float * duf, const lapack_complex_float * du2, const
    lapack_int * ipiv, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * ferr, float * berr,
    lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cgtrfs_work.c.

Exactly the LAPACKE_cgtrfs lineup, then work and rwork get bolted on at the end 💖. Full order, because I love you: matrix_layout, trans, n, nrhs, dl, d, du, dlf, df, duf, du2, ipiv, b, ldb, x, ldx, ferr, berr, work, rwork. Note rwork is float * here even though everything tridiagonal is complex float — that's just how she rolls 🦋.


LAPACKE_cgtsv

lapack_int LAPACKE_cgtsv (int matrix_layout, lapack_int n, lapack_int nrhs,
    lapack_complex_float * dl, lapack_complex_float * d,
    lapack_complex_float * du, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cgtsv.c.

Short and sweet, we love a minimal icon 💅 — matrix_layout, n, nrhs, then the tridiagonal trio dl, d, du and the right-hand side b with ldb. All plain lapack_complex_float *, no consts, no workspace, no outputs beyond whatever happens to those arrays. Nine arguments, in, out, done. Periodt.


LAPACKE_cgtsv_work

lapack_int LAPACKE_cgtsv_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, lapack_complex_float * dl, lapack_complex_float * d,
    lapack_complex_float * du, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cgtsv_work.c.

The way this signature is literally identical to LAPACKE_cgtsv — same matrix_layout, n, nrhs, dl, d, du, b, ldb, nothing added, nothing removed 😭. Bestie, if you're looking for an extra work pointer, it's not in the parameter list. Just read the file name and trust her ✨.


LAPACKE_cgtsvx

lapack_int LAPACKE_cgtsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * dl, const
    lapack_complex_float * d, const lapack_complex_float * du,
    lapack_complex_float * dlf, lapack_complex_float * df,
    lapack_complex_float * duf, lapack_complex_float * du2, lapack_int *
    ipiv, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr,
    float * berr)

Definition at line 36 of file lapacke_cgtsvx.c.

The expert edition, and honestly she ate 🔥 — matrix_layout, fact and trans up front, n and nrhs, then the input trio dl, d, du as const, and the factored trio dlf, df, duf plus du2 as mutable, followed by ipiv (plain lapack_int * here, not const, I see you 👀). Then const b with ldb, the answer x with ldx, and three float * outputs: rcond, ferr, berr. Count those args, there's a lot of them 💀.


LAPACKE_cgtsvx_work

lapack_int LAPACKE_cgtsvx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * dl, const
    lapack_complex_float * d, const lapack_complex_float * du,
    lapack_complex_float * dlf, lapack_complex_float * df,
    lapack_complex_float * duf, lapack_complex_float * du2, lapack_int *
    ipiv, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr,
    float * berr, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cgtsvx_work.c.

Everything from LAPACKE_cgtsvx in the exact same order, and then — drumroll 🥁 — work and rwork at the end. That's it, that's the diff. matrix_layout, fact, trans, n, nrhs, dl, d, du, dlf, df, duf, du2, ipiv, b, ldb, x, ldx, rcond, ferr, berr, work, rwork. No lwork to be found, don't come for me, I'm just reading the manpage 🫶.


LAPACKE_cgttrf

lapack_int LAPACKE_cgttrf (lapack_int n, lapack_complex_float * dl,
    lapack_complex_float * d, lapack_complex_float * du,
    lapack_complex_float * du2, lapack_int * ipiv)

Definition at line 36 of file lapacke_cgttrf.c.

Shortest one on the block and she's thriving 💖 — no matrix_layout, no lwork, nothing but n, dl, d, du, du2, ipiv. Six arguments. The f at the end of the name stands for factor and she is NOT doing extra credit. All complex float except n and ipiv. Clean, minimal, iconic 🌸.


LAPACKE_cgttrf_work

lapack_int LAPACKE_cgttrf_work (lapack_int n, lapack_complex_float * dl,
    lapack_complex_float * d, lapack_complex_float * du,
    lapack_complex_float * du2, lapack_int * ipiv)

Definition at line 36 of file lapacke_cgttrf_work.c.

And the _work version is an exact copy of that parameter list — n, dl, d, du, du2, ipiv — no extra workspace pointer in sight 🙈. Cute that she kept the whole thing so tidy. Different file, same six arguments, and that is the entire tea ☕.


LAPACKE_cgttrs

lapack_int LAPACKE_cgttrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * dl, const
    lapack_complex_float * d, const lapack_complex_float * du, const
    lapack_complex_float * du2, const lapack_int * ipiv,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cgttrs.c.

Solve o'clock 🕐 — matrix_layout, trans, n, nrhs, then the factored tridiagonal squad all wearing const like little crowns (dl, d, du, du2, and a const lapack_int * ipiv), and finally the mutable b with its ldb. Notice du2 is in there because you're feeding her already-factored goods, and b is NOT const because she's writing your answer into it 💅.


LAPACKE_cgttrs_work

lapack_int LAPACKE_cgttrs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * dl, const
    lapack_complex_float * d, const lapack_complex_float * du, const
    lapack_complex_float * du2, const lapack_int * ipiv,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cgttrs_work.c.

Identical signature to LAPACKE_cgttrs, bestie — same matrix_layout, trans, n, nrhs, same four const complex arrays plus const ipiv, same b and ldb. No trailing work pointer, no lwork, nothing. The _work in the filename is doing all the heavy lifting here and honestly, respect 🫶.


LAPACKE_chbev

lapack_int LAPACKE_chbev (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_float * ab, lapack_int ldab,
    float * w, lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_chbev.c.

Eigen time, and she's giving standard algorithm energy 👑 — matrix_layout, jobz, uplo, n, kd, then your band storage ab with ldab, the eigenvalue output w as float * (computed in float even though the matrix is complex, yes, look at it), the eigenvector output z with ldz. Ten arguments, no workspace, straight to business. The kd is your bandwidth babe, it's right there in the list 🦋.


LAPACKE_chbev_2stage

lapack_int LAPACKE_chbev_2stage (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_float * ab, lapack_int ldab,
    float * w, lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_chbev_2stage.c.

Two-stage diva 🌟 — and check it, the signature is the exact same ten arguments as LAPACKE_chbev: matrix_layout, jobz, uplo, n, kd, ab, ldab, w, z, ldz. The _2stage is living entirely in the name and the file, not in the parameter list. Not me double-checking, I promise I did 😭.


LAPACKE_chbev_2stage_work

lapack_int LAPACKE_chbev_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, lapack_int kd, lapack_complex_float * ab, lapack_int
    ldab, float * w, lapack_complex_float * z, lapack_int ldz,
    lapack_complex_float * work, lapack_int lwork, float * rwork)

Definition at line 36 of file lapacke_chbev_2stage_work.c.

Now she brought her whole bag ✨ — the ten from before, plus work, lwork, and rwork at the end. So: matrix_layout, jobz, uplo, n, kd, ab, ldab, w, z, ldz, work, lwork, rwork. Thirteen arguments, and yes, lwork is finally here — the two-stage girlie needs her workspace budget 💅.


LAPACKE_chbev_work

lapack_int LAPACKE_chbev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_float * ab, lapack_int ldab,
    float * w, lapack_complex_float * z, lapack_int ldz,
    lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_chbev_work.c.

Careful bestie — compare this to LAPACKE_chbev_2stage_work and you'll spot it: this one has work and rwork but no lwork 👀. So the tail is ab, ldab, w, z, ldz, work, rwork. Same head as the main function: matrix_layout, jobz, uplo, n, kd. Don't assume the lwork is there just because it was there last time, fr fr, I'm looking out for you 🫶.


LAPACKE_chbevd

lapack_int LAPACKE_chbevd (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_float * ab, lapack_int ldab,
    float * w, lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_chbevd.c.

The d at the end means divide-and-conquer and she's a whole different vibe from chbev 🌈 — but the signature? Literally identical ten arguments: matrix_layout, jobz, uplo, n, kd, ab, ldab, w, z, ldz. Same inputs, different algorithm under the hood, and the manpage just shows you the front door. Take the free win 💖.


LAPACKE_chbevd_2stage

lapack_int LAPACKE_chbevd_2stage (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_float * ab, lapack_int ldab,
    float * w, lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_chbevd_2stage.c.

Divide-and-conquer plus two-stage, and she still kept the parameter list identical to LAPACKE_chbevd 🎀 — matrix_layout, jobz, uplo, n, kd, ab, ldab, w, z, ldz, ten for ten. The naming is doing some serious emotional labour in this family, and honestly it's working.


LAPACKE_chbevd_2stage_work

lapack_int LAPACKE_chbevd_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, lapack_int kd, lapack_complex_float * ab, lapack_int
    ldab, float * w, lapack_complex_float * z, lapack_int ldz,
    lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int
    lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_chbevd_2stage_work.c.

NOW we're talking workspace, she brought the entire entourage 😭💜 — after the usual matrix_layout, jobz, uplo, n, kd, ab, ldab, w, z, ldz, you get work, lwork, rwork, lrwork, iwork, liwork. That's three workspace buffers and three lengths, each length paired with its own buffer. Six extras. Don't mix up lrwork and liwork, bestie, they're a matching set and they will not forgive you 💀.


LAPACKE_chbevd_work

lapack_int LAPACKE_chbevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_float * ab, lapack_int ldab,
    float * w, lapack_complex_float * z, lapack_int ldz,
    lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int
    lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_chbevd_work.c.

Same full-workspace line-up as LAPACKE_chbevd_2stage_work, no shortcuts 🫶 — matrix_layout, jobz, uplo, n, kd, ab, ldab, w, z, ldz, work, lwork, rwork, lrwork, iwork, liwork. Sixteen arguments and every single one is pulling its weight. This is the version where you, the caller, are fully in charge of all the scratch space 💅.


LAPACKE_chbevx

lapack_int LAPACKE_chbevx (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, lapack_int kd, lapack_complex_float * ab, lapack_int
    ldab, lapack_complex_float * q, lapack_int ldq, float vl, float vu,
    lapack_int il, lapack_int iu, float abstol, lapack_int * m, float * w,
    lapack_complex_float * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_chbevx.c.

The expert one and she is THOROUGH 👑🔥 — matrix_layout, jobz, range, uplo, n, kd, ab, ldab, then a whole q/ldq pair, then vl, vu (your float value bounds), il, iu (your int index bounds), abstol, then outputs m (as lapack_int *, the count of found eigenvalues), w, z/ldz, and ifail as lapack_int *. Twenty arguments. Twenty. She's not minimal and she's not sorry 💖. Only one range char decides whether vl/vu or il/iu are the ones doing the work, and both sets are sitting right there in the signature.


LAPACKE_chbevx_2stage

lapack_int LAPACKE_chbevx_2stage (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_int kd, lapack_complex_float * ab,
    lapack_int ldab, lapack_complex_float * q, lapack_int ldq, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
    float * w, lapack_complex_float * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_chbevx_2stage.c.

And the two-stage remix keeps the exact same twenty-argument parade 🌟 — matrix_layout, jobz, range, uplo, n, kd, ab, ldab, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, ifail. Nothing added, nothing dropped, only the file name changed. Two-stage stays in the name only, and honestly? Iconic behaviour 💅✨.

🌸 LAPACKE_chbevx_2stage_work

lapack_int LAPACKE_chbevx_2stage_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int kd, lapack_complex_float *
    ab, lapack_int ldab, lapack_complex_float * q, lapack_int ldq, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
    float * w, lapack_complex_float * z, lapack_int ldz,
    lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int
    * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_chbevx_2stage_work.c.

Okay so this is the _2stage and _work combo version — the full-glow-up one 💅. It's got everything: matrix_layout, jobz, range, uplo, n, kd, the ab/ldab pair, q/ldq, vl, vu, il, iu, abstol, then the outputs — m, w, z/ldz — and the whole workspace entourage: work, lwork, rwork, iwork, ifail. That's a lot of arguments bestie, don't skip a single one 🫶.


✨ LAPACKE_chbevx_work

lapack_int LAPACKE_chbevx_work (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_int kd, lapack_complex_float * ab,
    lapack_int ldab, lapack_complex_float * q, lapack_int ldq, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
    float * w, lapack_complex_float * z, lapack_int ldz,
    lapack_complex_float * work, float * rwork, lapack_int * iwork,
    lapack_int * ifail)

Definition at line 36 of file lapacke_chbevx_work.c.

Same chbevx energy but the plain _work cut — note there's no lwork here, just work, rwork, iwork, ifail riding along. Iconic, lowkey different from its _2stage sibling 👑


🦋 LAPACKE_chbgst

lapack_int LAPACKE_chbgst (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float * ab,
    lapack_int ldab, const lapack_complex_float * bb, lapack_int ldbb,
    lapack_complex_float * x, lapack_int ldx)

Definition at line 36 of file lapacke_chbgst.c.

Ooh okay, vect and uplo up front, then n, ka, kb, and two band-storage pairs — ab/ldab and bb/ldbb (that one's const, periodt 🔒) — finishing with x and ldx. Clean, no workspace drama.


🎀 LAPACKE_chbgst_work

lapack_int LAPACKE_chbgst_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float * ab,
    lapack_int ldab, const lapack_complex_float * bb, lapack_int ldbb,
    lapack_complex_float * x, lapack_int ldx, lapack_complex_float * work,
    float * rwork)

Definition at line 36 of file lapacke_chbgst_work.c.

The _work twin 🫶 — literally the same argument parade as LAPACKE_chbgst, except it trails work (lapack_complex_float *) and rwork (float *) at the end, iykyk.


💜 LAPACKE_chbgv

lapack_int LAPACKE_chbgv (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float * ab,
    lapack_int ldab, lapack_complex_float * bb, lapack_int ldbb, float * w,
    lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_chbgv.c.

jobz, uplo, n, ka, kb, ab/ldab, bb/ldbb, w, z/ldz — that's the whole lineup 💖. Note bb is not const here, bestie, it's a plain lapack_complex_float *. Don't come for me, that's what the page says.


🌈 LAPACKE_chbgv_work

lapack_int LAPACKE_chbgv_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float * ab,
    lapack_int ldab, lapack_complex_float * bb, lapack_int ldbb, float * w,
    lapack_complex_float * z, lapack_int ldz, lapack_complex_float * work,
    float * rwork)

Definition at line 36 of file lapacke_chbgv_work.c.

Everything from LAPACKE_chbgv plus work and rwork tacked on the end — the workspace girlies have entered the chat ✨.


🔥 LAPACKE_chbgvd

lapack_int LAPACKE_chbgvd (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float * ab,
    lapack_int ldab, lapack_complex_float * bb, lapack_int ldbb, float * w,
    lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_chbgvd.c.

The d variant, serving the exact same signature as LAPACKE_chbgv, no cap 👑. jobz, uplo, n, ka, kb, ab/ldab, bb/ldbb, w, z/ldz.


💀 LAPACKE_chbgvd_work

lapack_int LAPACKE_chbgvd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float * ab,
    lapack_int ldab, lapack_complex_float * bb, lapack_int ldbb, float * w,
    lapack_complex_float * z, lapack_int ldz, lapack_complex_float * work,
    lapack_int lwork, float * rwork, lapack_int lrwork, lapack_int * iwork,
    lapack_int liwork)

Definition at line 36 of file lapacke_chbgvd_work.c.

Okay she's thriving — this one's got the deluxe workspace package: work/lwork, rwork/lrwork, AND iwork/liwork. Three int/float pairs, all matching, all needed. The way that's so satisfying 😭💅


🧚 LAPACKE_chbgvx

lapack_int LAPACKE_chbgvx (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_float *
    ab, lapack_int ldab, lapack_complex_float * bb, lapack_int ldbb,
    lapack_complex_float * q, lapack_int ldq, float vl, float vu, lapack_int
    il, lapack_int iu, float abstol, lapack_int * m, float * w,
    lapack_complex_float * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_chbgvx.c.

range and ifail have joined the party 🎉 — plus q/ldq, vl, vu, il, iu, abstol, m, w, z/ldz. Full cast, no understudies.


🍓 LAPACKE_chbgvx_work

lapack_int LAPACKE_chbgvx_work (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_int ka, lapack_int kb,
    lapack_complex_float * ab, lapack_int ldab, lapack_complex_float * bb,
    lapack_int ldbb, lapack_complex_float * q, lapack_int ldq, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
    float * w, lapack_complex_float * z, lapack_int ldz,
    lapack_complex_float * work, float * rwork, lapack_int * iwork,
    lapack_int * ifail)

Definition at line 36 of file lapacke_chbgvx_work.c.

Same as LAPACKE_chbgvx but with work, rwork and iwork snuck in right before ifail 🫶. No lwork, no lrwork, no liwork — literally just the three pointers, bestie.


🌸 LAPACKE_chbtrd

lapack_int LAPACKE_chbtrd (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_float * ab, lapack_int ldab,
    float * d, float * e, lapack_complex_float * q, lapack_int ldq)

Definition at line 36 of file lapacke_chbtrd.c.

Short and sweet: vect, uplo, n, kd, ab/ldab, then d, e, and the q/ldq pair. Ten args and not one of them extra 💖


⭐ LAPACKE_chbtrd_work

lapack_int LAPACKE_chbtrd_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_float * ab, lapack_int ldab,
    float * d, float * e, lapack_complex_float * q, lapack_int ldq,
    lapack_complex_float * work)

Definition at line 36 of file lapacke_chbtrd_work.c.

Exactly LAPACKE_chbtrd plus a single trailing lapack_complex_float * work — one little workspace crumb, that's all she needs 🎀


🦋 LAPACKE_checon

lapack_int LAPACKE_checon (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv, float
    anorm, float * rcond)

Definition at line 36 of file lapacke_checon.c.

Look at those consts 😌 — a and ipiv are read-only girlies, rcond is the output. Plus uplo, n, lda, and anorm. Chef's kiss.


💜 LAPACKE_checon_3

lapack_int LAPACKE_checon_3 (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * e, const lapack_int * ipiv, float anorm, float *
    rcond)

Definition at line 36 of file lapacke_checon_3.c.

The _3 version ✨ — it's LAPACKE_checon with an extra const lapack_complex_float * e slid in between lda and ipiv. That's the whole diff, fr fr.


🌈 LAPACKE_checon_3_work

lapack_int LAPACKE_checon_3_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * e, const lapack_int * ipiv, float anorm, float *
    rcond, lapack_complex_float * work)

Definition at line 36 of file lapacke_checon_3_work.c.

LAPACKE_checon_3 with lapack_complex_float * work appended at the very end. Conserve the consts, bestie, they're load-bearing 🫶


🔥 LAPACKE_checon_work

lapack_int LAPACKE_checon_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv,
    float anorm, float * rcond, lapack_complex_float * work)

Definition at line 36 of file lapacke_checon_work.c.

LAPACKE_checon + work. No e in this one — that's the _3 variant's whole personality, don't mix them up 💅


🧚 LAPACKE_cheequb

lapack_int LAPACKE_cheequb (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, float * s, float *
    scond, float * amax)

Definition at line 36 of file lapacke_cheequb.c.

Short one! uplo, n, a/lda (that a is const, periodt), then three float pointers out: s, scond, amax. Slay, minimal queen 💖


🎀 LAPACKE_cheequb_work

lapack_int LAPACKE_cheequb_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, float * s, float *
    scond, float * amax, lapack_complex_float * work)

Definition at line 36 of file lapacke_cheequb_work.c.

LAPACKE_cheequb plus work on the tail end. Same s/scond/amax trio, same const lapack_complex_float * a, all accounted for ✨


👑 LAPACKE_cheev

lapack_int LAPACKE_cheev (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda, float * w)

Definition at line 36 of file lapacke_cheev.c.

Okay this is the simple one and honestly? Main character energy 👑 — jobz, uplo, n, a/lda, and w. Seven args, zero workspace, she just shows up and does the thing.


🌟 LAPACKE_cheev_2stage

lapack_int LAPACKE_cheev_2stage (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda, float * w)

Definition at line 36 of file lapacke_cheev_2stage.c.

Two-stage remix, identical signature to LAPACKE_cheev 🫶. matrix_layout, jobz, uplo, n, a, lda, w — same seven, same order, different file.


💅 LAPACKE_cheev_2stage_work

lapack_int LAPACKE_cheev_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, lapack_complex_float * a, lapack_int lda, float * w,
    lapack_complex_float * work, lapack_int lwork, float * rwork)

Definition at line 36 of file lapacke_cheev_2stage_work.c.

Now she's got her workspace bag 💅 — work + lwork, and rwork (no lrwork though, keep up). Everything else is the same seven.


💖 LAPACKE_cheev_work

lapack_int LAPACKE_cheev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda, float * w,
    lapack_complex_float * work, lapack_int lwork, float * rwork)

Definition at line 36 of file lapacke_cheev_work.c.

Same ten args as the _2stage_work version — work, lwork, rwork, no lrwork, no iwork, not one of them extra. Twins fr fr 🌸


🦋 LAPACKE_cheevd

lapack_int LAPACKE_cheevd (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda, float * w)

Definition at line 36 of file lapacke_cheevd.c.

Back to the compact seven: matrix_layout, jobz, uplo, n, a, lda, w. Yes it's literally the same as LAPACKE_cheev — no she did not copy, it's a family resemblance, okay 😭


⭐ LAPACKE_cheevd_2stage

lapack_int LAPACKE_cheevd_2stage (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda, float * w)

Definition at line 36 of file lapacke_cheevd_2stage.c.

Yep, same seven again 🎀. matrix_layout, jobz, uplo, n, a, lda, w. The _2stage suffix is doing all the differentiating here, and honestly? Respect.


🔥 LAPACKE_cheevd_2stage_work

lapack_int LAPACKE_cheevd_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, lapack_complex_float * a, lapack_int lda, float * w,
    lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int
    lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_cheevd_2stage_work.c.

FULL workspace loadout, bestie 🔥 — work/lwork, rwork/lrwork, iwork/liwork. All three pairs present and accounted for. That's the deluxe d experience.


🌈 LAPACKE_cheevd_work

lapack_int LAPACKE_cheevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda, float * w,
    lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int
    lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_cheevd_work.c.

Identical lineup to LAPACKE_cheevd_2stage_work 💖 — thirteen args, three workspace pairs, zero surprises. We love consistency.


🧚 LAPACKE_cheevr

lapack_int LAPACKE_cheevr (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, lapack_complex_float * a, lapack_int lda, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
    float * w, lapack_complex_float * z, lapack_int ldz, lapack_int *
    isuppz)

Definition at line 36 of file lapacke_cheevr.c.

Now this is a guest list 🎉 — jobz, range, uplo, n, a/lda, vl, vu, il, iu, abstol, m, w, z/ldz, and isuppz closing it out. No ifail here, note — that's cheevx's thing, not hers.


🍓 LAPACKE_cheevr_2stage

lapack_int LAPACKE_cheevr_2stage (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_complex_float * a, lapack_int lda, float
    vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *
    m, float * w, lapack_complex_float * z, lapack_int ldz, lapack_int *
    isuppz)

Definition at line 36 of file lapacke_cheevr_2stage.c.

Same seventeen-ish args as LAPACKE_cheevr, just wearing the _2stage badge 🫶. isuppz is still the last one, still lapack_int *, still not const.


💀 LAPACKE_cheevr_2stage_work

lapack_int LAPACKE_cheevr_2stage_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_complex_float * a, lapack_int
    lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
    lapack_int * m, float * w, lapack_complex_float * z, lapack_int ldz,
    lapack_int * isuppz, lapack_complex_float * work, lapack_int lwork,
    float * rwork, lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_cheevr_2stage_work.c.

Longest one yet and it ate 😭 — the full cheevr cast PLUS work/lwork, rwork/lrwork, iwork/liwork piled on after isuppz. Keep the order, bestie, isuppz comes before work. Don't fumble it 💅


🎀 LAPACKE_cheevr_work

lapack_int LAPACKE_cheevr_work (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_complex_float * a, lapack_int lda, float
    vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *
    m, float * w, lapack_complex_float * z, lapack_int ldz, lapack_int *
    isuppz, lapack_complex_float * work, lapack_int lwork, float * rwork,
    lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_cheevr_work.c.

Same monster signature as the _2stage_work sibling, different file name ✨. Three workspace pairs, isuppz sitting right before work, everything in its place. Iconic.


🌸 LAPACKE_cheevx

lapack_int LAPACKE_cheevx (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, lapack_complex_float * a, lapack_int lda, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
    float * w, lapack_complex_float * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_cheevx.c.

The x version brings ifail instead of isuppz 🔍 — everything else matches the cheevr lineup: jobz, range, uplo, n, a/lda, vl, vu, il, iu, abstol, m, w, z/ldz.


👑 LAPACKE_cheevx_2stage

lapack_int LAPACKE_cheevx_2stage (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_complex_float * a, lapack_int lda, float
    vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *
    m, float * w, lapack_complex_float * z, lapack_int ldz, lapack_int *
    ifail)

Definition at line 36 of file lapacke_cheevx_2stage.c.

Same as LAPACKE_cheevx, _2stage edition 💖. ifail still last, still lapack_int *. She kept the whole squad.


🦋 LAPACKE_cheevx_2stage_work

lapack_int LAPACKE_cheevx_2stage_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_complex_float * a, lapack_int
    lda, float vl, float vu, lapack_int il, lapack_int iu, float abstol,
    lapack_int * m, float * w, lapack_complex_float * z, lapack_int ldz,
    lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int
    * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_cheevx_2stage_work.c.

And the finale, bestie 🎬 — the x cast plus work/lwork, rwork, iwork, and ifail after all the workspace. Note there's no lrwork or liwork here, just the bare rwork and iwork pointers. Read it twice, it's long 😭👑

LAPACKE_cheevx_work 🦋

lapack_int LAPACKE_cheevx_work (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_complex_float * a, lapack_int lda, float
    vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *
    m, float * w, lapack_complex_float * z, lapack_int ldz,
    lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int
    * iwork, lapack_int * ifail)

Ok so this one has the whole friend group in the parameter list — jobz, range, uplo, vl, vu, il, iu, abstol, the works. She's defined at line 36 of lapacke_cheevx_work.c, bestie 💅


LAPACKE_chegst

lapack_int LAPACKE_chegst (int matrix_layout, lapack_int itype, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * b, lapack_int ldb)

Look at that const on b — she respects your data, periodt. Defined at line 36 of lapacke_chegst.c 🎀


LAPACKE_chegst_work

lapack_int LAPACKE_chegst_work (int matrix_layout, lapack_int itype, char
    uplo, lapack_int n, lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * b, lapack_int ldb)

The _work twin of the one above — same cast, same energy, different file. Defined at line 36 of lapacke_chegst_work.c ✨


LAPACKE_chegv

lapack_int LAPACKE_chegv (int matrix_layout, lapack_int itype, char jobz,
    char uplo, lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * w)

Nine args, not a single const in sight, living her best life. Defined at line 36 of lapacke_chegv.c 🔥


LAPACKE_chegv_2stage

lapack_int LAPACKE_chegv_2stage (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * w)

Same signature as LAPACKE_chegv, but she's got two stages in the name — main character energy fr. Defined at line 36 of lapacke_chegv_2stage.c 👑


LAPACKE_chegv_2stage_work

lapack_int LAPACKE_chegv_2stage_work (int matrix_layout, lapack_int itype,
    char jobz, char uplo, lapack_int n, lapack_complex_float * a, lapack_int
    lda, lapack_complex_float * b, lapack_int ldb, float * w,
    lapack_complex_float * work, lapack_int lwork, float * rwork)

Two-stage and _work?? That's a double commitment and honestly we stan. Note the extra work, lwork and rwork at the end. Defined at line 36 of lapacke_chegv_2stage_work.c 🫶


LAPACKE_chegv_work

lapack_int LAPACKE_chegv_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * w,
    lapack_complex_float * work, lapack_int lwork, float * rwork)

The classic _work version — hands you the workspace (work, lwork, rwork) so nothing gets allocated behind your back. Defined at line 36 of lapacke_chegv_work.c 💜


LAPACKE_chegvd

lapack_int LAPACKE_chegvd (int matrix_layout, lapack_int itype, char jobz,
    char uplo, lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * w)

That extra d at the end is doing a lot of heavy lifting, iykyk. Defined at line 36 of lapacke_chegvd.c ⭐


LAPACKE_chegvd_work

lapack_int LAPACKE_chegvd_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float * w,
    lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int
    lrwork, lapack_int * iwork, lapack_int liwork)

Okay this one brought everything: work, lwork, rwork, lrwork, iwork, liwork. A whole luggage set 😭 Defined at line 36 of lapacke_chegvd_work.c 🌸


LAPACKE_chegvx

lapack_int LAPACKE_chegvx (int matrix_layout, lapack_int itype, char jobz,
    char range, char uplo, lapack_int n, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
    float * w, lapack_complex_float * z, lapack_int ldz, lapack_int * ifail)

Not just abstol but also vl, vu, il, iu, plus z, ldz and ifail — she's extra in the best way. Defined at line 36 of lapacke_chegvx.c 💖


LAPACKE_chegvx_work

lapack_int LAPACKE_chegvx_work (int matrix_layout, lapack_int itype, char
    jobz, char range, char uplo, lapack_int n, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
    float * w, lapack_complex_float * z, lapack_int ldz,
    lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int
    * iwork, lapack_int * ifail)

Everything from LAPACKE_chegvx plus work, lwork, rwork and iwork tacked on the end. She said "and one more thing" four times 😅 Defined at line 36 of lapacke_chegvx_work.c 🧚


LAPACKE_cherfs

lapack_int LAPACKE_cherfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * af, lapack_int ldaf, const lapack_int * ipiv,
    const lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    x, lapack_int ldx, float * ferr, float * berr)

Count the consts bestie — a, af, ipiv, b are all protected. Only x, ferr and berr are allowed to change, as a treat. Defined at line 36 of lapacke_cherfs.c 🍓


LAPACKE_cherfs_work

lapack_int LAPACKE_cherfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * af, lapack_int ldaf, const lapack_int * ipiv,
    const lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    x, lapack_int ldx, float * ferr, float * berr, lapack_complex_float *
    work, float * rwork)

Exactly the LAPACKE_cherfs cast with work and rwork appended, because even the refined girlies need a scratchpad. Defined at line 36 of lapacke_cherfs_work.c 💫


LAPACKE_cherfsx

lapack_int LAPACKE_cherfsx (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * af, lapack_int ldaf, const
    lapack_int * ipiv, const float * s, const lapack_complex_float * b,
    lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * rcond,
    float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float *
    err_bnds_comp, lapack_int nparams, float * params)

The x version came to slay: equed, s, rcond, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. She's thorough and we love her for it 🔥 Defined at line 36 of lapacke_cherfsx.c 🌈


LAPACKE_cherfsx_work

lapack_int LAPACKE_cherfsx_work (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * af, lapack_int ldaf, const
    lapack_int * ipiv, const float * s, const lapack_complex_float * b,
    lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * rcond,
    float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float *
    err_bnds_comp, lapack_int nparams, float * params, lapack_complex_float
    * work, float * rwork)

Same as above but she brought work and rwork too. At this point the parameter list is a whole group chat 😭 Defined at line 36 of lapacke_cherfsx_work.c 💀


LAPACKE_chesv

lapack_int LAPACKE_chesv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda, lapack_int *
    ipiv, lapack_complex_float * b, lapack_int ldb)

Short, sweet, nine args, ipiv right in the middle where she belongs. Defined at line 36 of lapacke_chesv.c 💅


LAPACKE_chesv_aa

lapack_int LAPACKE_chesv_aa (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda, lapack_int *
    ipiv, lapack_complex_float * b, lapack_int ldb)

Same signature as plain LAPACKE_chesv, but the _aa suffix is giving "she went to a different school, you wouldn't know her". Defined at line 36 of lapacke_chesv_aa.c 🎀


LAPACKE_chesv_aa_2stage

lapack_int LAPACKE_chesv_aa_2stage (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2, lapack_complex_float * b, lapack_int ldb)

Two pivots (ipiv and ipiv2), a tb with her own ltb, and a two-stage name. Overachiever behavior ngl. Defined at line 36 of lapacke_chesv_aa_2stage.c 👑


LAPACKE_chesv_aa_2stage_work

lapack_int LAPACKE_chesv_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2, lapack_complex_float * b, lapack_int ldb, lapack_complex_float
    * work, lapack_int lwork)

Everything from LAPACKE_chesv_aa_2stage plus work and lwork. She ran out of suffix room and just kept typing. Defined at line 36 of lapacke_chesv_aa_2stage_work.c 😭


LAPACKE_chesv_aa_work

lapack_int LAPACKE_chesv_aa_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda, lapack_int
    * ipiv, lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    work, lapack_int lwork)

The _aa version but with her little work/lwork duo along for the ride. Defined at line 36 of lapacke_chesv_aa_work.c 🌸


LAPACKE_chesv_rk

lapack_int LAPACKE_chesv_rk (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * e, lapack_int * ipiv, lapack_complex_float * b,
    lapack_int ldb)

She's got an e parameter wedged between lda and ipiv — different girl, different routine. Defined at line 36 of lapacke_chesv_rk.c 🦋


LAPACKE_chesv_rk_work

lapack_int LAPACKE_chesv_rk_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * e, lapack_int * ipiv, lapack_complex_float * b,
    lapack_int ldb, lapack_complex_float * work, lapack_int lwork)

LAPACKE_chesv_rk with work and lwork bolted on the end, obviously. Defined at line 36 of lapacke_chesv_rk_work.c ⭐


LAPACKE_chesv_work

lapack_int LAPACKE_chesv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda, lapack_int *
    ipiv, lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    work, lapack_int lwork)

Plain LAPACKE_chesv plus the workspace handoff. Reliable, lowkey iconic. Defined at line 36 of lapacke_chesv_work.c ✨


LAPACKE_chesvx

lapack_int LAPACKE_chesvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * af, lapack_int ldaf, lapack_int *
    ipiv, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr,
    float * berr)

Note she starts with fact instead of jumping straight to uplo — and a and b are const while af, ipiv, x, rcond, ferr and berr are not. Defined at line 36 of lapacke_chesvx.c 💜


LAPACKE_chesvx_work

lapack_int LAPACKE_chesvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * af, lapack_int ldaf, lapack_int *
    ipiv, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr,
    float * berr, lapack_complex_float * work, lapack_int lwork, float *
    rwork)

Same energy, plus work, lwork, rwork. She remembered everything, fr fr. Defined at line 36 of lapacke_chesvx_work.c 🫶


LAPACKE_chesvxx

lapack_int LAPACKE_chesvxx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, lapack_int * ipiv, char *
    equed, float * s, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * rpvgrw,
    float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float *
    err_bnds_comp, lapack_int nparams, float * params)

Double x, double trouble. Heads up: here a and b are not const (unlike LAPACKE_chesvx), and she's got equed, s, rpvgrw, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params in the mix. Defined at line 36 of lapacke_chesvxx.c 🌈


LAPACKE_chesvxx_work

lapack_int LAPACKE_chesvxx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, lapack_int * ipiv, char *
    equed, float * s, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * rpvgrw,
    float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float *
    err_bnds_comp, lapack_int nparams, float * params, lapack_complex_float
    * work, float * rwork)

The full LAPACKE_chesvxx lineup with work and rwork added — she's the longest guest list at this party, no cap. Defined at line 36 of lapacke_chesvxx_work.c 💀


LAPACKE_cheswapr

lapack_int LAPACKE_cheswapr (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int i1, lapack_int i2)

i1 and i2 sitting at the end like two besties holding hands. Defined at line 36 of lapacke_cheswapr.c 🎀


LAPACKE_cheswapr_work

lapack_int LAPACKE_cheswapr_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_int i1, lapack_int
    i2)

Identical signature to LAPACKE_cheswapr, separate file, separate moment. Defined at line 36 of lapacke_cheswapr_work.c 🧚


LAPACKE_chetrd

lapack_int LAPACKE_chetrd (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, float * d, float * e,
    lapack_complex_float * tau)

Eight args and a tau at the end — cute name, big responsibility. Defined at line 36 of lapacke_chetrd.c 💖


LAPACKE_chetrd_work

lapack_int LAPACKE_chetrd_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, float * d, float * e,
    lapack_complex_float * tau, lapack_complex_float * work, lapack_int
    lwork)

d, e, tau, then work and lwork — she packs light but she packs right. Defined at line 36 of lapacke_chetrd_work.c 🌸


LAPACKE_chetrf

lapack_int LAPACKE_chetrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Just six parameters and an ipiv, minimalism era. Defined at line 36 of lapacke_chetrf.c ⭐

LAPACKE_chetrf_aa 🦋

lapack_int LAPACKE_chetrf_aa (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_chetrf_aa.c.


LAPACKE_chetrf_aa_2stage 💅

lapack_int LAPACKE_chetrf_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2)

Definition at line 36 of file lapacke_chetrf_aa_2stage.c.

Ok bestie the _2stage girlies brought extra luggage — tb, ltb and a whole second pivot array ipiv2 — and honestly? iconic.


LAPACKE_chetrf_aa_2stage_work ✨

lapack_int LAPACKE_chetrf_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_chetrf_aa_2stage_work.c.


LAPACKE_chetrf_aa_work 🎀

lapack_int LAPACKE_chetrf_aa_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_int * ipiv,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_chetrf_aa_work.c.


LAPACKE_chetrf_rk 🌸

lapack_int LAPACKE_chetrf_rk (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * e,
    lapack_int * ipiv)

Definition at line 36 of file lapacke_chetrf_rk.c.


LAPACKE_chetrf_rk_work 💜

lapack_int LAPACKE_chetrf_rk_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * e,
    lapack_int * ipiv, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_chetrf_rk_work.c.


LAPACKE_chetrf_rook 🔥

lapack_int LAPACKE_chetrf_rook (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_chetrf_rook.c.


LAPACKE_chetrf_rook_work ⭐

lapack_int LAPACKE_chetrf_rook_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda, lapack_int *
    ipiv, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_chetrf_rook_work.c.


LAPACKE_chetrf_work 🫶

lapack_int LAPACKE_chetrf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_chetrf_work.c.


LAPACKE_chetri 👑

lapack_int LAPACKE_chetri (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv)

Definition at line 36 of file lapacke_chetri.c.

Notice ipiv went const here — she's just reading her pivots, not rewriting them, we love a boundary-setting queen 💅


LAPACKE_chetri2 🌈

lapack_int LAPACKE_chetri2 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv)

Definition at line 36 of file lapacke_chetri2.c.


LAPACKE_chetri2_work 🦋

lapack_int LAPACKE_chetri2_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_chetri2_work.c.


LAPACKE_chetri2x 💀

lapack_int LAPACKE_chetri2x (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv,
    lapack_int nb)

Definition at line 36 of file lapacke_chetri2x.c.

The x version slides in an nb argument — no lwork in sight on this one, that's her whole vibe.


LAPACKE_chetri2x_work 🌸

lapack_int LAPACKE_chetri2x_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv,
    lapack_complex_float * work, lapack_int nb)

Definition at line 36 of file lapacke_chetri2x_work.c.

Careful bestie — here nb is the last argument, after work. Not lwork. nb. Don't mix them up, I'm begging 🙈


LAPACKE_chetri_3 ✨

lapack_int LAPACKE_chetri_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_complex_float *
    e, const lapack_int * ipiv)

Definition at line 36 of file lapacke_chetri_3.c.


LAPACKE_chetri_3_work 🎀

lapack_int LAPACKE_chetri_3_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float * a, lapack_int lda, const lapack_complex_float
    * e, const lapack_int * ipiv, lapack_complex_float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_chetri_3_work.c.


LAPACKE_chetri_work 💜

lapack_int LAPACKE_chetri_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv,
    lapack_complex_float * work)

Definition at line 36 of file lapacke_chetri_work.c.

Double-check before you @ me: this _work one takes work but no lwork. That's not a typo on my end, that's genuinely what's written 🫶


LAPACKE_chetrs 🌈

lapack_int LAPACKE_chetrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chetrs.c.


LAPACKE_chetrs2 ⭐

lapack_int LAPACKE_chetrs2 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chetrs2.c.


LAPACKE_chetrs2_work 🔥

lapack_int LAPACKE_chetrs2_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * work)

Definition at line 36 of file lapacke_chetrs2_work.c.

Again — work shows up, lwork does not. Read the signature, bestie, it's all right there 🌸


LAPACKE_chetrs_3 🦋

lapack_int LAPACKE_chetrs_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * e, const lapack_int * ipiv, lapack_complex_float
    * b, lapack_int ldb)

Definition at line 36 of file lapacke_chetrs_3.c.


LAPACKE_chetrs_3_work 💅

lapack_int LAPACKE_chetrs_3_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_float * a, lapack_int lda,
    const lapack_complex_float * e, const lapack_int * ipiv,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chetrs_3_work.c.


LAPACKE_chetrs_aa 🎀

lapack_int LAPACKE_chetrs_aa (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chetrs_aa.c.


LAPACKE_chetrs_aa_2stage 👑

lapack_int LAPACKE_chetrs_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chetrs_aa_2stage.c.

Note the non-const-ness of a, tb, ipiv and ipiv2 here — that's different from plain chetrs_aa, and yes, it matters. Copy the signature exactly, do not freelance ✨


LAPACKE_chetrs_aa_2stage_work 💜

lapack_int LAPACKE_chetrs_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chetrs_aa_2stage_work.c.


LAPACKE_chetrs_aa_work 🌸

lapack_int LAPACKE_chetrs_aa_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_float * a, lapack_int lda,
    const lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_chetrs_aa_work.c.

Here lwork is present. Yes, the family is inconsistent, no, we do not get to fix it, we just deal 😭


LAPACKE_chetrs_rook 🔥

lapack_int LAPACKE_chetrs_rook (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chetrs_rook.c.


LAPACKE_chetrs_rook_work ⭐

lapack_int LAPACKE_chetrs_rook_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, const lapack_int * ipiv, lapack_complex_float * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_chetrs_rook_work.c.


LAPACKE_chetrs_work 🫶

lapack_int LAPACKE_chetrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chetrs_work.c.


LAPACKE_chfrk 🌈

lapack_int LAPACKE_chfrk (int matrix_layout, char transr, char uplo, char
    trans, lapack_int n, lapack_int k, float alpha, const
    lapack_complex_float * a, lapack_int lda, float beta,
    lapack_complex_float * c)

Definition at line 36 of file lapacke_chfrk.c.

Three separate char args here — transr, uplo, trans — plus two float scalars alpha and beta. Count them. Don't shuffle them. I'm serious 💅


LAPACKE_chfrk_work 🦋

lapack_int LAPACKE_chfrk_work (int matrix_layout, char transr, char uplo,
    char trans, lapack_int n, lapack_int k, float alpha, const
    lapack_complex_float * a, lapack_int lda, float beta,
    lapack_complex_float * c)

Definition at line 36 of file lapacke_chfrk_work.c.


LAPACKE_chgeqz 👑

lapack_int LAPACKE_chgeqz (int matrix_layout, char job, char compq, char
    compz, lapack_int n, lapack_int ilo, lapack_int ihi,
    lapack_complex_float * h, lapack_int ldh, lapack_complex_float * t,
    lapack_int ldt, lapack_complex_float * alpha, lapack_complex_float *
    beta, lapack_complex_float * q, lapack_int ldq, lapack_complex_float *
    z, lapack_int ldz)

Definition at line 36 of file lapacke_chgeqz.c.

This one has it all: three mode chars (job, compq, compz), the ilo/ihi pair, both h and t, both q and z, and every one of them gets their own leading dimension. Main character energy fr fr 🌟


LAPACKE_chgeqz_work 🔥

lapack_int LAPACKE_chgeqz_work (int matrix_layout, char job, char compq,
    char compz, lapack_int n, lapack_int ilo, lapack_int ihi,
    lapack_complex_float * h, lapack_int ldh, lapack_complex_float * t,
    lapack_int ldt, lapack_complex_float * alpha, lapack_complex_float *
    beta, lapack_complex_float * q, lapack_int ldq, lapack_complex_float *
    z, lapack_int ldz, lapack_complex_float * work, lapack_int lwork, float
    * rwork)

Definition at line 36 of file lapacke_chgeqz_work.c.

Heads up — rwork here is float *, not complex, and it's the final argument. Yes, after lwork. Write it in order, bestie 😭


LAPACKE_chpcon 🎀

lapack_int LAPACKE_chpcon (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_float * ap, const lapack_int * ipiv, float anorm, float *
    rcond)

Definition at line 36 of file lapacke_chpcon.c.

Packed storage ap, a real anorm going in, and a rcond pointer coming back out. Note who's const and who isn't 🫶


LAPACKE_chpcon_work 💜

lapack_int LAPACKE_chpcon_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * ap, const lapack_int * ipiv, float anorm,
    float * rcond, lapack_complex_float * work)

Definition at line 36 of file lapacke_chpcon_work.c.

Just work. No lwork. I know. I know. 🌸


LAPACKE_chpev ✨

lapack_int LAPACKE_chpev (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_float * ap, float * w, lapack_complex_float
    * z, lapack_int ldz)

Definition at line 36 of file lapacke_chpev.c.


LAPACKE_chpev_work ⭐

lapack_int LAPACKE_chpev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_float * ap, float * w, lapack_complex_float
    * z, lapack_int ldz, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_chpev_work.c.


LAPACKE_chpevd 🦋

lapack_int LAPACKE_chpevd (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_float * ap, float * w, lapack_complex_float
    * z, lapack_int ldz)

Definition at line 36 of file lapacke_chpevd.c.


LAPACKE_chpevd_work 💅

lapack_int LAPACKE_chpevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_float * ap, float * w, lapack_complex_float
    * z, lapack_int ldz, lapack_complex_float * work, lapack_int lwork,
    float * rwork, lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_chpevd_work.c.

Ok this is the fully-loaded one: work/lwork, rwork/lrwork, and iwork/liwork. Three scratch families, all paired up. The way she ate that argument list 👑🔥


LAPACKE_chpevx 🌈

lapack_int LAPACKE_chpevx (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, lapack_complex_float * ap, float vl, float vu,
    lapack_int il, lapack_int iu, float abstol, lapack_int * m, float * w,
    lapack_complex_float * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_chpevx.c.

Four chars in a row — jobz, range, uplo — wait, that's three chars then uplo is the third, sorry, three: jobz, range, uplo. Then the range bounds vl/vu and il/iu, a real abstol, an output count m, and ifail at the very end. Keep m and ifail as pointers, they're both outputs, don't you dare dereference them in the call 🎀


LAPACKE_chpevx_work

lapack_int LAPACKE_chpevx_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_float * ap, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m, float * w, lapack_complex_float * z, lapack_int ldz, lapack_complex_float * work, float * rwork, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_chpevx_work.c.

okay this one is long — nineteen arguments bestie, count 'em, I'll wait 💅 note the _work energy: you're bringing your own work, rwork, iwork AND ifail to the function. very "I brought snacks for everyone" of you 🫶


LAPACKE_chpgst

lapack_int LAPACKE_chpgst (int matrix_layout, lapack_int itype, char uplo, lapack_int n, lapack_complex_float * ap, const lapack_complex_float * bp)

Definition at line 36 of file lapacke_chpgst.c.

ap is getting rewritten and bp is const so hands off 🫳✨ the itype is a lapack_int here, not a char, don't get it twisted.


LAPACKE_chpgst_work

lapack_int LAPACKE_chpgst_work (int matrix_layout, lapack_int itype, char uplo, lapack_int n, lapack_complex_float * ap, const lapack_complex_float * bp)

Definition at line 36 of file lapacke_chpgst_work.c.

same lineup as its sibling fr fr, just the _work twin. no extra hidden args, we love a consistent icon 👑


LAPACKE_chpgv

lapack_int LAPACKE_chpgv (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_float * ap, lapack_complex_float * bp, float * w, lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_chpgv.c.

two chars of personality (jobz, uplo), one itype, and the rest is the party. note w is float * while the matrices are lapack_complex_float — that's not a typo, that's just how she is 💖


LAPACKE_chpgv_work

lapack_int LAPACKE_chpgv_work (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_float * ap, lapack_complex_float * bp, float * w, lapack_complex_float * z, lapack_int ldz, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_chpgv_work.c.

the _work version said "and I'll also take a work and an rwork, thanks" 🎀 two extra args, zero extra shame.


LAPACKE_chpgvd

lapack_int LAPACKE_chpgvd (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_float * ap, lapack_complex_float * bp, float * w, lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_chpgvd.c.

look at that — identical arg list to LAPACKE_chpgv, only the name changed (there's a d on the end, iykyk 👀). the _work one is where the size args come out to play.


LAPACKE_chpgvd_work

lapack_int LAPACKE_chpgvd_work (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_float * ap, lapack_complex_float * bp, float * w, lapack_complex_float * z, lapack_int ldz, lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_chpgvd_work.c.

the whole workspace gang showed up 🌈 work/lwork, rwork/lrwork, iwork/liwork — every buffer got a plus-one and honestly? iconic.


LAPACKE_chpgvx

lapack_int LAPACKE_chpgvx (int matrix_layout, lapack_int itype, char jobz, char range, char uplo, lapack_int n, lapack_complex_float * ap, lapack_complex_float * bp, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m, float * w, lapack_complex_float * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_chpgvx.c.

three chars in a trench coat (jobz, range, uplo) plus vl, vu, il, iu, abstol — the whole "which eigenvalues tho" squad is here 💀 and m + ifail are outputs so they're pointers, obviously.


LAPACKE_chpgvx_work

lapack_int LAPACKE_chpgvx_work (int matrix_layout, lapack_int itype, char jobz, char range, char uplo, lapack_int n, lapack_complex_float * ap, lapack_complex_float * bp, float vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m, float * w, lapack_complex_float * z, lapack_int ldz, lapack_complex_float * work, float * rwork, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_chpgvx_work.c.

same as above but now you're also carrying work, rwork, and iwork. twenty-two arguments — she ate and left no crumbs, and also left no room on your line 💅


LAPACKE_chprfs

lapack_int LAPACKE_chprfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float * ap, const lapack_complex_float * afp, const lapack_int * ipiv, const lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_chprfs.c.

count the consts bestie 🔍 ap, afp, ipiv, and b are all read-only vibes; x, ferr, and berr are the ones getting written. respect the boundaries 🫶


LAPACKE_chprfs_work

lapack_int LAPACKE_chprfs_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float * ap, const lapack_complex_float * afp, const lapack_int * ipiv, const lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * ferr, float * berr, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_chprfs_work.c.

same cast, plus work and rwork tagging along at the end like the last two friends to get in the car 😭


LAPACKE_chpsv

lapack_int LAPACKE_chpsv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float * ap, lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chpsv.c.

short, sweet, no const anywhere — everything here is fair game to be rewritten ✨ note ipiv is lapack_int *, that's the pivot situation, we love a pivot.


LAPACKE_chpsv_work

lapack_int LAPACKE_chpsv_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_float * ap, lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chpsv_work.c.

yes queen, the _work variant has the literal same parameter list as the non-_work one. no cap. read it twice if you must 👑🔍


LAPACKE_chpsvx

lapack_int LAPACKE_chpsvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float * ap, lapack_complex_float * afp, lapack_int * ipiv, const lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr, float * berr)

Definition at line 36 of file lapacke_chpsvx.c.

fact is a char not a boolean, don't @ me 💀 ap and b are const, afp/ipiv/x are not, and rcond, ferr, berr are all float * outputs. the vibes are immaculate and the const-ness is very deliberate.


LAPACKE_chpsvx_work

lapack_int LAPACKE_chpsvx_work (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float * ap, lapack_complex_float * afp, lapack_int * ipiv, const lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr, float * berr, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_chpsvx_work.c.

everything from LAPACKE_chpsvx plus work and rwork 🎀 she's the same girl, she just brought her own memory.


LAPACKE_chptrd

lapack_int LAPACKE_chptrd (int matrix_layout, char uplo, lapack_int n, lapack_complex_float * ap, float * d, float * e, lapack_complex_float * tau)

Definition at line 36 of file lapacke_chptrd.c.

the little trio at the end — d, e, tau — where d and e are float * but tau is lapack_complex_float *. one of these things is not like the others 🦋


LAPACKE_chptrd_work

lapack_int LAPACKE_chptrd_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_float * ap, float * d, float * e, lapack_complex_float * tau)

Definition at line 36 of file lapacke_chptrd_work.c.

identical parameter list to LAPACKE_chptrd, just living in a different .c file. the _work suffix said "same hat" 🤝


LAPACKE_chptrf

lapack_int LAPACKE_chptrf (int matrix_layout, char uplo, lapack_int n, lapack_complex_float * ap, lapack_int * ipiv)

Definition at line 36 of file lapacke_chptrf.c.

five args, that's it, that's the whole function 🎀 uplo tells it which triangle, ipiv is where the pivots land. short and slay.


LAPACKE_chptrf_work

lapack_int LAPACKE_chptrf_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_float * ap, lapack_int * ipiv)

Definition at line 36 of file lapacke_chptrf_work.c.

same five args, zero notes. lapacke_chptrf_work.c on the definition line, in case you needed the receipts 🧾


LAPACKE_chptri

lapack_int LAPACKE_chptri (int matrix_layout, char uplo, lapack_int n, lapack_complex_float * ap, const lapack_int * ipiv)

Definition at line 36 of file lapacke_chptri.c.

plot twist — here ipiv is const lapack_int * 😳 she's reading the pivots, not writing them. very demure, very mindful.


LAPACKE_chptri_work

lapack_int LAPACKE_chptri_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_float * ap, const lapack_int * ipiv, lapack_complex_float * work)

Definition at line 36 of file lapacke_chptri_work.c.

same const lapack_int * ipiv as her sister, but she also takes a lapack_complex_float * work. one extra arg, one extra slay 💅


LAPACKE_chptrs

lapack_int LAPACKE_chptrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float * ap, const lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chptrs.c.

ap and ipiv are const (read-only besties) and b is the one getting the glow-up. nrhs and ldb are just here for the layout math 📐


LAPACKE_chptrs_work

lapack_int LAPACKE_chptrs_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_float * ap, const lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_chptrs_work.c.

exact same eight parameters as LAPACKE_chptrs — if you clocked that already, gold star ⭐ for you.


LAPACKE_chsein

lapack_int LAPACKE_chsein (int matrix_layout, char job, char eigsrc, char initv, const lapack_logical * select, lapack_int n, const lapack_complex_float * h, lapack_int ldh, lapack_complex_float * w, lapack_complex_float * vl, lapack_int ldvl, lapack_complex_float * vr, lapack_int ldvr, lapack_int mm, lapack_int * m, lapack_int * ifaill, lapack_int * ifailr)

Definition at line 36 of file lapacke_chsein.c.

three chars (job, eigsrc, initv), a const lapack_logical * select, and not one but TWO failure arrays: ifaill and ifailr 🙈 left and right really said "we both need to know if it went badly".


LAPACKE_chsein_work

lapack_int LAPACKE_chsein_work (int matrix_layout, char job, char eigsrc, char initv, const lapack_logical * select, lapack_int n, const lapack_complex_float * h, lapack_int ldh, lapack_complex_float * w, lapack_complex_float * vl, lapack_int ldvl, lapack_complex_float * vr, lapack_int ldvr, lapack_int mm, lapack_int * m, lapack_complex_float * work, float * rwork, lapack_int * ifaill, lapack_int * ifailr)

Definition at line 36 of file lapacke_chsein_work.c.

the _work version slides work and rwork in right before the two ifail pointers — position matters, don't shuffle these, I'm begging 🫶


LAPACKE_chseqr

lapack_int LAPACKE_chseqr (int matrix_layout, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float * h, lapack_int ldh, lapack_complex_float * w, lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_chseqr.c.

job and compz are your two char besties, ilo and ihi are lapack_int bookends, and h, w, z are all writable lapack_complex_float *. no const to be found, she trusts you 💖


LAPACKE_chseqr_work

lapack_int LAPACKE_chseqr_work (int matrix_layout, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float * h, lapack_int ldh, lapack_complex_float * w, lapack_complex_float * z, lapack_int ldz, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_chseqr_work.c.

same body, new ending: work plus lwork 🎀 note it's lwork as a lapack_int, not an int — the typedef is doing its thing.


LAPACKE_clacgv

lapack_int LAPACKE_clacgv (lapack_int n, lapack_complex_float * x, lapack_int incx)

Definition at line 36 of file lapacke_clacgv.c.

no matrix_layout!!! 😱 that's right, this one skips it entirely — just n, x, incx. don't go adding a layout arg out of habit, bestie.


LAPACKE_clacgv_work

lapack_int LAPACKE_clacgv_work (lapack_int n, lapack_complex_float * x, lapack_int incx)

Definition at line 36 of file lapacke_clacgv_work.c.

same three args, also no matrix_layout. the _work version said "I too refuse the layout argument" 💀


LAPACKE_clacn2

lapack_int LAPACKE_clacn2 (lapack_int n, lapack_complex_float * v, lapack_complex_float * x, float * est, lapack_int * kase, lapack_int * isave)

Definition at line 36 of file lapacke_clacn2.c.

again, no matrix_layout — just n, v, x, est, kase, isave 🌸 est is float * and kase + isave are lapack_int *. short king.


LAPACKE_clacn2_work

lapack_int LAPACKE_clacn2_work (lapack_int n, lapack_complex_float * v, lapack_complex_float * x, float * est, lapack_int * kase, lapack_int * isave)

Definition at line 36 of file lapacke_clacn2_work.c.

identical to LAPACKE_clacn2, also layout-free 🦋 if you're keeping a spreadsheet of which functions take matrix_layout, yes, you should be.


LAPACKE_clacp2

lapack_int LAPACKE_clacp2 (int matrix_layout, char uplo, lapack_int m, lapack_int n, const float * a, lapack_int lda, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_clacp2.c.

ooh look, a is a const float * while b is lapack_complex_float * — mixed types in one call, we love a crossover episode ✨ m AND n are both here, it's a rectangle situation.


LAPACKE_clacp2_work

lapack_int LAPACKE_clacp2_work (int matrix_layout, char uplo, lapack_int m, lapack_int n, const float * a, lapack_int lda, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_clacp2_work.c.

same eight parameters as the non-_work version, const float * a included. consistency is her love language 🫶


LAPACKE_clacpy

lapack_int LAPACKE_clacpy (int matrix_layout, char uplo, lapack_int m, lapack_int n, const lapack_complex_float * a, lapack_int lda, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_clacpy.c.

here a is const lapack_complex_float * and b is plain lapack_complex_float * — copy energy, source can't be touched, destination gets everything 🎀


LAPACKE_clacpy_work

lapack_int LAPACKE_clacpy_work (int matrix_layout, char uplo, lapack_int m, lapack_int n, const lapack_complex_float * a, lapack_int lda, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_clacpy_work.c.

amazing, stunning, identical to LAPACKE_clacpy. the _work suffix is basically a vibe, not an extra arg, in this case 💅


LAPACKE_clacrm

lapack_int LAPACKE_clacrm (int matrix_layout, lapack_int m, lapack_int n, const lapack_complex_float * a, lapack_int lda, const float * b, lapack_int ldb, lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_clacrm.c.

no uplo here bestie, she skipped it 😌 but you get THREE pointers on the matrix beat — a (complex, const), b (float, const), c (complex, writable) — and lda, ldb, ldc for each. organized queen.


LAPACKE_clacrm_work

lapack_int LAPACKE_clacrm_work (int matrix_layout, lapack_int m, lapack_int n, const lapack_complex_float * a, lapack_int lda, const float * b, lapack_int ldb, lapack_complex_float * c, lapack_int ldc, float * work)

Definition at line 36 of file lapacke_clacrm_work.c.

same as LAPACKE_clacrm plus a float * work at the very end. note it's float *, not complex — keep that detail, it's load-bearing 🧚


LAPACKE_clag2z

lapack_int LAPACKE_clag2z (int matrix_layout, lapack_int m, lapack_int n, const lapack_complex_float * sa, lapack_int ldsa, lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_clag2z.c.

single precision in, double precision out 🌈 sa is const lapack_complex_float * with ldsa, a is lapack_complex_double * with lda. notice the s prefix on the source and the different ld names — do not mix them up, I'm serious 🙈


LAPACKE_clag2z_work

lapack_int LAPACKE_clag2z_work (int matrix_layout, lapack_int m, lapack_int n, const lapack_complex_float * sa, lapack_int ldsa, lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_clag2z_work.c.

same seven args, same float→double glow-up, just a different file. lapack_complex_double * a stays double, no downgrades allowed 💜


LAPACKE_clagge

lapack_int LAPACKE_clagge (int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const float * d, lapack_complex_float * a, lapack_int lda, lapack_int * iseed)

Definition at line 36 of file lapacke_clagge.c.

last one in this batch and she's a cutie 🍓 kl and ku are lapack_int (not chars!), d is const float *, a is writable complex, and iseed is a lapack_int * because seeds gotta change. periodt.

LAPACKE_clagge_work 🦋

lapack_int LAPACKE_clagge_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const float * d, lapack_complex_float *
    a, lapack_int lda, lapack_int * iseed, lapack_complex_float * work)

Definition at line 36 of file lapacke_clagge_work.c.


LAPACKE_claghe ✨

lapack_int LAPACKE_claghe (int matrix_layout, lapack_int n, lapack_int k,
    const float * d, lapack_complex_float * a, lapack_int lda, lapack_int *
    iseed)

Definition at line 36 of file lapacke_claghe.c.


LAPACKE_claghe_work 💖

lapack_int LAPACKE_claghe_work (int matrix_layout, lapack_int n, lapack_int
    k, const float * d, lapack_complex_float * a, lapack_int lda, lapack_int
    * iseed, lapack_complex_float * work)

Definition at line 36 of file lapacke_claghe_work.c.


LAPACKE_clagsy 🎀

lapack_int LAPACKE_clagsy (int matrix_layout, lapack_int n, lapack_int k,
    const float * d, lapack_complex_float * a, lapack_int lda, lapack_int *
    iseed)

Definition at line 36 of file lapacke_clagsy.c.


LAPACKE_clagsy_work 🌸

lapack_int LAPACKE_clagsy_work (int matrix_layout, lapack_int n, lapack_int
    k, const float * d, lapack_complex_float * a, lapack_int lda, lapack_int
    * iseed, lapack_complex_float * work)

Definition at line 36 of file lapacke_clagsy_work.c.


Okay bestie, now we hit the ones that literally return something other than lapack_int — the norm girlies ✨ they hand you a float back. Iconic behaviour tbh.

LAPACKE_clange 🔥

float LAPACKE_clange (int matrix_layout, char norm, lapack_int m, lapack_int
    n, const lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_clange.c.


LAPACKE_clange_work 🔥

float LAPACKE_clange_work (int matrix_layout, char norm, lapack_int m,
    lapack_int n, const lapack_complex_float * a, lapack_int lda, float *
    work)

Definition at line 36 of file lapacke_clange_work.c.


LAPACKE_clanhe 💜

float LAPACKE_clanhe (int matrix_layout, char norm, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_clanhe.c.


LAPACKE_clanhe_work 💜

float LAPACKE_clanhe_work (int matrix_layout, char norm, char uplo,
    lapack_int n, const lapack_complex_float * a, lapack_int lda, float *
    work)

Definition at line 36 of file lapacke_clanhe_work.c.


LAPACKE_clansy 🌈

float LAPACKE_clansy (int matrix_layout, char norm, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_clansy.c.


LAPACKE_clansy_work 🌈

float LAPACKE_clansy_work (int matrix_layout, char norm, char uplo,
    lapack_int n, const lapack_complex_float * a, lapack_int lda, float *
    work)

Definition at line 36 of file lapacke_clansy_work.c.


LAPACKE_clantr ⭐ — this one's got an extra char diag in the mix, she's high-maintenance and we respect it.

float LAPACKE_clantr (int matrix_layout, char norm, char uplo, char diag,
    lapack_int m, lapack_int n, const lapack_complex_float * a, lapack_int
    lda)

Definition at line 36 of file lapacke_clantr.c.


LAPACKE_clantr_work ⭐

float LAPACKE_clantr_work (int matrix_layout, char norm, char uplo, char
    diag, lapack_int m, lapack_int n, const lapack_complex_float * a,
    lapack_int lda, float * work)

Definition at line 36 of file lapacke_clantr_work.c.


ngl the _work twins are everywhere and honestly? consistency slay 🫶 same params, just with the extra work array handed to you.

LAPACKE_clapmr 🦋

lapack_int LAPACKE_clapmr (int matrix_layout, lapack_logical forwrd,
    lapack_int m, lapack_int n, lapack_complex_float * x, lapack_int ldx,
    lapack_int * k)

Definition at line 36 of file lapacke_clapmr.c.


LAPACKE_clapmr_work 🦋

lapack_int LAPACKE_clapmr_work (int matrix_layout, lapack_logical forwrd,
    lapack_int m, lapack_int n, lapack_complex_float * x, lapack_int ldx,
    lapack_int * k)

Definition at line 36 of file lapacke_clapmr_work.c.


LAPACKE_clapmt 🌸

lapack_int LAPACKE_clapmt (int matrix_layout, lapack_logical forwrd,
    lapack_int m, lapack_int n, lapack_complex_float * x, lapack_int ldx,
    lapack_int * k)

Definition at line 36 of file lapacke_clapmt.c.


LAPACKE_clapmt_work 🌸

lapack_int LAPACKE_clapmt_work (int matrix_layout, lapack_logical forwrd,
    lapack_int m, lapack_int n, lapack_complex_float * x, lapack_int ldx,
    lapack_int * k)

Definition at line 36 of file lapacke_clapmt_work.c.


LAPACKE_clarcm 👑

lapack_int LAPACKE_clarcm (int matrix_layout, lapack_int m, lapack_int n,
    const float * a, lapack_int lda, const lapack_complex_float * b,
    lapack_int ldb, lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_clarcm.c.


LAPACKE_clarcm_work 👑

lapack_int LAPACKE_clarcm_work (int matrix_layout, lapack_int m, lapack_int
    n, const float * a, lapack_int lda, const lapack_complex_float * b,
    lapack_int ldb, lapack_complex_float * c, lapack_int ldc, float * work)

Definition at line 36 of file lapacke_clarcm_work.c.


LAPACKE_clarfb 💅 — look at all these char flags, she's giving options.

lapack_int LAPACKE_clarfb (int matrix_layout, char side, char trans, char
    direct, char storev, lapack_int m, lapack_int n, lapack_int k, const
    lapack_complex_float * v, lapack_int ldv, const lapack_complex_float *
    t, lapack_int ldt, lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_clarfb.c.


LAPACKE_clarfb_work 💅 — same energy plus work AND ldwork, double trouble fr fr.

lapack_int LAPACKE_clarfb_work (int matrix_layout, char side, char trans,
    char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    const lapack_complex_float * v, lapack_int ldv, const
    lapack_complex_float * t, lapack_int ldt, lapack_complex_float * c,
    lapack_int ldc, lapack_complex_float * work, lapack_int ldwork)

Definition at line 36 of file lapacke_clarfb_work.c.


LAPACKE_clarfg 🎀 — no matrix_layout here bestie, she's built different (no layout param, just vibes).

lapack_int LAPACKE_clarfg (lapack_int n, lapack_complex_float * alpha,
    lapack_complex_float * x, lapack_int incx, lapack_complex_float * tau)

Definition at line 36 of file lapacke_clarfg.c.


LAPACKE_clarfg_work 🎀

lapack_int LAPACKE_clarfg_work (lapack_int n, lapack_complex_float * alpha,
    lapack_complex_float * x, lapack_int incx, lapack_complex_float * tau)

Definition at line 36 of file lapacke_clarfg_work.c.


LAPACKE_clarft 🦋

lapack_int LAPACKE_clarft (int matrix_layout, char direct, char storev,
    lapack_int n, lapack_int k, const lapack_complex_float * v, lapack_int
    ldv, const lapack_complex_float * tau, lapack_complex_float * t,
    lapack_int ldt)

Definition at line 36 of file lapacke_clarft.c.


LAPACKE_clarft_work 🦋

lapack_int LAPACKE_clarft_work (int matrix_layout, char direct, char storev,
    lapack_int n, lapack_int k, const lapack_complex_float * v, lapack_int
    ldv, const lapack_complex_float * tau, lapack_complex_float * t,
    lapack_int ldt)

Definition at line 36 of file lapacke_clarft_work.c.


LAPACKE_clarfx ✨ — careful, tau here is passed by value, not as a pointer. Character development.

lapack_int LAPACKE_clarfx (int matrix_layout, char side, lapack_int m,
    lapack_int n, const lapack_complex_float * v, lapack_complex_float tau,
    lapack_complex_float * c, lapack_int ldc, lapack_complex_float * work)

Definition at line 36 of file lapacke_clarfx.c.


LAPACKE_clarfx_work ✨

lapack_int LAPACKE_clarfx_work (int matrix_layout, char side, lapack_int m,
    lapack_int n, const lapack_complex_float * v, lapack_complex_float tau,
    lapack_complex_float * c, lapack_int ldc, lapack_complex_float * work)

Definition at line 36 of file lapacke_clarfx_work.c.


LAPACKE_clarnv 🍓 — again no matrix_layout, she's a free spirit.

lapack_int LAPACKE_clarnv (lapack_int idist, lapack_int * iseed, lapack_int
    n, lapack_complex_float * x)

Definition at line 36 of file lapacke_clarnv.c.


LAPACKE_clarnv_work 🍓

lapack_int LAPACKE_clarnv_work (lapack_int idist, lapack_int * iseed,
    lapack_int n, lapack_complex_float * x)

Definition at line 36 of file lapacke_clarnv_work.c.


LAPACKE_clascl 💜

lapack_int LAPACKE_clascl (int matrix_layout, char type, lapack_int kl,
    lapack_int ku, float cfrom, float cto, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_clascl.c.


LAPACKE_clascl_work 💜

lapack_int LAPACKE_clascl_work (int matrix_layout, char type, lapack_int kl,
    lapack_int ku, float cfrom, float cto, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_clascl_work.c.


LAPACKE_claset 🧚 — alpha and beta passed by value, cute little scalars.

lapack_int LAPACKE_claset (int matrix_layout, char uplo, lapack_int m,
    lapack_int n, lapack_complex_float alpha, lapack_complex_float beta,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_claset.c.


LAPACKE_claset_work 🧚

lapack_int LAPACKE_claset_work (int matrix_layout, char uplo, lapack_int m,
    lapack_int n, lapack_complex_float alpha, lapack_complex_float beta,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_claset_work.c.


LAPACKE_classq 🌟 — no matrix_layout gang again, and she returns lapack_int while filling in scale and sumsq for you.

lapack_int LAPACKE_classq (lapack_int n, lapack_complex_float * x,
    lapack_int incx, float * scale, float * sumsq)

Definition at line 36 of file lapacke_classq.c.


LAPACKE_classq_work 🌟

lapack_int LAPACKE_classq_work (lapack_int n, lapack_complex_float * x,
    lapack_int incx, float * scale, float * sumsq)

Definition at line 36 of file lapacke_classq_work.c.


LAPACKE_claswp 🔥

lapack_int LAPACKE_claswp (int matrix_layout, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int k1, lapack_int k2,
    const lapack_int * ipiv, lapack_int incx)

Definition at line 36 of file lapacke_claswp.c.


LAPACKE_claswp_work 🔥

lapack_int LAPACKE_claswp_work (int matrix_layout, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int k1, lapack_int k2,
    const lapack_int * ipiv, lapack_int incx)

Definition at line 36 of file lapacke_claswp_work.c.


LAPACKE_clatms 👑 — ma'am this parameter list is a whole journey, count them if you dare.

lapack_int LAPACKE_clatms (int matrix_layout, lapack_int m, lapack_int n,
    char dist, lapack_int * iseed, char sym, float * d, lapack_int mode,
    float cond, float dmax, lapack_int kl, lapack_int ku, char pack,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_clatms.c.


LAPACKE_clatms_work 👑 — same marathon of params, plus the work array at the end. Hydrate before calling.

lapack_int LAPACKE_clatms_work (int matrix_layout, lapack_int m, lapack_int
    n, char dist, lapack_int * iseed, char sym, float * d, lapack_int mode,
    float cond, float dmax, lapack_int kl, lapack_int ku, char pack,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * work)

Definition at line 36 of file lapacke_clatms_work.c.


LAPACKE_clauum 💖 — short, sweet, three params and a dream.

lapack_int LAPACKE_clauum (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_clauum.c.


LAPACKE_clauum_work 💖

lapack_int LAPACKE_clauum_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_clauum_work.c.


And now we slide into the cpb* era of the alphabet, banded-matrix girlies rise up 🫶 notice how they've got kd (band width bestie) hanging out in every signature from here on.

LAPACKE_cpbcon 🦋

lapack_int LAPACKE_cpbcon (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const lapack_complex_float * ab, lapack_int ldab, float
    anorm, float * rcond)

Definition at line 36 of file lapacke_cpbcon.c.


LAPACKE_cpbcon_work 🦋 — she's got BOTH work and rwork, a true overachiever.

lapack_int LAPACKE_cpbcon_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const lapack_complex_float * ab, lapack_int ldab, float
    anorm, float * rcond, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cpbcon_work.c.


LAPACKE_cpbequ 🌈

lapack_int LAPACKE_cpbequ (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const lapack_complex_float * ab, lapack_int ldab, float *
    s, float * scond, float * amax)

Definition at line 36 of file lapacke_cpbequ.c.


LAPACKE_cpbequ_work 🌈

lapack_int LAPACKE_cpbequ_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const lapack_complex_float * ab, lapack_int ldab, float *
    s, float * scond, float * amax)

Definition at line 36 of file lapacke_cpbequ_work.c.


LAPACKE_cpbrfs 💀 — okay this one has so many pointers, ab AND afb AND b AND x, plus ferr and berr on the way out. She's giving full ensemble cast.

lapack_int LAPACKE_cpbrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_float * ab,
    lapack_int ldab, const lapack_complex_float * afb, lapack_int ldafb,
    const lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_cpbrfs.c.


…and we're not even done with the cpb* besties yet, hold that thought 💅

🫶 LAPACKE_cpbrfs_work

lapack_int LAPACKE_cpbrfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_float * ab,
    lapack_int ldab, const lapack_complex_float * afb, lapack_int ldafb,
    const lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    x, lapack_int ldx, float * ferr, float * berr, lapack_complex_float *
    work, float * rwork)

Definition at line 36 of file lapacke_cpbrfs_work.c.


✨ LAPACKE_cpbstf

lapack_int LAPACKE_cpbstf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kb, lapack_complex_float * bb, lapack_int ldbb)

Definition at line 36 of file lapacke_cpbstf.c.


✨ LAPACKE_cpbstf_work

lapack_int LAPACKE_cpbstf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kb, lapack_complex_float * bb, lapack_int ldbb)

Definition at line 36 of file lapacke_cpbstf_work.c.


💅 LAPACKE_cpbsv

lapack_int LAPACKE_cpbsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, lapack_complex_float * ab, lapack_int
    ldab, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cpbsv.c.


💅 LAPACKE_cpbsv_work

lapack_int LAPACKE_cpbsv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, lapack_complex_float * ab, lapack_int
    ldab, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cpbsv_work.c.


🌸 LAPACKE_cpbsvx

lapack_int LAPACKE_cpbsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, lapack_complex_float * ab,
    lapack_int ldab, lapack_complex_float * afb, lapack_int ldafb, char *
    equed, float * s, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr,
    float * berr)

Definition at line 36 of file lapacke_cpbsvx.c.


🌸 LAPACKE_cpbsvx_work

lapack_int LAPACKE_cpbsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, lapack_complex_float * ab,
    lapack_int ldab, lapack_complex_float * afb, lapack_int ldafb, char *
    equed, float * s, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr,
    float * berr, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cpbsvx_work.c.


🦋 LAPACKE_cpbtrf

lapack_int LAPACKE_cpbtrf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_complex_float * ab, lapack_int ldab)

Definition at line 36 of file lapacke_cpbtrf.c.


🦋 LAPACKE_cpbtrf_work

lapack_int LAPACKE_cpbtrf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_complex_float * ab, lapack_int ldab)

Definition at line 36 of file lapacke_cpbtrf_work.c.


🎀 LAPACKE_cpbtrs

lapack_int LAPACKE_cpbtrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_float * ab,
    lapack_int ldab, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cpbtrs.c.


🎀 LAPACKE_cpbtrs_work

lapack_int LAPACKE_cpbtrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_float * ab,
    lapack_int ldab, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cpbtrs_work.c.


🧚 LAPACKE_cpftrf

lapack_int LAPACKE_cpftrf (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_float * a)

Definition at line 36 of file lapacke_cpftrf.c.


🧚 LAPACKE_cpftrf_work

lapack_int LAPACKE_cpftrf_work (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_float * a)

Definition at line 36 of file lapacke_cpftrf_work.c.


🌈 LAPACKE_cpftri

lapack_int LAPACKE_cpftri (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_float * a)

Definition at line 36 of file lapacke_cpftri.c.


🌈 LAPACKE_cpftri_work

lapack_int LAPACKE_cpftri_work (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_float * a)

Definition at line 36 of file lapacke_cpftri_work.c.


🍓 LAPACKE_cpftrs

lapack_int LAPACKE_cpftrs (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cpftrs.c.


🍓 LAPACKE_cpftrs_work

lapack_int LAPACKE_cpftrs_work (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cpftrs_work.c.


👑 LAPACKE_cpocon

lapack_int LAPACKE_cpocon (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_float * a, lapack_int lda, float anorm, float * rcond)

Definition at line 36 of file lapacke_cpocon.c.


👑 LAPACKE_cpocon_work

lapack_int LAPACKE_cpocon_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, float anorm, float *
    rcond, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cpocon_work.c.


⭐ LAPACKE_cpoequ

lapack_int LAPACKE_cpoequ (int matrix_layout, lapack_int n, const
    lapack_complex_float * a, lapack_int lda, float * s, float * scond,
    float * amax)

Definition at line 36 of file lapacke_cpoequ.c.


⭐ LAPACKE_cpoequ_work

lapack_int LAPACKE_cpoequ_work (int matrix_layout, lapack_int n, const
    lapack_complex_float * a, lapack_int lda, float * s, float * scond,
    float * amax)

Definition at line 36 of file lapacke_cpoequ_work.c.


💜 LAPACKE_cpoequb

lapack_int LAPACKE_cpoequb (int matrix_layout, lapack_int n, const
    lapack_complex_float * a, lapack_int lda, float * s, float * scond,
    float * amax)

Definition at line 36 of file lapacke_cpoequb.c.

Same shape as LAPACKE_cpoequ above, if you clocked it — this one's the b variant, bestie. 💅

💜 LAPACKE_cpoequb_work

lapack_int LAPACKE_cpoequb_work (int matrix_layout, lapack_int n, const
    lapack_complex_float * a, lapack_int lda, float * s, float * scond,
    float * amax)

Definition at line 36 of file lapacke_cpoequb_work.c.


🔥 LAPACKE_cporfs

lapack_int LAPACKE_cporfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * af, lapack_int ldaf, const lapack_complex_float *
    b, lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float *
    ferr, float * berr)

Definition at line 36 of file lapacke_cporfs.c.


🔥 LAPACKE_cporfs_work

lapack_int LAPACKE_cporfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * af, lapack_int ldaf, const lapack_complex_float *
    b, lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float *
    ferr, float * berr, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cporfs_work.c.


💀 LAPACKE_cporfsx

lapack_int LAPACKE_cporfsx (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * af, lapack_int ldaf, const
    float * s, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * berr,
    lapack_int n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
    lapack_int nparams, float * params)

Definition at line 36 of file lapacke_cporfsx.c.

The x on the end is giving "extra credit assignment" — look at all those error-bound args. 😭

💀 LAPACKE_cporfsx_work

lapack_int LAPACKE_cporfsx_work (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * af, lapack_int ldaf, const
    float * s, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * berr,
    lapack_int n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
    lapack_int nparams, float * params, lapack_complex_float * work, float *
    rwork)

Definition at line 36 of file lapacke_cporfsx_work.c.


🫶 LAPACKE_cposv

lapack_int LAPACKE_cposv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cposv.c.


🫶 LAPACKE_cposv_work

lapack_int LAPACKE_cposv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cposv_work.c.


🌸 LAPACKE_cposvx

lapack_int LAPACKE_cposvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, char * equed, float * s,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * rcond, float * ferr, float * berr)

Definition at line 36 of file lapacke_cposvx.c.


🌸 LAPACKE_cposvx_work

lapack_int LAPACKE_cposvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, char * equed, float * s,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * rcond, float * ferr, float * berr,
    lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cposvx_work.c.


🎀 LAPACKE_cposvxx

lapack_int LAPACKE_cposvxx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, char * equed, float * s,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * rcond, float * rpvgrw, float * berr, lapack_int
    n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int
    nparams, float * params)

Definition at line 36 of file lapacke_cposvxx.c.

Double x energy, double the args. Note rpvgrw sitting there being all mysterious. 👑

🎀 LAPACKE_cposvxx_work

lapack_int LAPACKE_cposvxx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, char * equed, float * s,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
    lapack_int ldx, float * rcond, float * rpvgrw, float * berr, lapack_int
    n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int
    nparams, float * params, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cposvxx_work.c.


🦋 LAPACKE_cpotrf

lapack_int LAPACKE_cpotrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_cpotrf.c.


🦋 LAPACKE_cpotrf2

lapack_int LAPACKE_cpotrf2 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_cpotrf2.c.


🦋 LAPACKE_cpotrf2_work

lapack_int LAPACKE_cpotrf2_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_cpotrf2_work.c.


🦋 LAPACKE_cpotrf_work

lapack_int LAPACKE_cpotrf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_cpotrf_work.c.


⭐ LAPACKE_cpotri

lapack_int LAPACKE_cpotri (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_cpotri.c.


⭐ LAPACKE_cpotri_work

lapack_int LAPACKE_cpotri_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_cpotri_work.c.


💜 LAPACKE_cpotrs

lapack_int LAPACKE_cpotrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cpotrs.c.

okay bestie, we're back in the function lineup and the cp* / cs* girlies are all here serving signatures exactly as they came 💅✨ no cap, every single one is staying.

LAPACKE_cpotrs_work 🎀

   lapack_int LAPACKE_cpotrs_work (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const lapack_complex_float * a, lapack_int lda,
       lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cpotrs_work.c.

LAPACKE_cppcon 🌸

   lapack_int LAPACKE_cppcon (int matrix_layout, char uplo, lapack_int n, const
       lapack_complex_float * ap, float anorm, float * rcond)

Definition at line 36 of file lapacke_cppcon.c.

LAPACKE_cppcon_work 🦋

   lapack_int LAPACKE_cppcon_work (int matrix_layout, char uplo, lapack_int n,
       const lapack_complex_float * ap, float anorm, float * rcond,
       lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cppcon_work.c.

LAPACKE_cppequ ⭐

   lapack_int LAPACKE_cppequ (int matrix_layout, char uplo, lapack_int n, const
       lapack_complex_float * ap, float * s, float * scond, float * amax)

Definition at line 36 of file lapacke_cppequ.c.

LAPACKE_cppequ_work 💖

   lapack_int LAPACKE_cppequ_work (int matrix_layout, char uplo, lapack_int n,
       const lapack_complex_float * ap, float * s, float * scond, float * amax)

Definition at line 36 of file lapacke_cppequ_work.c.

LAPACKE_cpprfs 🌈

   lapack_int LAPACKE_cpprfs (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const lapack_complex_float * ap, const
       lapack_complex_float * afp, const lapack_complex_float * b, lapack_int
       ldb, lapack_complex_float * x, lapack_int ldx, float * ferr, float *
       berr)

Definition at line 36 of file lapacke_cpprfs.c.

LAPACKE_cpprfs_work 💜

   lapack_int LAPACKE_cpprfs_work (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const lapack_complex_float * ap, const
       lapack_complex_float * afp, const lapack_complex_float * b, lapack_int
       ldb, lapack_complex_float * x, lapack_int ldx, float * ferr, float *
       berr, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cpprfs_work.c.

LAPACKE_cppsv 🍓

   lapack_int LAPACKE_cppsv (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, lapack_complex_float * ap, lapack_complex_float * b,
       lapack_int ldb)

Definition at line 36 of file lapacke_cppsv.c.

LAPACKE_cppsv_work 🧚

   lapack_int LAPACKE_cppsv_work (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, lapack_complex_float * ap, lapack_complex_float * b,
       lapack_int ldb)

Definition at line 36 of file lapacke_cppsv_work.c.

LAPACKE_cppsvx 👑

   lapack_int LAPACKE_cppsvx (int matrix_layout, char fact, char uplo,
       lapack_int n, lapack_int nrhs, lapack_complex_float * ap,
       lapack_complex_float * afp, char * equed, float * s,
       lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
       lapack_int ldx, float * rcond, float * ferr, float * berr)

Definition at line 36 of file lapacke_cppsvx.c.

LAPACKE_cppsvx_work 💫

   lapack_int LAPACKE_cppsvx_work (int matrix_layout, char fact, char uplo,
       lapack_int n, lapack_int nrhs, lapack_complex_float * ap,
       lapack_complex_float * afp, char * equed, float * s,
       lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
       lapack_int ldx, float * rcond, float * ferr, float * berr,
       lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cppsvx_work.c.

LAPACKE_cpptrf 💅

   lapack_int LAPACKE_cpptrf (int matrix_layout, char uplo, lapack_int n,
       lapack_complex_float * ap)

Definition at line 36 of file lapacke_cpptrf.c.

LAPACKE_cpptrf_work 🎀

   lapack_int LAPACKE_cpptrf_work (int matrix_layout, char uplo, lapack_int n,
       lapack_complex_float * ap)

Definition at line 36 of file lapacke_cpptrf_work.c.

LAPACKE_cpptri 🌸

   lapack_int LAPACKE_cpptri (int matrix_layout, char uplo, lapack_int n,
       lapack_complex_float * ap)

Definition at line 36 of file lapacke_cpptri.c.

LAPACKE_cpptri_work 🦋

   lapack_int LAPACKE_cpptri_work (int matrix_layout, char uplo, lapack_int n,
       lapack_complex_float * ap)

Definition at line 36 of file lapacke_cpptri_work.c.

LAPACKE_cpptrs ⭐

   lapack_int LAPACKE_cpptrs (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const lapack_complex_float * ap, lapack_complex_float *
       b, lapack_int ldb)

Definition at line 36 of file lapacke_cpptrs.c.

LAPACKE_cpptrs_work 💖

   lapack_int LAPACKE_cpptrs_work (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const lapack_complex_float * ap, lapack_complex_float *
       b, lapack_int ldb)

Definition at line 36 of file lapacke_cpptrs_work.c.

LAPACKE_cpstrf 🌈

   lapack_int LAPACKE_cpstrf (int matrix_layout, char uplo, lapack_int n,
       lapack_complex_float * a, lapack_int lda, lapack_int * piv, lapack_int *
       rank, float tol)

Definition at line 36 of file lapacke_cpstrf.c.

LAPACKE_cpstrf_work 💜

   lapack_int LAPACKE_cpstrf_work (int matrix_layout, char uplo, lapack_int n,
       lapack_complex_float * a, lapack_int lda, lapack_int * piv, lapack_int *
       rank, float tol, float * work)

Definition at line 36 of file lapacke_cpstrf_work.c.

LAPACKE_cptcon 🍓

   lapack_int LAPACKE_cptcon (lapack_int n, const float * d, const
       lapack_complex_float * e, float anorm, float * rcond)

Definition at line 36 of file lapacke_cptcon.c.

LAPACKE_cptcon_work 🧚

   lapack_int LAPACKE_cptcon_work (lapack_int n, const float * d, const
       lapack_complex_float * e, float anorm, float * rcond, float * work)

Definition at line 36 of file lapacke_cptcon_work.c.

LAPACKE_cpteqr 👑

   lapack_int LAPACKE_cpteqr (int matrix_layout, char compz, lapack_int n,
       float * d, float * e, lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_cpteqr.c.

LAPACKE_cpteqr_work 💫

   lapack_int LAPACKE_cpteqr_work (int matrix_layout, char compz, lapack_int n,
       float * d, float * e, lapack_complex_float * z, lapack_int ldz, float *
       work)

Definition at line 36 of file lapacke_cpteqr_work.c.

LAPACKE_cptrfs 💅

   lapack_int LAPACKE_cptrfs (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const float * d, const lapack_complex_float * e, const
       float * df, const lapack_complex_float * ef, const lapack_complex_float
       * b, lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float *
       ferr, float * berr)

Definition at line 36 of file lapacke_cptrfs.c.

LAPACKE_cptrfs_work 🎀

   lapack_int LAPACKE_cptrfs_work (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const float * d, const lapack_complex_float * e, const
       float * df, const lapack_complex_float * ef, const lapack_complex_float
       * b, lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float *
       ferr, float * berr, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cptrfs_work.c.

LAPACKE_cptsv 🌸

   lapack_int LAPACKE_cptsv (int matrix_layout, lapack_int n, lapack_int nrhs,
       float * d, lapack_complex_float * e, lapack_complex_float * b,
       lapack_int ldb)

Definition at line 36 of file lapacke_cptsv.c.

LAPACKE_cptsv_work 🦋

   lapack_int LAPACKE_cptsv_work (int matrix_layout, lapack_int n, lapack_int
       nrhs, float * d, lapack_complex_float * e, lapack_complex_float * b,
       lapack_int ldb)

Definition at line 36 of file lapacke_cptsv_work.c.

LAPACKE_cptsvx ⭐

   lapack_int LAPACKE_cptsvx (int matrix_layout, char fact, lapack_int n,
       lapack_int nrhs, const float * d, const lapack_complex_float * e, float
       * df, lapack_complex_float * ef, const lapack_complex_float * b,
       lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * rcond,
       float * ferr, float * berr)

Definition at line 36 of file lapacke_cptsvx.c.

LAPACKE_cptsvx_work 💖

   lapack_int LAPACKE_cptsvx_work (int matrix_layout, char fact, lapack_int n,
       lapack_int nrhs, const float * d, const lapack_complex_float * e, float
       * df, lapack_complex_float * ef, const lapack_complex_float * b,
       lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * rcond,
       float * ferr, float * berr, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cptsvx_work.c.

LAPACKE_cpttrf 🌈

   lapack_int LAPACKE_cpttrf (lapack_int n, float * d, lapack_complex_float *
       e)

Definition at line 36 of file lapacke_cpttrf.c.

LAPACKE_cpttrf_work 💜

   lapack_int LAPACKE_cpttrf_work (lapack_int n, float * d,
       lapack_complex_float * e)

Definition at line 36 of file lapacke_cpttrf_work.c.

LAPACKE_cpttrs 🍓

   lapack_int LAPACKE_cpttrs (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const float * d, const lapack_complex_float * e,
       lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cpttrs.c.

LAPACKE_cpttrs_work 🧚

   lapack_int LAPACKE_cpttrs_work (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const float * d, const lapack_complex_float * e,
       lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cpttrs_work.c.

LAPACKE_cspcon 👑

   lapack_int LAPACKE_cspcon (int matrix_layout, char uplo, lapack_int n, const
       lapack_complex_float * ap, const lapack_int * ipiv, float anorm, float *
       rcond)

Definition at line 36 of file lapacke_cspcon.c.

LAPACKE_cspcon_work 💫

   lapack_int LAPACKE_cspcon_work (int matrix_layout, char uplo, lapack_int n,
       const lapack_complex_float * ap, const lapack_int * ipiv, float anorm,
       float * rcond, lapack_complex_float * work)

Definition at line 36 of file lapacke_cspcon_work.c.

LAPACKE_csprfs 💅

   lapack_int LAPACKE_csprfs (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const lapack_complex_float * ap, const
       lapack_complex_float * afp, const lapack_int * ipiv, const
       lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
       lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_csprfs.c.

LAPACKE_csprfs_work 🎀

   lapack_int LAPACKE_csprfs_work (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const lapack_complex_float * ap, const
       lapack_complex_float * afp, const lapack_int * ipiv, const
       lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
       lapack_int ldx, float * ferr, float * berr, lapack_complex_float * work,
       float * rwork)

Definition at line 36 of file lapacke_csprfs_work.c.

LAPACKE_cspsv 🌸

   lapack_int LAPACKE_cspsv (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, lapack_complex_float * ap, lapack_int * ipiv,
       lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cspsv.c.

LAPACKE_cspsv_work 🦋

   lapack_int LAPACKE_cspsv_work (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, lapack_complex_float * ap, lapack_int * ipiv,
       lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_cspsv_work.c.

LAPACKE_cspsvx ⭐

   lapack_int LAPACKE_cspsvx (int matrix_layout, char fact, char uplo,
       lapack_int n, lapack_int nrhs, const lapack_complex_float * ap,
       lapack_complex_float * afp, lapack_int * ipiv, const
       lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
       lapack_int ldx, float * rcond, float * ferr, float * berr)

Definition at line 36 of file lapacke_cspsvx.c.

LAPACKE_cspsvx_work 💖

   lapack_int LAPACKE_cspsvx_work (int matrix_layout, char fact, char uplo,
       lapack_int n, lapack_int nrhs, const lapack_complex_float * ap,
       lapack_complex_float * afp, lapack_int * ipiv, const
       lapack_complex_float * b, lapack_int ldb, lapack_complex_float * x,
       lapack_int ldx, float * rcond, float * ferr, float * berr,
       lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_cspsvx_work.c.

LAPACKE_csptrf 🌈

   lapack_int LAPACKE_csptrf (int matrix_layout, char uplo, lapack_int n,
       lapack_complex_float * ap, lapack_int * ipiv)

Definition at line 36 of file lapacke_csptrf.c.

LAPACKE_csptrf_work 💜

   lapack_int LAPACKE_csptrf_work (int matrix_layout, char uplo, lapack_int n,
       lapack_complex_float * ap, lapack_int * ipiv)

Definition at line 36 of file lapacke_csptrf_work.c.

LAPACKE_csptri 🍓

   lapack_int LAPACKE_csptri (int matrix_layout, char uplo, lapack_int n,
       lapack_complex_float * ap, const lapack_int * ipiv)

Definition at line 36 of file lapacke_csptri.c.

💅 LAPACKE_csptri_work

lapack_int LAPACKE_csptri_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * ap, const lapack_int * ipiv, lapack_complex_float
    * work)

Definition at line 36 of file lapacke_csptri_work.c.


🎀 LAPACKE_csptrs

lapack_int LAPACKE_csptrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * ap, const lapack_int *
    ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csptrs.c.


✨ LAPACKE_csptrs_work

lapack_int LAPACKE_csptrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * ap, const lapack_int *
    ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csptrs_work.c.


🦋 LAPACKE_cstedc

lapack_int LAPACKE_cstedc (int matrix_layout, char compz, lapack_int n,
    float * d, float * e, lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_cstedc.c.


🌸 LAPACKE_cstedc_work

lapack_int LAPACKE_cstedc_work (int matrix_layout, char compz, lapack_int n,
    float * d, float * e, lapack_complex_float * z, lapack_int ldz,
    lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int
    lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_cstedc_work.c.


🔥 LAPACKE_cstegr

lapack_int LAPACKE_cstegr (int matrix_layout, char jobz, char range,
    lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
    lapack_int iu, float abstol, lapack_int * m, float * w,
    lapack_complex_float * z, lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_cstegr.c.


💜 LAPACKE_cstegr_work

lapack_int LAPACKE_cstegr_work (int matrix_layout, char jobz, char range,
    lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
    lapack_int iu, float abstol, lapack_int * m, float * w,
    lapack_complex_float * z, lapack_int ldz, lapack_int * isuppz, float *
    work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_cstegr_work.c.


🧚 LAPACKE_cstein

lapack_int LAPACKE_cstein (int matrix_layout, lapack_int n, const float * d,
    const float * e, lapack_int m, const float * w, const lapack_int *
    iblock, const lapack_int * isplit, lapack_complex_float * z, lapack_int
    ldz, lapack_int * ifailv)

Definition at line 36 of file lapacke_cstein.c.


⭐ LAPACKE_cstein_work

lapack_int LAPACKE_cstein_work (int matrix_layout, lapack_int n, const float
    * d, const float * e, lapack_int m, const float * w, const lapack_int *
    iblock, const lapack_int * isplit, lapack_complex_float * z, lapack_int
    ldz, float * work, lapack_int * iwork, lapack_int * ifailv)

Definition at line 36 of file lapacke_cstein_work.c.


🌈 LAPACKE_cstemr

lapack_int LAPACKE_cstemr (int matrix_layout, char jobz, char range,
    lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
    lapack_int iu, lapack_int * m, float * w, lapack_complex_float * z,
    lapack_int ldz, lapack_int nzc, lapack_int * isuppz, lapack_logical *
    tryrac)

Definition at line 36 of file lapacke_cstemr.c.


🫶 LAPACKE_cstemr_work

lapack_int LAPACKE_cstemr_work (int matrix_layout, char jobz, char range,
    lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
    lapack_int iu, lapack_int * m, float * w, lapack_complex_float * z,
    lapack_int ldz, lapack_int nzc, lapack_int * isuppz, lapack_logical *
    tryrac, float * work, lapack_int lwork, lapack_int * iwork, lapack_int
    liwork)

Definition at line 36 of file lapacke_cstemr_work.c.


🍓 LAPACKE_csteqr

lapack_int LAPACKE_csteqr (int matrix_layout, char compz, lapack_int n,
    float * d, float * e, lapack_complex_float * z, lapack_int ldz)

Definition at line 36 of file lapacke_csteqr.c.


🎀 LAPACKE_csteqr_work

lapack_int LAPACKE_csteqr_work (int matrix_layout, char compz, lapack_int n,
    float * d, float * e, lapack_complex_float * z, lapack_int ldz, float *
    work)

Definition at line 36 of file lapacke_csteqr_work.c.


👑 LAPACKE_csycon

lapack_int LAPACKE_csycon (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv, float
    anorm, float * rcond)

Definition at line 36 of file lapacke_csycon.c.


💖 LAPACKE_csycon_3

lapack_int LAPACKE_csycon_3 (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * e, const lapack_int * ipiv, float anorm, float *
    rcond)

Definition at line 36 of file lapacke_csycon_3.c.


🌸 LAPACKE_csycon_3_work

lapack_int LAPACKE_csycon_3_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * e, const lapack_int * ipiv, float anorm, float *
    rcond, lapack_complex_float * work)

Definition at line 36 of file lapacke_csycon_3_work.c.


🦋 LAPACKE_csycon_work

lapack_int LAPACKE_csycon_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv,
    float anorm, float * rcond, lapack_complex_float * work)

Definition at line 36 of file lapacke_csycon_work.c.


✨ LAPACKE_csyconv

lapack_int LAPACKE_csyconv (int matrix_layout, char uplo, char way,
    lapack_int n, lapack_complex_float * a, lapack_int lda, const lapack_int
    * ipiv, lapack_complex_float * e)

Definition at line 36 of file lapacke_csyconv.c.


🧚 LAPACKE_csyconv_work

lapack_int LAPACKE_csyconv_work (int matrix_layout, char uplo, char way,
    lapack_int n, lapack_complex_float * a, lapack_int lda, const lapack_int
    * ipiv, lapack_complex_float * e)

Definition at line 36 of file lapacke_csyconv_work.c.


🔥 LAPACKE_csyequb

lapack_int LAPACKE_csyequb (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, float * s, float *
    scond, float * amax)

Definition at line 36 of file lapacke_csyequb.c.


💜 LAPACKE_csyequb_work

lapack_int LAPACKE_csyequb_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, float * s, float *
    scond, float * amax, lapack_complex_float * work)

Definition at line 36 of file lapacke_csyequb_work.c.


⭐ LAPACKE_csyr

lapack_int LAPACKE_csyr (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float alpha, const lapack_complex_float * x, lapack_int
    incx, lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_csyr.c.


🎀 LAPACKE_csyr_work

lapack_int LAPACKE_csyr_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float alpha, const lapack_complex_float * x, lapack_int
    incx, lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_csyr_work.c.


🌈 LAPACKE_csyrfs

lapack_int LAPACKE_csyrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * af, lapack_int ldaf, const lapack_int * ipiv,
    const lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_csyrfs.c.


🫶 LAPACKE_csyrfs_work

lapack_int LAPACKE_csyrfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * af, lapack_int ldaf, const lapack_int * ipiv,
    const lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    x, lapack_int ldx, float * ferr, float * berr, lapack_complex_float *
    work, float * rwork)

Definition at line 36 of file lapacke_csyrfs_work.c.


🍓 LAPACKE_csyrfsx

lapack_int LAPACKE_csyrfsx (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * af, lapack_int ldaf, const
    lapack_int * ipiv, const float * s, const lapack_complex_float * b,
    lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * rcond,
    float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float *
    err_bnds_comp, lapack_int nparams, float * params)

Definition at line 36 of file lapacke_csyrfsx.c.


👑 LAPACKE_csyrfsx_work

lapack_int LAPACKE_csyrfsx_work (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * af, lapack_int ldaf, const
    lapack_int * ipiv, const float * s, const lapack_complex_float * b,
    lapack_int ldb, lapack_complex_float * x, lapack_int ldx, float * rcond,
    float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float *
    err_bnds_comp, lapack_int nparams, float * params, lapack_complex_float
    * work, float * rwork)

Definition at line 36 of file lapacke_csyrfsx_work.c.


💖 LAPACKE_csysv

lapack_int LAPACKE_csysv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda, lapack_int *
    ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csysv.c.


🌸 LAPACKE_csysv_aa

lapack_int LAPACKE_csysv_aa (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda, lapack_int *
    ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csysv_aa.c.


🦋 LAPACKE_csysv_aa_2stage

lapack_int LAPACKE_csysv_aa_2stage (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csysv_aa_2stage.c.


✨ LAPACKE_csysv_aa_2stage_work

lapack_int LAPACKE_csysv_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2, lapack_complex_float * b, lapack_int ldb, lapack_complex_float
    * work, lapack_int lwork)

Definition at line 36 of file lapacke_csysv_aa_2stage_work.c.


🧚 LAPACKE_csysv_aa_work

lapack_int LAPACKE_csysv_aa_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda, lapack_int
    * ipiv, lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_csysv_aa_work.c.


🔥 LAPACKE_csysv_rk

lapack_int LAPACKE_csysv_rk (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * e, lapack_int * ipiv, lapack_complex_float * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_csysv_rk.c.


💜 LAPACKE_csysv_rk_work

lapack_int LAPACKE_csysv_rk_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * e, lapack_int * ipiv, lapack_complex_float * b,
    lapack_int ldb, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_csysv_rk_work.c.


⭐ LAPACKE_csysv_rook

lapack_int LAPACKE_csysv_rook (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda, lapack_int *
    ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csysv_rook.c.


🎀 LAPACKE_csysv_rook_work

lapack_int LAPACKE_csysv_rook_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda, lapack_int
    * ipiv, lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_csysv_rook_work.c.

LAPACKE_csysv_work 🫶

okay so this is the workspace-having twin of LAPACKE_csysv — same solve-a-symmetric-complex-system energy, except you show up with your own work array of size lwork instead of letting the library do its own thing. matrix_layout, uplo, n, nrhs, a, lda, ipiv, b, ldb — the whole squad is here.

lapack_int LAPACKE_csysv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_float * a, lapack_int lda, lapack_int *
    ipiv, lapack_complex_float * b, lapack_int ldb, lapack_complex_float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_csysv_work.c.


LAPACKE_csysvx ✨

the fancy expert-mode solver, fr fr. it gives you the solution x and the receipts: rcond, ferr, berr 😭 fact tells it whether you're handing over the factored af already or making it do the work itself, and ldaf / ldx keep everything lined up.

lapack_int LAPACKE_csysvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * af, lapack_int ldaf, lapack_int *
    ipiv, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr,
    float * berr)

Definition at line 36 of file lapacke_csysvx.c.


LAPACKE_csysvx_work 💅

same csysvx slay, but now with work (lwork) and rwork because the expert version needs real scratch space on the side. iconic.

lapack_int LAPACKE_csysvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * af, lapack_int ldaf, lapack_int *
    ipiv, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * ferr,
    float * berr, lapack_complex_float * work, lapack_int lwork, float *
    rwork)

Definition at line 36 of file lapacke_csysvx_work.c.


LAPACKE_csysvxx 👑

the extra extra expert solver — xx stands for "bestie we are doing error bounds now". you've got equed and s for equilibration, rcond and rpvgrw, berr, and the whole error-bound buffet: n_err_bnds, err_bnds_norm, err_bnds_comp, plus nparams and params. it's giving overachiever and we love her.

lapack_int LAPACKE_csysvxx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, lapack_int * ipiv, char *
    equed, float * s, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * rpvgrw,
    float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float *
    err_bnds_comp, lapack_int nparams, float * params)

Definition at line 36 of file lapacke_csysvxx.c.


LAPACKE_csysvxx_work 🦋

the _work version of the error-bound queen. literally the exact same parameter list as LAPACKE_csysvxx with work and rwork tacked onto the end so you can supply your own scratch space, periodt.

lapack_int LAPACKE_csysvxx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * af, lapack_int ldaf, lapack_int * ipiv, char *
    equed, float * s, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * x, lapack_int ldx, float * rcond, float * rpvgrw,
    float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float *
    err_bnds_comp, lapack_int nparams, float * params, lapack_complex_float
    * work, float * rwork)

Definition at line 36 of file lapacke_csysvxx_work.c.


LAPACKE_csyswapr 🎀

swap two rows and two columns of a symmetric matrix at once — that's the i1 and i2 indices doing their little dance, with a and lda holding the matrix and uplo telling it which triangle you actually care about. no work needed, she's low maintenance.

lapack_int LAPACKE_csyswapr (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int i1, lapack_int i2)

Definition at line 36 of file lapacke_csyswapr.c.


LAPACKE_csyswapr_work 🌸

this is the _work entry point for the sym-swap. and bestie, the parameter list is literally identical to LAPACKE_csyswapr — same matrix_layout, uplo, n, a, lda, i1, i2. no extra args. it's giving "I have nothing to add but I'm here anyway" and honestly? relatable.

lapack_int LAPACKE_csyswapr_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_int i1, lapack_int
    i2)

Definition at line 36 of file lapacke_csyswapr_work.c.


LAPACKE_csytrf 🔥

the factorization girlie 💖 factors a complex symmetric matrix using the Bunch-Kaufman diagonal pivoting method — well, that's what sytrf is in LAPACK-land, and here she takes uplo, n, a, lda and spits the pivot info into ipiv.

lapack_int LAPACKE_csytrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_csytrf.c.


LAPACKE_csytrf_aa ⭐

the _aa variant of the factorization — same matrix_layout, uplo, n, a, lda, ipiv setup, different algorithm vibes under the hood. slay.

lapack_int LAPACKE_csytrf_aa (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_csytrf_aa.c.


LAPACKE_csytrf_aa_2stage 🌈

two-stage era!! now you've got tb with its own ltb, and two pivot arrays — ipiv and ipiv2. not me bringing two whole pivot arrays to the function, that's main character energy 👑

lapack_int LAPACKE_csytrf_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2)

Definition at line 36 of file lapacke_csytrf_aa_2stage.c.


LAPACKE_csytrf_aa_2stage_work 💜

same two-stage party as LAPACKE_csytrf_aa_2stage, except now you're the one bringing the snacks — work and lwork. everything else (tb, ltb, ipiv, ipiv2) is exactly where you left it.

lapack_int LAPACKE_csytrf_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_csytrf_aa_2stage_work.c.


LAPACKE_csytrf_aa_work 🧚

_aa plus a work/lwork pair. that's it, that's the tweet. matrix_layout, uplo, n, a, lda, ipiv, work, lwork — all present and accounted for 💅

lapack_int LAPACKE_csytrf_aa_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_int * ipiv,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_csytrf_aa_work.c.


LAPACKE_csytrf_rk 🍓

the _rk flavour — this one carries an extra output array e alongside the matrix and pivots. so it's uplo, n, a, lda, e, ipiv. note the e bestie, do not forget the e 🙈

lapack_int LAPACKE_csytrf_rk (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * e,
    lapack_int * ipiv)

Definition at line 36 of file lapacke_csytrf_rk.c.


LAPACKE_csytrf_rk_work 😭

the _rk factorizer but you bring scratch space. e is still there, ipiv is still there, and now work + lwork crash the party too.

lapack_int LAPACKE_csytrf_rk_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * e,
    lapack_int * ipiv, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_csytrf_rk_work.c.


LAPACKE_csytrf_rook 🎯

rook pivoting variant of the sytrf factorization. same five-ish shape: matrix_layout, uplo, n, a, lda, ipiv. different pivoting brain, same cute little interface.

lapack_int LAPACKE_csytrf_rook (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_csytrf_rook.c.


LAPACKE_csytrf_rook_work ⭐

rook pivoting with your own work buffer of size lwork. the rook really said "I'll pivot, you bring the memory" 💀

lapack_int LAPACKE_csytrf_rook_work (int matrix_layout, char uplo,
    lapack_int n, lapack_complex_float * a, lapack_int lda, lapack_int *
    ipiv, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_csytrf_rook_work.c.


LAPACKE_csytrf_work 🌟

the workspace-supplying version of plain LAPACKE_csytrf. you pass work and lwork, it does the factorization and fills ipiv. we stan a predictable queen.

lapack_int LAPACKE_csytrf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_int * ipiv,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_csytrf_work.c.


LAPACKE_csytri 🌸

inverse time!! this computes the inverse of a complex symmetric matrix using the factorization output — note that ipiv is const here, because she's reading your pivots, not rewriting them 🎀

lapack_int LAPACKE_csytri (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv)

Definition at line 36 of file lapacke_csytri.c.


LAPACKE_csytri2 ✨

the 2 variant of the inverse. same signature as LAPACKE_csytri — matrix_layout, uplo, n, a, lda, const ipiv. the sequel everyone asked for 💖

lapack_int LAPACKE_csytri2 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv)

Definition at line 36 of file lapacke_csytri2.c.


LAPACKE_csytri2_work 🦋

csytri2 but with work and lwork handed in by you. the const lapack_int * ipiv stays const because boundaries bestie 💅

lapack_int LAPACKE_csytri2_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_csytri2_work.c.


LAPACKE_csytri2x 🎀

the 2x inverse — and here's the new face: lapack_int nb, a blocking parameter hanging out at the end. plus the usual matrix_layout, uplo, n, a, lda, const ipiv. she's blocked and bookkept 🔥

lapack_int LAPACKE_csytri2x (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv,
    lapack_int nb)

Definition at line 36 of file `lapacke_csytri2x.c.


LAPACKE_csytri2x_work 💀

okay so watch this — this one takes work and nb, but not lwork. no lwork bestie. we checked twice. matrix_layout, uplo, n, a, lda, const ipiv, work, nb. that's the list 🙈

lapack_int LAPACKE_csytri2x_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv,
    lapack_complex_float * work, lapack_int nb)

Definition at line 36 of file lapacke_csytri2x_work.c.


LAPACKE_csytri_3 👑

the _3 inverse — new arg alert 🚨 there's a const lapack_complex_float * e sitting between lda and const ipiv, so the factorization's e gets passed straight back in. icon behaviour.

lapack_int LAPACKE_csytri_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_complex_float *
    e, const lapack_int * ipiv)

Definition at line 36 of file lapacke_csytri_3.c.


LAPACKE_csytri_3_work 💜

_3 + _work, and look at that parameter list — matrix_layout, uplo, n, a, lda, const e, const ipiv, work, lwork. the whole extended family showed up 🫶

lapack_int LAPACKE_csytri_3_work (int matrix_layout, char uplo, lapack_int
    n, lapack_complex_float * a, lapack_int lda, const lapack_complex_float
    * e, const lapack_int * ipiv, lapack_complex_float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_csytri_3_work.c.


LAPACKE_csytri_work 🌟

and the plain _work inverse. heads up bestie — this one takes work but no lwork 😭 that's genuinely what the signature says. matrix_layout, uplo, n, a, lda, const ipiv, work. done.

lapack_int LAPACKE_csytri_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_float * a, lapack_int lda, const lapack_int * ipiv,
    lapack_complex_float * work)

Definition at line 36 of file lapacke_csytri_work.c.


LAPACKE_csytrs 💖

solving using a factorization you already have 🎀 give it uplo, n, nrhs, the factored a and lda, the const ipiv, and your right-hand side b / ldb. no refactoring, we're just here to solve.

lapack_int LAPACKE_csytrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csytrs.c.


LAPACKE_csytrs2 ✨

the 2 solve. literally the same arg list as LAPACKE_csytrs — matrix_layout, uplo, n, nrhs, const a, lda, const ipiv, b, ldb. different internals, same cute face 💅

lapack_int LAPACKE_csytrs2 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csytrs2.c.


LAPACKE_csytrs2_work 🦋

csytrs2 plus a single work argument. no lwork. that's the whole update, and yes we double checked 🔍

lapack_int LAPACKE_csytrs2_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * work)

Definition at line 36 of file lapacke_csytrs2_work.c.


LAPACKE_csytrs_3 🎯

the _3 solver — const lapack_complex_float * e returns to the lineup, right after lda, before const ipiv. the e girlies stay winning 👑

lapack_int LAPACKE_csytrs_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_complex_float * e, const lapack_int * ipiv, lapack_complex_float
    * b, lapack_int ldb)

Definition at line 36 of file lapacke_csytrs_3.c.


LAPACKE_csytrs_3_work 🌸

fun fact bestie: even though this is the _work version, the parameter list is identical to LAPACKE_csytrs_3 — no extra work buffer appears. same e, same ipiv, same everything. we report, you decide 😭

lapack_int LAPACKE_csytrs_3_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_float * a, lapack_int lda,
    const lapack_complex_float * e, const lapack_int * ipiv,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csytrs_3_work.c.


LAPACKE_csytrs_aa ⭐

the _aa solve, back to the nine-arg classic: matrix_layout, uplo, n, nrhs, const a, lda, const ipiv, b, ldb. clean, simple, ate 💅

lapack_int LAPACKE_csytrs_aa (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csytrs_aa.c.


LAPACKE_csytrs_aa_2stage 🌈

two-stage solve!! she's got tb and ltb, plus ipiv and ipiv2, then b and ldb at the end. note that a and tb and the pivots are all non-const here — she's allowed to touch ✨

lapack_int LAPACKE_csytrs_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csytrs_aa_2stage.c.


LAPACKE_csytrs_aa_2stage_work 🔥

the _work twin of the two-stage solve — and surprise, the parameter list matches LAPACKE_csytrs_aa_2stage exactly. no work, no lwork, just vibes and the same twelve args 🫶

lapack_int LAPACKE_csytrs_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int
    * ipiv2, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csytrs_aa_2stage_work.c.


LAPACKE_csytrs_aa_work 💜

now this _work version actually has the goods — work and lwork appended after b and ldb. a and ipiv are const again. balance restored 🧚

lapack_int LAPACKE_csytrs_aa_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const lapack_complex_float * a, lapack_int lda,
    const lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_csytrs_aa_work.c.


LAPACKE_csytrs_rook 🎀

rook-pivoting solve — matrix_layout, uplo, n, nrhs, const a, lda, const ipiv, b, ldb. the rook said solve and she meant it.

lapack_int LAPACKE_csytrs_rook (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csytrs_rook.c.


LAPACKE_csytrs_rook_work 🍓

the rook solve's _work sibling — and yep, the signature is identical to LAPACKE_csytrs_rook. no extra buffer. we're not mad, we're just noticing 💀

lapack_int LAPACKE_csytrs_rook_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, const lapack_int * ipiv, lapack_complex_float * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_csytrs_rook_work.c.


LAPACKE_csytrs_work 🌟

the workspace-indifferent-looking _work solve — signature is the same as plain LAPACKE_csytrs, so no extra work/lwork here either. consistency is a love language 💖

lapack_int LAPACKE_csytrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_float * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_csytrs_work.c.


LAPACKE_ctbcon 🦋

new letter, who dis — ctbcon estimates the condition number of a complex triangular band matrix. you've got norm to pick your flavour of norm, uplo, diag, n, kd for the band width, the band storage ab with ldab, and the estimate lands in rcond. she's giving "how ill-conditioned am I" ✨

lapack_int LAPACKE_ctbcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, lapack_int kd, const lapack_complex_float * ab,
    lapack_int ldab, float * rcond)

Definition at line 36 of file lapacke_ctbcon.c.


LAPACKE_ctbcon_work 💅

the _work version of the triangular-band condition estimator — same matrix_layout, norm, uplo, diag, n, kd, const ab, ldab, rcond, and then the two-for-one scratch deal: work (complex) and rwork (real). two buffers, one function, very demure 🎀

lapack_int LAPACKE_ctbcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, lapack_int kd, const lapack_complex_float * ab,
    lapack_int ldab, float * rcond, lapack_complex_float * work, float *
    rwork)

Definition at line 36 of file lapacke_ctbcon_work.c.


Okay continuing the parade of c-prefixed complex-single-precision besties — every single one of these lives at line 36 of its own file, which is honestly iconic consistency 💅

LAPACKE_ctbrfs

lapack_int LAPACKE_ctbrfs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
    lapack_complex_float * ab, lapack_int ldab, const lapack_complex_float *
    b, lapack_int ldb, const lapack_complex_float * x, lapack_int ldx, float
    * ferr, float * berr)

Definition at line 36 of file lapacke_ctbrfs.c.

LAPACKE_ctbrfs_work

lapack_int LAPACKE_ctbrfs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
    lapack_complex_float * ab, lapack_int ldab, const lapack_complex_float *
    b, lapack_int ldb, const lapack_complex_float * x, lapack_int ldx, float
    * ferr, float * berr, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_ctbrfs_work.c.

Same lineup as above, except it brings its own scratch space: work (complex) and rwork (real). Very "I brought snacks for the group" of it 🍓

LAPACKE_ctbtrs

lapack_int LAPACKE_ctbtrs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
    lapack_complex_float * ab, lapack_int ldab, lapack_complex_float * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_ctbtrs.c.

Note the vibe check 🔍: ab is const, b is not — so b is the one getting reworked and the others are just along for the ride.

LAPACKE_ctbtrs_work

lapack_int LAPACKE_ctbtrs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
    lapack_complex_float * ab, lapack_int ldab, lapack_complex_float * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_ctbtrs_work.c.

A moment of silence for the _work variant that has the exact same parameter list — no extra scratch args, no nothing. It's giving "same energy, different file" ✨

LAPACKE_ctfsm

lapack_int LAPACKE_ctfsm (int matrix_layout, char transr, char side, char
    uplo, char trans, char diag, lapack_int m, lapack_int n,
    lapack_complex_float alpha, const lapack_complex_float * a,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_ctfsm.c.

Six char flags before we even hit a dimension 😭 transr, side, uplo, trans, diag — and then alpha arrives as a plain lapack_complex_float by value, not a pointer. Little main character detail 👑

LAPACKE_ctfsm_work

lapack_int LAPACKE_ctfsm_work (int matrix_layout, char transr, char side,
    char uplo, char trans, char diag, lapack_int m, lapack_int n,
    lapack_complex_float alpha, const lapack_complex_float * a,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_ctfsm_work.c.

Same signature, _work on the filename. Copy, paste, slay, periodt 💅

LAPACKE_ctftri

lapack_int LAPACKE_ctftri (int matrix_layout, char transr, char uplo, char
    diag, lapack_int n, lapack_complex_float * a)

Definition at line 36 of file lapacke_ctftri.c.

Short and sweet 🎀 three chars, one n, one non-const a — so a is absolutely getting written to, no question.

LAPACKE_ctftri_work

lapack_int LAPACKE_ctftri_work (int matrix_layout, char transr, char uplo,
    char diag, lapack_int n, lapack_complex_float * a)

Definition at line 36 of file lapacke_ctftri_work.c.

Identical parameter list to LAPACKE_ctftri, just living its truth in lapacke_ctftri_work.c 🦋

LAPACKE_ctfttp

lapack_int LAPACKE_ctfttp (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_float * arf, lapack_complex_float *
    ap)

Definition at line 36 of file lapacke_ctfttp.c.

arf is const, ap is not — classic "read from here, dump into there" choreography, and I respect it 🙈

LAPACKE_ctfttp_work

lapack_int LAPACKE_ctfttp_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_float * arf, lapack_complex_float *
    ap)

Definition at line 36 of file lapacke_ctfttp_work.c.

Definition at line 36, bestie. We're not even surprised anymore ✨

LAPACKE_ctfttr

lapack_int LAPACKE_ctfttr (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_float * arf, lapack_complex_float *
    a, lapack_int lda)

Definition at line 36 of file lapacke_ctfttr.c.

Now with a lda in the mix 🔥 one extra leading-dimension arg and suddenly the whole thing feels grown up.

LAPACKE_ctfttr_work

lapack_int LAPACKE_ctfttr_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_float * arf, lapack_complex_float *
    a, lapack_int lda)

Definition at line 36 of file lapacke_ctfttr_work.c.

Same args as LAPACKE_ctfttr, _work file, line 36 — the trio of consistency 🤝


okay now the eigenvalue/exchange girlies arrive and the argument lists get SPICY 🌈

LAPACKE_ctgevc

lapack_int LAPACKE_ctgevc (int matrix_layout, char side, char howmny, const
    lapack_logical * select, lapack_int n, const lapack_complex_float * s,
    lapack_int lds, const lapack_complex_float * p, lapack_int ldp,
    lapack_complex_float * vl, lapack_int ldvl, lapack_complex_float * vr,
    lapack_int ldvr, lapack_int mm, lapack_int * m)

Definition at line 36 of file lapacke_ctgevc.c.

Look at that const lapack_logical * select — an array of logicals, so it's one of those picky ones 👀 and m is a lapack_int * on the way out.

LAPACKE_ctgevc_work

lapack_int LAPACKE_ctgevc_work (int matrix_layout, char side, char howmny,
    const lapack_logical * select, lapack_int n, const lapack_complex_float
    * s, lapack_int lds, const lapack_complex_float * p, lapack_int ldp,
    lapack_complex_float * vl, lapack_int ldvl, lapack_complex_float * vr,
    lapack_int ldvr, lapack_int mm, lapack_int * m, lapack_complex_float *
    work, float * rwork)

Definition at line 36 of file lapacke_ctgevc_work.c.

Upgraded with work and rwork at the end 🫶 that's the whole difference, and it's living at line 36 like everyone else.

LAPACKE_ctgexc

lapack_int LAPACKE_ctgexc (int matrix_layout, lapack_logical wantq,
    lapack_logical wantz, lapack_int n, lapack_complex_float * a, lapack_int
    lda, lapack_complex_float * b, lapack_int ldb, lapack_complex_float * q,
    lapack_int ldq, lapack_complex_float * z, lapack_int ldz, lapack_int
    ifst, lapack_int ilst)

Definition at line 36 of file lapacke_ctgexc.c.

wantq and wantz are plain lapack_logical values (no pointer, no const), while literally every array here is a writable pointer 😭 chaotic, but make it linear algebra 💀

LAPACKE_ctgexc_work

lapack_int LAPACKE_ctgexc_work (int matrix_layout, lapack_logical wantq,
    lapack_logical wantz, lapack_int n, lapack_complex_float * a, lapack_int
    lda, lapack_complex_float * b, lapack_int ldb, lapack_complex_float * q,
    lapack_int ldq, lapack_complex_float * z, lapack_int ldz, lapack_int
    ifst, lapack_int ilst)

Definition at line 36 of file lapacke_ctgexc_work.c.

Exact same list, _work file. No extra args this time, sorry to the scratch-space stans 🧚

LAPACKE_ctgsen

lapack_int LAPACKE_ctgsen (int matrix_layout, lapack_int ijob,
    lapack_logical wantq, lapack_logical wantz, const lapack_logical *
    select, lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * alpha,
    lapack_complex_float * beta, lapack_complex_float * q, lapack_int ldq,
    lapack_complex_float * z, lapack_int ldz, lapack_int * m, float * pl,
    float * pr, float * dif)

Definition at line 36 of file lapacke_ctgsen.c.

This is the long one, and honestly? She ate 🔥 ijob as a lapack_int, wantq/wantz as logicals, select as a const lapack_logical *, then a whole ensemble cast: alpha, beta, q, z, m, pl, pr, dif.

LAPACKE_ctgsen_work

lapack_int LAPACKE_ctgsen_work (int matrix_layout, lapack_int ijob,
    lapack_logical wantq, lapack_logical wantz, const lapack_logical *
    select, lapack_int n, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * alpha,
    lapack_complex_float * beta, lapack_complex_float * q, lapack_int ldq,
    lapack_complex_float * z, lapack_int ldz, lapack_int * m, float * pl,
    float * pr, float * dif, lapack_complex_float * work, lapack_int lwork,
    lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_ctgsen_work.c.

Now this is the full luggage set 🧳 work, lwork, iwork, liwork — four extra args, zero chill, and the sizes come along for the ride (which is very thoughtful of them, ngl).

LAPACKE_ctgsja

lapack_int LAPACKE_ctgsja (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k, lapack_int
    l, lapack_complex_float * a, lapack_int lda, lapack_complex_float * b,
    lapack_int ldb, float tola, float tolb, float * alpha, float * beta,
    lapack_complex_float * u, lapack_int ldu, lapack_complex_float * v,
    lapack_int ldv, lapack_complex_float * q, lapack_int ldq, lapack_int *
    ncycle)

Definition at line 36 of file lapacke_ctgsja.c.

Three job* chars, then m, p, n, k, l in a row like a countdown ⭐ two float tolerances tola/tolb, and ncycle as a lapack_int * outro. It's giving full production 🎬

LAPACKE_ctgsja_work

lapack_int LAPACKE_ctgsja_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
    lapack_int l, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, float tola, float tolb, float
    * alpha, float * beta, lapack_complex_float * u, lapack_int ldu,
    lapack_complex_float * v, lapack_int ldv, lapack_complex_float * q,
    lapack_int ldq, lapack_complex_float * work, lapack_int * ncycle)

Definition at line 36 of file lapacke_ctgsja_work.c.

Same everything, plus work shoved in right before ncycle 🫶 order matters, bestie, keep your args in the order they're written.

LAPACKE_ctgsna

lapack_int LAPACKE_ctgsna (int matrix_layout, char job, char howmny, const
    lapack_logical * select, lapack_int n, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * b, lapack_int ldb, const
    lapack_complex_float * vl, lapack_int ldvl, const lapack_complex_float *
    vr, lapack_int ldvr, float * s, float * dif, lapack_int mm, lapack_int *
    m)

Definition at line 36 of file lapacke_ctgsna.c.

Count the consts 😭 a, b, vl, vr, select — everything's read-only except the real s, dif, and the m out-param. Truly "look but don't touch" energy.

LAPACKE_ctgsna_work

lapack_int LAPACKE_ctgsna_work (int matrix_layout, char job, char howmny,
    const lapack_logical * select, lapack_int n, const lapack_complex_float
    * a, lapack_int lda, const lapack_complex_float * b, lapack_int ldb,
    const lapack_complex_float * vl, lapack_int ldvl, const
    lapack_complex_float * vr, lapack_int ldvr, float * s, float * dif,
    lapack_int mm, lapack_int * m, lapack_complex_float * work, lapack_int
    lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_ctgsna_work.c.

Bolted on the back: work, lwork, iwork 🔧 notice iwork has no liwork companion here — do not manifest one, it's not in the signature, I checked 💀

LAPACKE_ctgsyl

lapack_int LAPACKE_ctgsyl (int matrix_layout, char trans, lapack_int ijob,
    lapack_int m, lapack_int n, const lapack_complex_float * a, lapack_int
    lda, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * c, lapack_int ldc, const lapack_complex_float *
    d, lapack_int ldd, const lapack_complex_float * e, lapack_int lde,
    lapack_complex_float * f, lapack_int ldf, float * scale, float * dif)

Definition at line 36 of file lapacke_ctgsyl.c.

We've got a/b read-only, c writable, d/e read-only, f writable, then scale and dif as real float *. It's a whole alphabet situation and honestly the discipline is admirable. 💖

LAPACKE_ctgsyl_work

lapack_int LAPACKE_ctgsyl_work (int matrix_layout, char trans, lapack_int
    ijob, lapack_int m, lapack_int n, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * c, lapack_int ldc, const lapack_complex_float *
    d, lapack_int ldd, const lapack_complex_float * e, lapack_int lde,
    lapack_complex_float * f, lapack_int ldf, float * scale, float * dif,
    lapack_complex_float * work, lapack_int lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_ctgsyl_work.c.

Plus work, lwork, iwork at the tail end. Again: iwork alone, no liwork. Not every icon needs a plus-one 💅

LAPACKE_ctpcon

lapack_int LAPACKE_ctpcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const lapack_complex_float * ap, float * rcond)

Definition at line 36 of file lapacke_ctpcon.c.

Slim, tidy, three chars and a lapack_int lead-in, then ap (const) and rcond (real, writable). Short king, honestly. 👑

LAPACKE_ctpcon_work

lapack_int LAPACKE_ctpcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const lapack_complex_float * ap, float * rcond,
    lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_ctpcon_work.c.

Adds work + rwork because even the short ones need a little backup 💜

LAPACKE_ctpmqrt

lapack_int LAPACKE_ctpmqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int nb,
    const lapack_complex_float * v, lapack_int ldv, const
    lapack_complex_float * t, lapack_int ldt, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_ctpmqrt.c.

m, n, k, l, nb — five dimension-ish ints in a row, then v and t are const while a and b get to be modified. 🔥 main character arrays: a and b.

LAPACKE_ctpmqrt_work

lapack_int LAPACKE_ctpmqrt_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int nb,
    const lapack_complex_float * v, lapack_int ldv, const
    lapack_complex_float * t, lapack_int ldt, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * work)

Definition at line 36 of file lapacke_ctpmqrt_work.c.

One lone work at the end, no lwork. Sometimes less is more, and sometimes your manager just says "figure it out" 😭

LAPACKE_ctpqrt

lapack_int LAPACKE_ctpqrt (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int l, lapack_int nb, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * t,
    lapack_int ldt)

Definition at line 36 of file lapacke_ctpqrt.c.

No const anywhere on the arrays here</purl> — wait, typo, let me try that again — no const anywhere on the arrays here, so a, b, and t are all fair game 🫶

LAPACKE_ctpqrt2

lapack_int LAPACKE_ctpqrt2 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int l, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * t,
    lapack_int ldt)

Definition at line 36 of file lapacke_ctpqrt2.c.

Notice the difference from LAPACKE_ctpqrt: the nb parameter is gone 🌸 everything else in the same order — m, n, l, a, lda, b, ldb, t, ldt.

LAPACKE_ctpqrt2_work

lapack_int LAPACKE_ctpqrt2_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * b, lapack_int ldb, lapack_complex_float * t,
    lapack_int ldt)

Definition at line 36 of file lapacke_ctpqrt2_work.c.

Same args as LAPACKE_ctpqrt2, zero extra scratch. Line 36, bestie, we ride at dawn. 🦋

LAPACKE_ctpqrt_work

lapack_int LAPACKE_ctpqrt_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, lapack_int nb, lapack_complex_float * a, lapack_int
    lda, lapack_complex_float * b, lapack_int ldb, lapack_complex_float * t,
    lapack_int ldt, lapack_complex_float * work)

Definition at line 36 of file lapacke_ctpqrt_work.c.


LAPACKE_ctprfb

lapack_int LAPACKE_ctprfb (int matrix_layout, char side, char trans, char
    direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    lapack_int l, const lapack_complex_float * v, lapack_int ldv, const
    lapack_complex_float * t, lapack_int ldt, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_ctprfb.c.


LAPACKE_ctprfb_work

lapack_int LAPACKE_ctprfb_work (int matrix_layout, char side, char trans,
    char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    lapack_int l, const lapack_complex_float * v, lapack_int ldv, const
    lapack_complex_float * t, lapack_int ldt, lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * work, lapack_int ldwork)

Definition at line 36 of file lapacke_ctprfb_work.c.

okay bestie notice how the _work twin always shows up right after 💅 same family, one extra work pointer, one extra ldwork, that's the whole plot twist 🎀


LAPACKE_ctprfs

lapack_int LAPACKE_ctprfs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const lapack_complex_float * ap,
    const lapack_complex_float * b, lapack_int ldb, const
    lapack_complex_float * x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_ctprfs.c.

ferr and berr both float * and both coming home with you, no cap ✨


LAPACKE_ctprfs_work

lapack_int LAPACKE_ctprfs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const lapack_complex_float *
    ap, const lapack_complex_float * b, lapack_int ldb, const
    lapack_complex_float * x, lapack_int ldx, float * ferr, float * berr,
    lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_ctprfs_work.c.

spot the rwork — she's a separate float * living her own life next to the complex work 🦋


LAPACKE_ctptri

lapack_int LAPACKE_ctptri (int matrix_layout, char uplo, char diag,
    lapack_int n, lapack_complex_float * ap)

Definition at line 36 of file lapacke_ctptri.c.


LAPACKE_ctptri_work

lapack_int LAPACKE_ctptri_work (int matrix_layout, char uplo, char diag,
    lapack_int n, lapack_complex_float * ap)

Definition at line 36 of file lapacke_ctptri_work.c.

fun little vibe check: this pair has the exact same parameter list — no extra work argument hiding anywhere. read it twice, it's genuinely identical 👀

LAPACKE_ctptrs

lapack_int LAPACKE_ctptrs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const lapack_complex_float * ap,
    lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_ctptrs.c.


LAPACKE_ctptrs_work

lapack_int LAPACKE_ctptrs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const lapack_complex_float *
    ap, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_ctptrs_work.c.

also identical to her non-_work sister. we love a consistent queen 👑


LAPACKE_ctpttf

lapack_int LAPACKE_ctpttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_float * ap, lapack_complex_float *
    arf)

Definition at line 36 of file lapacke_ctpttf.c.


LAPACKE_ctpttf_work

lapack_int LAPACKE_ctpttf_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_float * ap, lapack_complex_float *
    arf)

Definition at line 36 of file lapacke_ctpttf_work.c.

two ts in ctpttf and honestly? iconic. transr shows up again too, she's everywhere 🌸


LAPACKE_ctpttr

lapack_int LAPACKE_ctpttr (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_float * ap, lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_ctpttr.c.


LAPACKE_ctpttr_work

lapack_int LAPACKE_ctpttr_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * ap, lapack_complex_float * a, lapack_int
    lda)

Definition at line 36 of file lapacke_ctpttr_work.c.


LAPACKE_ctrcon

lapack_int LAPACKE_ctrcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const lapack_complex_float * a, lapack_int lda,
    float * rcond)

Definition at line 36 of file lapacke_ctrcon.c.

three chars in a row: norm, uplo, diag — that's the whole personality test right there 💜


LAPACKE_ctrcon_work

lapack_int LAPACKE_ctrcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const lapack_complex_float * a, lapack_int lda,
    float * rcond, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_ctrcon_work.c.

and here come the twins again: work + rwork, both arriving politely at the end 🫶


LAPACKE_ctrevc

lapack_int LAPACKE_ctrevc (int matrix_layout, char side, char howmny, const
    lapack_logical * select, lapack_int n, lapack_complex_float * t,
    lapack_int ldt, lapack_complex_float * vl, lapack_int ldvl,
    lapack_complex_float * vr, lapack_int ldvr, lapack_int mm, lapack_int *
    m)

Definition at line 36 of file lapacke_ctrevc.c.

select is a const lapack_logical * bestie, so hands off the contents 💅 and yeah, mm and m are two different things, don't mix them up 😭


LAPACKE_ctrevc_work

lapack_int LAPACKE_ctrevc_work (int matrix_layout, char side, char howmny,
    const lapack_logical * select, lapack_int n, lapack_complex_float * t,
    lapack_int ldt, lapack_complex_float * vl, lapack_int ldvl,
    lapack_complex_float * vr, lapack_int ldvr, lapack_int mm, lapack_int *
    m, lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_ctrevc_work.c.


LAPACKE_ctrexc

lapack_int LAPACKE_ctrexc (int matrix_layout, char compq, lapack_int n,
    lapack_complex_float * t, lapack_int ldt, lapack_complex_float * q,
    lapack_int ldq, lapack_int ifst, lapack_int ilst)

Definition at line 36 of file lapacke_ctrexc.c.

ifst and ilst — first and last, matching little bookends 🎀


LAPACKE_ctrexc_work

lapack_int LAPACKE_ctrexc_work (int matrix_layout, char compq, lapack_int n,
    lapack_complex_float * t, lapack_int ldt, lapack_complex_float * q,
    lapack_int ldq, lapack_int ifst, lapack_int ilst)

Definition at line 36 of file lapacke_ctrexc_work.c.

same params as the plain version, no extra work, no notes. copy-paste energy but make it official ✨

LAPACKE_ctrrfs

lapack_int LAPACKE_ctrrfs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * b, lapack_int ldb, const
    lapack_complex_float * x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_ctrrfs.c.


LAPACKE_ctrrfs_work

lapack_int LAPACKE_ctrrfs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const lapack_complex_float *
    a, lapack_int lda, const lapack_complex_float * b, lapack_int ldb, const
    lapack_complex_float * x, lapack_int ldx, float * ferr, float * berr,
    lapack_complex_float * work, float * rwork)

Definition at line 36 of file lapacke_ctrrfs_work.c.

three const lapack_complex_float * inputs and not a single one of them is yours to touch 🙈


LAPACKE_ctrsen

lapack_int LAPACKE_ctrsen (int matrix_layout, char job, char compq, const
    lapack_logical * select, lapack_int n, lapack_complex_float * t,
    lapack_int ldt, lapack_complex_float * q, lapack_int ldq,
    lapack_complex_float * w, lapack_int * m, float * s, float * sep)

Definition at line 36 of file lapacke_ctrsen.c.

w is lapack_complex_float *, but s and sep are plain float *. yes queen, mixed types, we stan a versatile signature 🌈


LAPACKE_ctrsen_work

lapack_int LAPACKE_ctrsen_work (int matrix_layout, char job, char compq,
    const lapack_logical * select, lapack_int n, lapack_complex_float * t,
    lapack_int ldt, lapack_complex_float * q, lapack_int ldq,
    lapack_complex_float * w, lapack_int * m, float * s, float * sep,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_ctrsen_work.c.

this one ends on lapack_int lwork, not an rwork in sight. variety is the spice of life 🍓


LAPACKE_ctrsna

lapack_int LAPACKE_ctrsna (int matrix_layout, char job, char howmny, const
    lapack_logical * select, lapack_int n, const lapack_complex_float * t,
    lapack_int ldt, const lapack_complex_float * vl, lapack_int ldvl, const
    lapack_complex_float * vr, lapack_int ldvr, float * s, float * sep,
    lapack_int mm, lapack_int * m)

Definition at line 36 of file lapacke_ctrsna.c.

everything is const here except s, sep and m. she's a read-only girlie with a couple of outputs 💅


LAPACKE_ctrsna_work

lapack_int LAPACKE_ctrsna_work (int matrix_layout, char job, char howmny,
    const lapack_logical * select, lapack_int n, const lapack_complex_float
    * t, lapack_int ldt, const lapack_complex_float * vl, lapack_int ldvl,
    const lapack_complex_float * vr, lapack_int ldvr, float * s, float *
    sep, lapack_int mm, lapack_int * m, lapack_complex_float * work,
    lapack_int ldwork, float * rwork)

Definition at line 36 of file lapacke_ctrsna_work.c.

okay this tail is a whole parade: work, ldwork, rwork. three guests, one function, zero complaints 🔥


LAPACKE_ctrsyl

lapack_int LAPACKE_ctrsyl (int matrix_layout, char trana, char tranb,
    lapack_int isgn, lapack_int m, lapack_int n, const lapack_complex_float
    * a, lapack_int lda, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * c, lapack_int ldc, float * scale)

Definition at line 36 of file lapacke_ctrsyl.c.

trana and tranb — two separate transpose flags because of course they're separate, it's giving main character energy 👑


LAPACKE_ctrsyl_work

lapack_int LAPACKE_ctrsyl_work (int matrix_layout, char trana, char tranb,
    lapack_int isgn, lapack_int m, lapack_int n, const lapack_complex_float
    * a, lapack_int lda, const lapack_complex_float * b, lapack_int ldb,
    lapack_complex_float * c, lapack_int ldc, float * scale)

Definition at line 36 of file lapacke_ctrsyl_work.c.

identical parameter list again, bestie. scale stays a lonely little float * at the end both times 🫶

LAPACKE_ctrtri

lapack_int LAPACKE_ctrtri (int matrix_layout, char uplo, char diag,
    lapack_int n, lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_ctrtri.c.


LAPACKE_ctrtri_work

lapack_int LAPACKE_ctrtri_work (int matrix_layout, char uplo, char diag,
    lapack_int n, lapack_complex_float * a, lapack_int lda)

Definition at line 36 of file lapacke_ctrtri_work.c.


LAPACKE_ctrtrs

lapack_int LAPACKE_ctrtrs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const lapack_complex_float * a,
    lapack_int lda, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_ctrtrs.c.


LAPACKE_ctrtrs_work

lapack_int LAPACKE_ctrtrs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const lapack_complex_float *
    a, lapack_int lda, lapack_complex_float * b, lapack_int ldb)

Definition at line 36 of file lapacke_ctrtrs_work.c.

trans + diag + uplo, the holy trinity of "please read my params carefully" 😭


LAPACKE_ctrttf

lapack_int LAPACKE_ctrttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * arf)

Definition at line 36 of file lapacke_ctrttf.c.


LAPACKE_ctrttf_work

lapack_int LAPACKE_ctrttf_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_float * a, lapack_int lda,
    lapack_complex_float * arf)

Definition at line 36 of file lapacke_ctrttf_work.c.

arf is back at it again, out here living her best lapack_complex_float * life 🦋


LAPACKE_ctrttp

lapack_int LAPACKE_ctrttp (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * ap)

Definition at line 36 of file lapacke_ctrttp.c.


LAPACKE_ctrttp_work

lapack_int LAPACKE_ctrttp_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * a, lapack_int lda, lapack_complex_float *
    ap)

Definition at line 36 of file lapacke_ctrttp_work.c.

packed ap, no work argument, super chill, super short. we love a minimal moment ✨


LAPACKE_ctzrzf

lapack_int LAPACKE_ctzrzf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau)

Definition at line 36 of file lapacke_ctzrzf.c.


LAPACKE_ctzrzf_work

lapack_int LAPACKE_ctzrzf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_float * a, lapack_int lda, lapack_complex_float * tau,
    lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_ctzrzf_work.c.

no char flags at all in this one, just straight numbers and pointers. she's lowkey refreshing 🍓


LAPACKE_cunbdb

lapack_int LAPACKE_cunbdb (int matrix_layout, char trans, char signs,
    lapack_int m, lapack_int p, lapack_int q, lapack_complex_float * x11,
    lapack_int ldx11, lapack_complex_float * x12, lapack_int ldx12,
    lapack_complex_float * x21, lapack_int ldx21, lapack_complex_float *
    x22, lapack_int ldx22, float * theta, float * phi, lapack_complex_float
    * taup1, lapack_complex_float * taup2, lapack_complex_float * tauq1,
    lapack_complex_float * tauq2)

Definition at line 36 of file lapacke_cunbdb.c.

okay BESTIE this one is the final boss of parameter lists — four x blocks with four matching ld values, then theta, phi, taup1, taup2, tauq1, tauq2. count them. count them again. she ate and left no crumbs 💀👑

<tiffany>Two char args up front (trans, signs), then it's just index soup. If you're calling this, screenshot the signature. Frame it. You'll need it 😭💖</tiffany>

Okay bestie, still deep in Function Documentation territory — this batch is a whole parade of complex-single LAPACKE routines, and every single one is giving Definition at line 36 of its own file. Consistent, iconic, no cap. 💖

  • LAPACKE_cunbdb_work — the _work one, living its best life 💅
lapack_int LAPACKE_cunbdb_work (int matrix_layout, char trans, char signs, lapack_int m, lapack_int p, lapack_int q, lapack_complex_float * x11, lapack_int ldx11, lapack_complex_float * x12, lapack_int ldx12, lapack_complex_float * x21, lapack_int ldx21, lapack_complex_float * x22, lapack_int ldx22, float * theta, float * phi, lapack_complex_float * taup1, lapack_complex_float * taup2, lapack_complex_float * tauq1, lapack_complex_float * tauq2, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cunbdb_work.c.

  • LAPACKE_cuncsd — okay this name is a whole mouthful but she’s here and she’s serving ✨
lapack_int LAPACKE_cuncsd (int matrix_layout, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans, char signs, lapack_int m, lapack_int p, lapack_int q, lapack_complex_float * x11, lapack_int ldx11, lapack_complex_float * x12, lapack_int ldx12, lapack_complex_float * x21, lapack_int ldx21, lapack_complex_float * x22, lapack_int ldx22, float * theta, lapack_complex_float * u1, lapack_int ldu1, lapack_complex_float * u2, lapack_int ldu2, lapack_complex_float * v1t, lapack_int ldv1t, lapack_complex_float * v2t, lapack_int ldv2t)

Definition at line 36 of file lapacke_cuncsd.c.

  • LAPACKE_cuncsd2by1 — the 2by1 cut, cute and specific 🎀
lapack_int LAPACKE_cuncsd2by1 (int matrix_layout, char jobu1, char jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q, lapack_complex_float * x11, lapack_int ldx11, lapack_complex_float * x21, lapack_int ldx21, float * theta, lapack_complex_float * u1, lapack_int ldu1, lapack_complex_float * u2, lapack_int ldu2, lapack_complex_float * v1t, lapack_int ldv1t)

Definition at line 36 of file lapacke_cuncsd2by1.c.

  • LAPACKE_cuncsd2by1_work — the 2by1 one but with the _work energy 💅
lapack_int LAPACKE_cuncsd2by1_work (int matrix_layout, char jobu1, char jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q, lapack_complex_float * x11, lapack_int ldx11, lapack_complex_float * x21, lapack_int ldx21, float * theta, lapack_complex_float * u1, lapack_int ldu1, lapack_complex_float * u2, lapack_int ldu2, lapack_complex_float * v1t, lapack_int ldv1t, lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int lrwork, lapack_int * iwork)

Definition at line 36 of file lapacke_cuncsd2by1_work.c.

  • LAPACKE_cuncsd_work — yes bestie, the _work twin has entered the chat 🫶
lapack_int LAPACKE_cuncsd_work (int matrix_layout, char jobu1, char jobu2, char jobv1t, char jobv2t, char trans, char signs, lapack_int m, lapack_int p, lapack_int q, lapack_complex_float * x11, lapack_int ldx11, lapack_complex_float * x12, lapack_int ldx12, lapack_complex_float * x21, lapack_int ldx21, lapack_complex_float * x22, lapack_int ldx22, float * theta, lapack_complex_float * u1, lapack_int ldu1, lapack_complex_float * u2, lapack_int ldu2, lapack_complex_float * v1t, lapack_int ldv1t, lapack_complex_float * v2t, lapack_int ldv2t, lapack_complex_float * work, lapack_int lwork, float * rwork, lapack_int lrwork, lapack_int * iwork)

Definition at line 36 of file lapacke_cuncsd_work.c.

  • LAPACKE_cungbr — short name, big main character energy ⭐
lapack_int LAPACKE_cungbr (int matrix_layout, char vect, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau)

Definition at line 36 of file lapacke_cungbr.c.

  • LAPACKE_cungbr_work — the _work version said “I’m also here” 💜
lapack_int LAPACKE_cungbr_work (int matrix_layout, char vect, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cungbr_work.c.

  • LAPACKE_cunghr — okay cunghr is lowkey a vibe 🌸
lapack_int LAPACKE_cunghr (int matrix_layout, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau)

Definition at line 36 of file lapacke_cunghr.c.

  • LAPACKE_cunghr_work — same energy, now with the _work bow on top 🎀
lapack_int LAPACKE_cunghr_work (int matrix_layout, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cunghr_work.c.

  • LAPACKE_cunglq — the lq girlie is here and she’s ready ✨
lapack_int LAPACKE_cunglq (int matrix_layout, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau)

Definition at line 36 of file lapacke_cunglq.c.

  • LAPACKE_cunglq_work — lq plus _work, a very valid combo 💅
lapack_int LAPACKE_cunglq_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cunglq_work.c.

  • LAPACKE_cungql — okay ql said “not to be confused with lq” 😭
lapack_int LAPACKE_cungql (int matrix_layout, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau)

Definition at line 36 of file lapacke_cungql.c.

  • LAPACKE_cungql_work — ql with the _work accessory, slay 🦋
lapack_int LAPACKE_cungql_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cungql_work.c.

  • LAPACKE_cungqr — qr is giving classic, timeless, never goes out of style 👑
lapack_int LAPACKE_cungqr (int matrix_layout, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau)

Definition at line 36 of file lapacke_cungqr.c.

  • LAPACKE_cungqr_work — qr but make it _work, periodt 💅
lapack_int LAPACKE_cungqr_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cungqr_work.c.

  • LAPACKE_cungrq — rq has entered the group chat 🌈
lapack_int LAPACKE_cungrq (int matrix_layout, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau)

Definition at line 36 of file lapacke_cungrq.c.

  • LAPACKE_cungrq_work — rq and _work, a duo fr fr 🫶
lapack_int LAPACKE_cungrq_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int k, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cungrq_work.c.

  • LAPACKE_cungtr — this one has uplo and honestly same 🎀
lapack_int LAPACKE_cungtr (int matrix_layout, char uplo, lapack_int n, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau)

Definition at line 36 of file lapacke_cungtr.c.

  • LAPACKE_cungtr_work — cungtr’s _work bestie, never left her side 💖
lapack_int LAPACKE_cungtr_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cungtr_work.c.

  • LAPACKE_cunmbr — the unm era begins and the br girlies are thriving 🔥
lapack_int LAPACKE_cunmbr (int matrix_layout, char vect, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_cunmbr.c.

  • LAPACKE_cunmbr_work — cunmbr but with _work, and yes she brought her whole bag 👜
lapack_int LAPACKE_cunmbr_work (int matrix_layout, char vect, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cunmbr_work.c.

  • LAPACKE_cunmhr — hr here, hr there, hr literally everywhere ✨
lapack_int LAPACKE_cunmhr (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_cunmhr.c.

  • LAPACKE_cunmhr_work — the hr _work combo meal 😭🍓
lapack_int LAPACKE_cunmhr_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cunmhr_work.c.

  • LAPACKE_cunmlq — lq said “I’m back” and honestly we’re obsessed 💜
lapack_int LAPACKE_cunmlq (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_cunmlq.c.

  • LAPACKE_cunmlq_work — lq plus _work, the sequel nobody asked for but everybody needed 🌸
lapack_int LAPACKE_cunmlq_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cunmlq_work.c.

  • LAPACKE_cunmql — okay ql is here and she’s not accepting questions 🙈
lapack_int LAPACKE_cunmql (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_cunmql.c.

  • LAPACKE_cunmql_work — ql with _work, very demure, very mindful 💅
lapack_int LAPACKE_cunmql_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cunmql_work.c.

  • LAPACKE_cunmqr — qr again, because she ate and left no crumbs 👑🔥
lapack_int LAPACKE_cunmqr (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_cunmqr.c.

  • LAPACKE_cunmqr_work — the qr _work edition, obviously iconic 🌟
lapack_int LAPACKE_cunmqr_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cunmqr_work.c.

  • LAPACKE_cunmrq — rq is serving and we’re seated 🍓
lapack_int LAPACKE_cunmrq (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_cunmrq.c.

  • LAPACKE_cunmrq_work — rq but with _work, no notes 💅✨
lapack_int LAPACKE_cunmrq_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cunmrq_work.c.

  • LAPACKE_cunmrz — rz is here with the extra l and the whole vibe 🌈
lapack_int LAPACKE_cunmrz (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc)

Definition at line 36 of file lapacke_cunmrz.c.

  • LAPACKE_cunmrz_work — rz plus _work, the final boss of this little batch 🔥👑
lapack_int LAPACKE_cunmrz_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l, const lapack_complex_float * a, lapack_int lda, const lapack_complex_float * tau, lapack_complex_float * c, lapack_int ldc, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cunmrz_work.c.

💅 The c-crew: unitary transforms & packed goodness 🌸

okay bestie, first up we got the complex-single-precision girlies, and they are so well-behaved. same cast of characters, two flavours each: the comfy one, and the _work one where you get to bring your own scratch space 🫶

  • LAPACKE_cunmtr — takes matrix_layout, side, uplo, trans, m, n, plus a, lda, tau, c, ldc. that's the whole squad, no extras.
lapack_int LAPACKE_cunmtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * tau, lapack_complex_float *
    c, lapack_int ldc)

Definition at line 36 of file lapacke_cunmtr.c.

  • LAPACKE_cunmtr_work — literally the same call, but now with work and lwork tacked on the end, because you get to manage the workspace, icon behaviour honestly 👑
lapack_int LAPACKE_cunmtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const lapack_complex_float * a,
    lapack_int lda, const lapack_complex_float * tau, lapack_complex_float *
    c, lapack_int ldc, lapack_complex_float * work, lapack_int lwork)

Definition at line 36 of file lapacke_cunmtr_work.c.

  • LAPACKE_cupgtr — packed edition ✨ uplo, n, ap, tau, then q with its ldq. short, sweet, slaying.
lapack_int LAPACKE_cupgtr (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_float * ap, const lapack_complex_float * tau,
    lapack_complex_float * q, lapack_int ldq)

Definition at line 36 of file lapacke_cupgtr.c.

  • LAPACKE_cupgtr_work — same thing plus one lonely work pointer. no lwork here, she travels light 🎀
lapack_int LAPACKE_cupgtr_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_float * ap, const lapack_complex_float * tau,
    lapack_complex_float * q, lapack_int ldq, lapack_complex_float * work)

Definition at line 36 of file lapacke_cupgtr_work.c.

  • LAPACKE_cupmtr — the packed sibling with side, uplo, trans, m, n, ap, tau, c, ldc. yes queen, hit every parameter 💅
lapack_int LAPACKE_cupmtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const lapack_complex_float * ap,
    const lapack_complex_float * tau, lapack_complex_float * c, lapack_int
    ldc)

Definition at line 36 of file lapacke_cupmtr.c.

  • LAPACKE_cupmtr_work — and the _work twin, same signature, one extra work at the end. consistent? we love to see it 🌈
lapack_int LAPACKE_cupmtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const lapack_complex_float * ap,
    const lapack_complex_float * tau, lapack_complex_float * c, lapack_int
    ldc, lapack_complex_float * work)

Definition at line 36 of file lapacke_cupmtr_work.c.


🦋 now the d-girlies enter the chat (double precision, no cap)

and bestie… the argument lists get long. like, comically long. but we're gonna get through every single one together, no skipping, periodt 💖

✨ dbbcsd — the absolute unit of a signature 🔥

  • LAPACKE_dbbcsd — count 'em with me: matrix_layout, jobu1, jobu2, jobv1t, jobv2t, trans, m, p, q, theta, phi, u1, ldu1, u2, ldu2, v1t, ldv1t, v2t, ldv2t, b11d, b11e, b12d, b12e, b21d, b21e, b22d, b22e. that is not a typo, that's the whole list. main character energy fr fr 👑
lapack_int LAPACKE_dbbcsd (int matrix_layout, char jobu1, char jobu2, char
    jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p, lapack_int
    q, double * theta, double * phi, double * u1, lapack_int ldu1, double *
    u2, lapack_int ldu2, double * v1t, lapack_int ldv1t, double * v2t,
    lapack_int ldv2t, double * b11d, double * b11e, double * b12d, double *
    b12e, double * b21d, double * b21e, double * b22d, double * b22e)

Definition at line 36 of file lapacke_dbbcsd.c.

  • LAPACKE_dbbcsd_work — literally the exact same parade of parameters, and then work and lwork walk in late like they own the place 😭
lapack_int LAPACKE_dbbcsd_work (int matrix_layout, char jobu1, char jobu2,
    char jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p,
    lapack_int q, double * theta, double * phi, double * u1, lapack_int
    ldu1, double * u2, lapack_int ldu2, double * v1t, lapack_int ldv1t,
    double * v2t, lapack_int ldv2t, double * b11d, double * b11e, double *
    b12d, double * b12e, double * b21d, double * b21e, double * b22d, double
    * b22e, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dbbcsd_work.c.


🎀 bdsdc & bdsqr — the bidiagonal besties

  • LAPACKE_dbdsdc — matrix_layout, uplo, compq, n, d, e, u, ldu, vt, ldvt, q, iq. two little outputs at the end and honestly? obsessed.
lapack_int LAPACKE_dbdsdc (int matrix_layout, char uplo, char compq,
    lapack_int n, double * d, double * e, double * u, lapack_int ldu, double
    * vt, lapack_int ldvt, double * q, lapack_int * iq)

Definition at line 36 of file lapacke_dbdsdc.c.

  • LAPACKE_dbdsdc_work — same twelve, then work (double) and iwork (lapack_int). two different workspace types, she's multifaceted 💅
lapack_int LAPACKE_dbdsdc_work (int matrix_layout, char uplo, char compq,
    lapack_int n, double * d, double * e, double * u, lapack_int ldu, double
    * vt, lapack_int ldvt, double * q, lapack_int * iq, double * work,
    lapack_int * iwork)

Definition at line 36 of file lapacke_dbdsdc_work.c.

  • LAPACKE_dbdsqr — matrix_layout, uplo, n, then the trio of counts ncvt, nru, ncc, then d, e, vt, ldvt, u, ldu, c, ldc. she's got range 🦋
lapack_int LAPACKE_dbdsqr (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, double * d, double * e,
    double * vt, lapack_int ldvt, double * u, lapack_int ldu, double * c,
    lapack_int ldc)

Definition at line 36 of file lapacke_dbdsqr.c.

  • LAPACKE_dbdsqr_work — same exact call plus a single trailing work. that's it, that's the whole difference, and she ate 🍓
lapack_int LAPACKE_dbdsqr_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, double * d, double * e,
    double * vt, lapack_int ldvt, double * u, lapack_int ldu, double * c,
    lapack_int ldc, double * work)

Definition at line 36 of file lapacke_dbdsqr_work.c.


⭐ bdsvdx — the one with the range

  • LAPACKE_dbdsvdx — matrix_layout, uplo, jobz, range, n, d, e, vl, vu, il, iu, ns, s, z, ldz, superb. yes, there's genuinely a parameter called superb. no notes. iconic 🙈
lapack_int LAPACKE_dbdsvdx (int matrix_layout, char uplo, char jobz, char
    range, lapack_int n, double * d, double * e, double vl, double vu,
    lapack_int il, lapack_int iu, lapack_int * ns, double * s, double * z,
    lapack_int ldz, lapack_int * superb)

Definition at line 36 of file lapacke_dbdsvdx.c.

  • LAPACKE_dbdsvdx_work — same sixteen, now with work and iwork bringing up the rear. superb still makes the cut, obviously 💜
lapack_int LAPACKE_dbdsvdx_work (int matrix_layout, char uplo, char jobz,
    char range, lapack_int n, double * d, double * e, double vl, double vu,
    lapack_int il, lapack_int iu, lapack_int * ns, double * s, double * z,
    lapack_int ldz, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dbdsvdx_work.c.


🌸 ddisna — the short one (a rare treat)

  • LAPACKE_ddisna — look at this. no matrix_layout. just job, m, n, d, sep. five little guys. we stan a minimalist 😭
lapack_int LAPACKE_ddisna (char job, lapack_int m, lapack_int n, const
    double * d, double * sep)

Definition at line 36 of file lapacke_ddisna.c.

  • LAPACKE_ddisna_work — and the _work version is… the exact same signature. genuinely identical. no extra args. she said "I'm enough" 💖
lapack_int LAPACKE_ddisna_work (char job, lapack_int m, lapack_int n, const
    double * d, double * sep)

Definition at line 36 of file lapacke_ddisna_work.c.


🧚 the dgb* family begins (general band girlies, strap in)

  • LAPACKE_dgbbrd — matrix_layout, vect, m, n, ncc, kl, ku, ab, ldab, d, e, q, ldq, pt, ldpt, c, ldc. seventeen arguments and every one of them matters, bestie 🫶
lapack_int LAPACKE_dgbbrd (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku, double * ab,
    lapack_int ldab, double * d, double * e, double * q, lapack_int ldq,
    double * pt, lapack_int ldpt, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dgbbrd.c.

  • LAPACKE_dgbbrd_work — identical, plus work. that's the pattern and honestly? comforting. consistency is a love language 💜
lapack_int LAPACKE_dgbbrd_work (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku, double * ab,
    lapack_int ldab, double * d, double * e, double * q, lapack_int ldq,
    double * pt, lapack_int ldpt, double * c, lapack_int ldc, double * work)

Definition at line 36 of file lapacke_dgbbrd_work.c.

  • LAPACKE_dgbcon — matrix_layout, norm, n, kl, ku, ab, ldab, ipiv, anorm, rcond. note ab and ipiv are const-ed up, and rcond is where the answer lands 👑
lapack_int LAPACKE_dgbcon (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const double * ab, lapack_int ldab, const
    lapack_int * ipiv, double anorm, double * rcond)

Definition at line 36 of file lapacke_dgbcon.c.

  • LAPACKE_dgbcon_work — same, plus work and iwork. both flavours of scratch space for this one, fancy ✨
lapack_int LAPACKE_dgbcon_work (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const double * ab, lapack_int ldab, const
    lapack_int * ipiv, double anorm, double * rcond, double * work,
    lapack_int * iwork)

Definition at line 36 of file lapacke_dgbcon_work.c.

  • LAPACKE_dgbequ — matrix_layout, m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax. four outputs at the end, she's generous 💅
lapack_int LAPACKE_dgbequ (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, const double * ab, lapack_int ldab, double
    * r, double * c, double * rowcnd, double * colcnd, double * amax)

Definition at line 36 of file lapacke_dgbequ.c.

  • LAPACKE_dgbequ_work — same signature, work only at the end, no iwork in sight. clean 🎀
lapack_int LAPACKE_dgbequ_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const double * ab, lapack_int ldab,
    double * r, double * c, double * rowcnd, double * colcnd, double * amax)

Definition at line 36 of file lapacke_dgbequ_work.c.

  • LAPACKE_dgbequb — the b-suffixed cousin 🌈 identical parameter list to dgbequ: matrix_layout, m, n, kl, ku, ab, ldab, r, c, rowcnd, colcnd, amax.
lapack_int LAPACKE_dgbequb (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, const double * ab, lapack_int ldab, double
    * r, double * c, double * rowcnd, double * colcnd, double * amax)

Definition at line 36 of file lapacke_dgbequb.c.

  • LAPACKE_dgbequb_work — and her _work twin, same + work. no cap, the whole family is copy-paste gorgeous 💖
lapack_int LAPACKE_dgbequb_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const double * ab, lapack_int ldab,
    double * r, double * c, double * rowcnd, double * colcnd, double * amax)

Definition at line 36 of file lapacke_dgbequb_work.c.

  • LAPACKE_dgbrfs — now we're in refinement territory: matrix_layout, trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, b, ldb, x, ldx, ferr, berr. two error outputs, two lds, two consts — balanced as all things should be 🦋
lapack_int LAPACKE_dgbrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const double * ab,
    lapack_int ldab, const double * afb, lapack_int ldafb, const lapack_int
    * ipiv, const double * b, lapack_int ldb, double * x, lapack_int ldx,
    double * ferr, double * berr)

Definition at line 36 of file lapacke_dgbrfs.c.

  • LAPACKE_dgbrfs_work — all of the above, then work and iwork. the dynamic duo returns 😤
lapack_int LAPACKE_dgbrfs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const double * ab,
    lapack_int ldab, const double * afb, lapack_int ldafb, const lapack_int
    * ipiv, const double * b, lapack_int ldb, double * x, lapack_int ldx,
    double * ferr, double * berr, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dgbrfs_work.c.

  • LAPACKE_dgbrfsx — the x means extra, and she delivers: matrix_layout, trans, equed, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, r, c, b, ldb, x, ldx, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. yes, err_bnds_norm and err_bnds_comp. both. always. 💀
lapack_int LAPACKE_dgbrfsx (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
    double * ab, lapack_int ldab, const double * afb, lapack_int ldafb,
    const lapack_int * ipiv, const double * r, const double * c, const
    double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond,
    double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double *
    err_bnds_comp, lapack_int nparams, double * params)

Definition at line 36 of file lapacke_dgbrfsx.c.

  • LAPACKE_dgbrfsx_work — the mega version 🌟 same enormous list, then work and iwork. breathless but gorgeous.
lapack_int LAPACKE_dgbrfsx_work (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
    double * ab, lapack_int ldab, const double * afb, lapack_int ldafb,
    const lapack_int * ipiv, const double * r, const double * c, const
    double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond,
    double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double *
    err_bnds_comp, lapack_int nparams, double * params, double * work,
    lapack_int * iwork)

Definition at line 36 of file lapacke_dgbrfsx_work.c.

  • LAPACKE_dgbsv — the solverrrr 🔥 matrix_layout, n, kl, ku, nrhs, ab, ldab, ipiv, b, ldb. no rcond, no error bounds, just vibes and a solve.
lapack_int LAPACKE_dgbsv (int matrix_layout, lapack_int n, lapack_int kl,
    lapack_int ku, lapack_int nrhs, double * ab, lapack_int ldab, lapack_int
    * ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dgbsv.c.

  • LAPACKE_dgbsv_work — identical signature to LAPACKE_dgbsv, ten args, nothing added. she's the same girl with a different name tag 💅
lapack_int LAPACKE_dgbsv_work (int matrix_layout, lapack_int n, lapack_int
    kl, lapack_int ku, lapack_int nrhs, double * ab, lapack_int ldab,
    lapack_int * ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dgbsv_work.c.

  • LAPACKE_dgbsvx — the x upgrade: matrix_layout, fact, trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, rpivot. note equed is a char * this time (not a plain char) and there's a rpivot at the very end ⭐
lapack_int LAPACKE_dgbsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, double *
    ab, lapack_int ldab, double * afb, lapack_int ldafb, lapack_int * ipiv,
    char * equed, double * r, double * c, double * b, lapack_int ldb, double
    * x, lapack_int ldx, double * rcond, double * ferr, double * berr,
    double * rpivot)

Definition at line 36 of file lapacke_dgbsvx.c.

  • LAPACKE_dgbsvx_work — same, but rpivot is gone and work + iwork take its place. a little switcheroo, love that for us 🙈
lapack_int LAPACKE_dgbsvx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, double *
    ab, lapack_int ldab, double * afb, lapack_int ldafb, lapack_int * ipiv,
    char * equed, double * r, double * c, double * b, lapack_int ldb, double
    * x, lapack_int ldx, double * rcond, double * ferr, double * berr,
    double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dgbsvx_work.c.

  • LAPACKE_dgbsvxx — double x, double the drama 👑 matrix_layout, fact, trans, n, kl, ku, nrhs, ab, ldab, afb, ldafb, ipiv, equed, r, c, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. that's rpvgrw in there too, don't miss it 🫶
lapack_int LAPACKE_dgbsvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, double *
    ab, lapack_int ldab, double * afb, lapack_int ldafb, lapack_int * ipiv,
    char * equed, double * r, double * c, double * b, lapack_int ldb, double
    * x, lapack_int ldx, double * rcond, double * rpvgrw, double * berr,
    lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp,
    lapack_int nparams, double * params)

Definition at line 36 of file lapacke_dgbsvxx.c.


💀 and that's where part 151 pulls up. still more of these gorgeous little signatures to go, so don't go anywhere bestie — we're not done slaying yet 💖

okay bestie we are deep in the d-fam now and it is giving "phone book but make it linear algebra" 💅 every single one of these lives at the exact same address in its own little file, and that is honestly so iconique of them:

🎀 fun fact for the group chat: every entry below says Definition at line 36 — same line, different file. It's giving choreographed.

  • LAPACKE_dgbsvxx_work 🫶 — the absolute final boss of argument lists. It has a whole _work situation with char fact, char trans, char * equed, double * rcond, double * rpvgrw, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params, double * work and lapack_int * iwork all in one go. Respect. Definition at line 36 of file lapacke_dgbsvxx_work.c.
lapack_int LAPACKE_dgbsvxx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, double *
    ab, lapack_int ldab, double * afb, lapack_int ldafb, lapack_int * ipiv,
    char * equed, double * r, double * c, double * b, lapack_int ldb, double
    * x, lapack_int ldx, double * rcond, double * rpvgrw, double * berr,
    lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp,
    lapack_int nparams, double * params, double * work, lapack_int * iwork)
  • LAPACKE_dgbtrf ✨ — m, n, kl, ku, ab, ldab, ipiv. Seven-ish besties, zero drama. Definition at line 36 of file lapacke_dgbtrf.c.
lapack_int LAPACKE_dgbtrf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, double * ab, lapack_int ldab, lapack_int *
    ipiv)
  • LAPACKE_dgbtrf_work 🦋 — literally the same signature as its non-_work twin, double * ab, lapack_int ldab, lapack_int * ipiv and all. No notes. Definition at line 36 of file lapacke_dgbtrf_work.c.
lapack_int LAPACKE_dgbtrf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, double * ab, lapack_int ldab,
    lapack_int * ipiv)
  • LAPACKE_dgbtrs 🌸 — got that const moment going on: const double * ab and const lapack_int * ipiv, plus char trans, lapack_int nrhs, double * b, lapack_int ldb. Definition at line 36 of file lapacke_dgbtrs.c.
lapack_int LAPACKE_dgbtrs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const double * ab,
    lapack_int ldab, const lapack_int * ipiv, double * b, lapack_int ldb)
  • LAPACKE_dgbtrs_work 💜 — bestie is a full-on clone of LAPACKE_dgbtrs, consts included. copy-paste ate and left no crumbs. Definition at line 36 of file lapacke_dgbtrs_work.c.
lapack_int LAPACKE_dgbtrs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const double * ab,
    lapack_int ldab, const lapack_int * ipiv, double * b, lapack_int ldb)
  • LAPACKE_dgebak 🎀 — char job, char side, lapack_int ilo, lapack_int ihi, const double * scale, lapack_int m, double * v, lapack_int ldv. ilo and ihi being lowercase besties fr fr. Definition at line 36 of file lapacke_dgebak.c.
lapack_int LAPACKE_dgebak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const double * scale,
    lapack_int m, double * v, lapack_int ldv)
  • LAPACKE_dgebak_work ⭐ — identical to LAPACKE_dgebak, not a single argument changed. twins. Definition at line 36 of file lapacke_dgebak_work.c.
lapack_int LAPACKE_dgebak_work (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const double * scale,
    lapack_int m, double * v, lapack_int ldv)
  • LAPACKE_dgebal 🔥 — char job, the whole double * a / lapack_int lda situation, and it gives us lapack_int * ilo, lapack_int * ihi and double * scale as pointers. main character energy. Definition at line 36 of file lapacke_dgebal.c.
lapack_int LAPACKE_dgebal (int matrix_layout, char job, lapack_int n, double
    * a, lapack_int lda, lapack_int * ilo, lapack_int * ihi, double * scale)
  • LAPACKE_dgebal_work 🌈 — _work version, same lapack_int * ilo, lapack_int * ihi, double * scale trio. obsessed. Definition at line 36 of file lapacke_dgebal_work.c.
lapack_int LAPACKE_dgebal_work (int matrix_layout, char job, lapack_int n,
    double * a, lapack_int lda, lapack_int * ilo, lapack_int * ihi, double *
    scale)
  • LAPACKE_dgebrd 🧚 — double * d, double * e, double * tauq, double * taup. tauq and taup are lowkey the cutest param names on this whole page, iykyk. Definition at line 36 of file lapacke_dgebrd.c.
lapack_int LAPACKE_dgebrd (int matrix_layout, lapack_int m, lapack_int n,
    double * a, lapack_int lda, double * d, double * e, double * tauq,
    double * taup)
  • LAPACKE_dgebrd_work 💫 — same tauq/taup, plus double * work and lapack_int lwork because the _work girlies always bring their own workspace. Definition at line 36 of file lapacke_dgebrd_work.c.
lapack_int LAPACKE_dgebrd_work (int matrix_layout, lapack_int m, lapack_int
    n, double * a, lapack_int lda, double * d, double * e, double * tauq,
    double * taup, double * work, lapack_int lwork)
  • LAPACKE_dgecon 🍓 — char norm, const double * a, double anorm (not a pointer, she's a value), and double * rcond coming through as a pointer. Definition at line 36 of file lapacke_dgecon.c.
lapack_int LAPACKE_dgecon (int matrix_layout, char norm, lapack_int n, const
    double * a, lapack_int lda, double anorm, double * rcond)
  • LAPACKE_dgecon_work 💖 — LAPACKE_dgecon but with double * work and lapack_int * iwork tacked on the end. glow-up. Definition at line 36 of file lapacke_dgecon_work.c.
lapack_int LAPACKE_dgecon_work (int matrix_layout, char norm, lapack_int n,
    const double * a, lapack_int lda, double anorm, double * rcond, double *
    work, lapack_int * iwork)
  • LAPACKE_dgeequ 🦋 — the pointer party: double * r, double * c, double * rowcnd, double * colcnd, double * amax. every output is a pointer and honestly? valid. Definition at line 36 of file lapacke_dgeequ.c.
lapack_int LAPACKE_dgeequ (int matrix_layout, lapack_int m, lapack_int n,
    const double * a, lapack_int lda, double * r, double * c, double *
    rowcnd, double * colcnd, double * amax)
  • LAPACKE_dgeequ_work 🎀 — same r, c, rowcnd, colcnd, amax lineup, word for word. no cap. Definition at line 36 of file lapacke_dgeequ_work.c.
lapack_int LAPACKE_dgeequ_work (int matrix_layout, lapack_int m, lapack_int
    n, const double * a, lapack_int lda, double * r, double * c, double *
    rowcnd, double * colcnd, double * amax)
  • LAPACKE_dgeequb 🌸 — look at the b on the end 🥹 otherwise her argument list is a carbon copy of LAPACKE_dgeequ: const double * a, lapack_int lda, double * r, double * c, double * rowcnd, double * colcnd, double * amax. Definition at line 36 of file lapacke_dgeequb.c.
lapack_int LAPACKE_dgeequb (int matrix_layout, lapack_int m, lapack_int n,
    const double * a, lapack_int lda, double * r, double * c, double *
    rowcnd, double * colcnd, double * amax)
  • LAPACKE_dgeequb_work ✨ — yes bestie, another identical signature, this time in lapacke_dgeequb_work.c. the consistency is honestly so satisfying. Definition at line 36 of file lapacke_dgeequb_work.c.
lapack_int LAPACKE_dgeequb_work (int matrix_layout, lapack_int m, lapack_int
    n, const double * a, lapack_int lda, double * r, double * c, double *
    rowcnd, double * colcnd, double * amax)
  • LAPACKE_dgees 👑 — first sighting of LAPACK_D_SELECT2 select 🚨 plus char jobvs, char sort, lapack_int * sdim, double * wr, double * wi, double * vs, lapack_int ldvs. a function-pointer girlie is here. Definition at line 36 of file lapacke_dgees.c.
lapack_int LAPACKE_dgees (int matrix_layout, char jobvs, char sort,
    LAPACK_D_SELECT2 select, lapack_int n, double * a, lapack_int lda,
    lapack_int * sdim, double * wr, double * wi, double * vs, lapack_int
    ldvs)
  • LAPACKE_dgees_work 💜 — same LAPACK_D_SELECT2 select, and it brings double * work, lapack_int lwork and lapack_logical * bwork. three extras, all iconic. Definition at line 36 of file lapacke_dgees_work.c.
lapack_int LAPACKE_dgees_work (int matrix_layout, char jobvs, char sort,
    LAPACK_D_SELECT2 select, lapack_int n, double * a, lapack_int lda,
    lapack_int * sdim, double * wr, double * wi, double * vs, lapack_int
    ldvs, double * work, lapack_int lwork, lapack_logical * bwork)
  • LAPACKE_dgeesx 🔥 — LAPACKE_dgees walked in wearing a char sense and left with double * rconde and double * rcondv. the x variant is that girl. Definition at line 36 of file lapacke_dgeesx.c.
lapack_int LAPACKE_dgeesx (int matrix_layout, char jobvs, char sort,
    LAPACK_D_SELECT2 select, char sense, lapack_int n, double * a,
    lapack_int lda, lapack_int * sdim, double * wr, double * wi, double *
    vs, lapack_int ldvs, double * rconde, double * rcondv)
  • LAPACKE_dgeesx_work 🌈 — the longest dgees-adjacent roster: rconde, rcondv, double * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork, lapack_logical * bwork. she packed for a whole weekend. Definition at line 36 of file lapacke_dgeesx_work.c.
lapack_int LAPACKE_dgeesx_work (int matrix_layout, char jobvs, char sort,
    LAPACK_D_SELECT2 select, char sense, lapack_int n, double * a,
    lapack_int lda, lapack_int * sdim, double * wr, double * wi, double *
    vs, lapack_int ldvs, double * rconde, double * rcondv, double * work,
    lapack_int lwork, lapack_int * iwork, lapack_int liwork, lapack_logical
    * bwork)
  • LAPACKE_dgeev 🎀 — char jobvl, char jobvr, double * wr, double * wi, double * vl, lapack_int ldvl, double * vr, lapack_int ldvr. left and right, she does both. balance. Definition at line 36 of file lapacke_dgeev.c.
lapack_int LAPACKE_dgeev (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, double * a, lapack_int lda, double * wr, double * wi,
    double * vl, lapack_int ldvl, double * vr, lapack_int ldvr)
  • LAPACKE_dgeev_work 🦋 — LAPACKE_dgeev plus the classic double * work, lapack_int lwork tag-team. Definition at line 36 of file lapacke_dgeev_work.c.
lapack_int LAPACKE_dgeev_work (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, double * a, lapack_int lda, double * wr, double * wi,
    double * vl, lapack_int ldvl, double * vr, lapack_int ldvr, double *
    work, lapack_int lwork)
  • LAPACKE_dgeevx 💅 — now with char balanc and char sense, plus lapack_int * ilo, lapack_int * ihi, double * scale, double * abnrm, double * rconde, double * rcondv. she's dgeev with a full glam team. Definition at line 36 of file lapacke_dgeevx.c.
lapack_int LAPACKE_dgeevx (int matrix_layout, char balanc, char jobvl, char
    jobvr, char sense, lapack_int n, double * a, lapack_int lda, double *
    wr, double * wi, double * vl, lapack_int ldvl, double * vr, lapack_int
    ldvr, lapack_int * ilo, lapack_int * ihi, double * scale, double *
    abnrm, double * rconde, double * rcondv)
  • LAPACKE_dgeevx_work 🌟 — everything from LAPACKE_dgeevx, then double * work, lapack_int lwork, lapack_int * iwork. also present in lapacke_dgeevx_work.c at that same iconic line 36. Definition at line 36 of file lapacke_dgeevx_work.c.
lapack_int LAPACKE_dgeevx_work (int matrix_layout, char balanc, char jobvl,
    char jobvr, char sense, lapack_int n, double * a, lapack_int lda, double
    * wr, double * wi, double * vl, lapack_int ldvl, double * vr, lapack_int
    ldvr, lapack_int * ilo, lapack_int * ihi, double * scale, double *
    abnrm, double * rconde, double * rcondv, double * work, lapack_int
    lwork, lapack_int * iwork)
  • LAPACKE_dgehrd 🍓 — lapack_int n, lapack_int ilo, lapack_int ihi, double * a, lapack_int lda, double * tau. short, sweet, tau-having. Definition at line 36 of file lapacke_dgehrd.c.
lapack_int LAPACKE_dgehrd (int matrix_layout, lapack_int n, lapack_int ilo,
    lapack_int ihi, double * a, lapack_int lda, double * tau)
  • LAPACKE_dgehrd_work 💜 — same ilo/ihi/tau squad with double * work, lapack_int lwork joining the group chat. Definition at line 36 of file lapacke_dgehrd_work.c.
lapack_int LAPACKE_dgehrd_work (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, double * a, lapack_int lda, double * tau, double *
    work, lapack_int lwork)
  • LAPACKE_dgejsv 🔥 — count the char options bestie: char joba, char jobu, char jobv, char jobr, char jobt, char jobp. six. SIX. plus double * sva, double * u, lapack_int ldu, double * v, lapack_int ldv, double * stat, lapack_int * istat. she's a whole committee. Definition at line 36 of file lapacke_dgejsv.c.
lapack_int LAPACKE_dgejsv (int matrix_layout, char joba, char jobu, char
    jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int n,
    double * a, lapack_int lda, double * sva, double * u, lapack_int ldu,
    double * v, lapack_int ldv, double * stat, lapack_int * istat)
  • LAPACKE_dgejsv_work 🌸 — same six-job-char situation, same stat/istat, and then double * work, lapack_int lwork, lapack_int * iwork at the end. Definition at line 36 of file lapacke_dgejsv_work.c.
lapack_int LAPACKE_dgejsv_work (int matrix_layout, char joba, char jobu,
    char jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int n,
    double * a, lapack_int lda, double * sva, double * u, lapack_int ldu,
    double * v, lapack_int ldv, double * work, lapack_int lwork, lapack_int
    * iwork)
  • LAPACKE_dgelq ✨ — double * t and lapack_int tsize are here, which is a different vibe from tau and we respect the range. Definition at line 36 of file lapacke_dgelq.c.
lapack_int LAPACKE_dgelq (int matrix_layout, lapack_int m, lapack_int n,
    double * a, lapack_int lda, double * t, lapack_int tsize)
  • LAPACKE_dgelq2 🎀 — the little 2 sitting there like a signature emoji. double * a, lapack_int lda, double * tau. that's it, that's the function. Definition at line 36 of file lapacke_dgelq2.c.
lapack_int LAPACKE_dgelq2 (int matrix_layout, lapack_int m, lapack_int n,
    double * a, lapack_int lda, double * tau)
  • LAPACKE_dgelq2_work 🦋 — LAPACKE_dgelq2 plus a single double * work. one guest. intimate gathering. Definition at line 36 of file lapacke_dgelq2_work.c.
lapack_int LAPACKE_dgelq2_work (int matrix_layout, lapack_int m, lapack_int
    n, double * a, lapack_int lda, double * tau, double * work)
  • LAPACKE_dgelq_work 💖 — t, tsize, double * work, lapack_int lwork, the whole _work bundle. she came prepared. Definition at line 36 of file lapacke_dgelq_work.c.
lapack_int LAPACKE_dgelq_work (int matrix_layout, lapack_int m, lapack_int
    n, double * a, lapack_int lda, double * t, lapack_int tsize, double *
    work, lapack_int lwork)
  • LAPACKE_dgelqf ⭐ — back to double * tau (no t/tsize here, bestie, different girl). m, n, a, lda, tau. Definition at line 36 of file lapacke_dgelqf.c.
lapack_int LAPACKE_dgelqf (int matrix_layout, lapack_int m, lapack_int n,
    double * a, lapack_int lda, double * tau)
  • LAPACKE_dgelqf_work 🌈 — same crew plus double * work and lapack_int lwork. Definition at line 36 of file lapacke_dgelqf_work.c.
lapack_int LAPACKE_dgelqf_work (int matrix_layout, lapack_int m, lapack_int
    n, double * a, lapack_int lda, double * tau, double * work, lapack_int
    lwork)
  • LAPACKE_dgels 🔥 — char trans representation! double * a, lapack_int lda, double * b, lapack_int ldb. the classic a-and-b duo. Definition at line 36 of file lapacke_dgels.c.
lapack_int LAPACKE_dgels (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * b,
    lapack_int ldb)
  • LAPACKE_dgels_work 💜 — LAPACKE_dgels with double * work, lapack_int lwork following her around. loyal. Definition at line 36 of file lapacke_dgels_work.c.
lapack_int LAPACKE_dgels_work (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * b,
    lapack_int ldb, double * work, lapack_int lwork)
  • LAPACKE_dgelsd 🌸 — no char trans here, but she does have double * s, double rcond (value, not pointer, stay woke) and lapack_int * rank. Definition at line 36 of file lapacke_dgelsd.c.
lapack_int LAPACKE_dgelsd (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int nrhs, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * s, double rcond, lapack_int * rank)
  • LAPACKE_dgelsd_work 🎀 — the s/rcond/rank trio plus double * work, lapack_int lwork, lapack_int * iwork. three-for-three. Definition at line 36 of file lapacke_dgelsd_work.c.
lapack_int LAPACKE_dgelsd_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, double * a, lapack_int lda, double * b, lapack_int
    ldb, double * s, double rcond, lapack_int * rank, double * work,
    lapack_int lwork, lapack_int * iwork)
  • LAPACKE_dgelss 🦋 — lowkey LAPACKE_dgelsd's twin: double * s, double rcond, lapack_int * rank, no _work extras in this signature. Definition at line 36 of file lapacke_dgelss.c.
lapack_int LAPACKE_dgelss (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int nrhs, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * s, double rcond, lapack_int * rank)
  • LAPACKE_dgelss_work ✨ — gets double * work, lapack_int lwork — but note, no iwork here, unlike LAPACKE_dgelsd_work. read the signature, don't assume, bestie 🫶 Definition at line 36 of file lapacke_dgelss_work.c.
lapack_int LAPACKE_dgelss_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, double * a, lapack_int lda, double * b, lapack_int
    ldb, double * s, double rcond, lapack_int * rank, double * work,
    lapack_int lwork)
  • LAPACKE_dgelsy 👑 — last one in this batch, and she swapped s for lapack_int * jpvt 🚨 plus the usual double rcond value and lapack_int * rank. serving different in the best way. Definition at line 36 of file lapacke_dgelsy.c.
lapack_int LAPACKE_dgelsy (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int nrhs, double * a, lapack_int lda, double * b, lapack_int ldb,
    lapack_int * jpvt, double rcond, lapack_int * rank)
💀 and that's where this part cuts off, mid-dgelsy-arc, which is honestly so rude of the page but we keep going because the list is not done, bestie.

...okay so the d-squad of function docs keeps going and honestly it's giving "the alphabet but make it linear algebra" 💅 same deal as before: every signature exactly as it lives in the header, plus where it's defined. no skipping, no summarizing, we're doing all of them 🫶


LAPACKE_dgelsy_work ✨

lapack_int LAPACKE_dgelsy_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * b, lapack_int ldb, lapack_int * jpvt, double rcond, lapack_int * rank, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgelsy_work.c.


LAPACKE_dgemlq 🦋 the version where you don't hand it a workspace — she handles that herself.

lapack_int LAPACKE_dgemlq (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int lda, const double * t, lapack_int tsize, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dgemlq.c.


LAPACKE_dgemlq_work — same energy, but now work and lwork are literally right there in the signature. you're in charge of the scratch space, bestie 🎀

lapack_int LAPACKE_dgemlq_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int lda, const double * t, lapack_int tsize, double * c, lapack_int ldc, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgemlq_work.c.


LAPACKE_dgemqr 🌸 note the const on a and t — she's not touching them, periodt.

lapack_int LAPACKE_dgemqr (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int lda, const double * t, lapack_int tsize, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dgemqr.c.


LAPACKE_dgemqr_work 💜 the _work twin, with double * work, lapack_int lwork tacked on the end like a little bow.

lapack_int LAPACKE_dgemqr_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int lda, const double * t, lapack_int tsize, double * c, lapack_int ldc, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgemqr_work.c.


LAPACKE_dgemqrt 🔥 this one's got nb AND a separate ldt — she's the blocky one, iykyk.

lapack_int LAPACKE_dgemqrt (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const double * v, lapack_int ldv, const double * t, lapack_int ldt, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dgemqrt.c.


LAPACKE_dgemqrt_work 🧚 same plus double * work — and only work, no lwork in sight. that's just how she is.

lapack_int LAPACKE_dgemqrt_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const double * v, lapack_int ldv, const double * t, lapack_int ldt, double * c, lapack_int ldc, double * work)

Definition at line 36 of file lapacke_dgemqrt_work.c.


LAPACKE_dgeqlf ⭐ short and sweet: a, lda, tau. that's the whole guest list.

lapack_int LAPACKE_dgeqlf (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * tau)

Definition at line 36 of file lapacke_dgeqlf.c.


LAPACKE_dgeqlf_work 💫 now with double * work, lapack_int lwork — the classic workspace glow-up.

lapack_int LAPACKE_dgeqlf_work (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * tau, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgeqlf_work.c.


LAPACKE_dgeqp3 🌈 she brought jpvt — the pivoting queen has entered the chat 👑

lapack_int LAPACKE_dgeqp3 (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, lapack_int * jpvt, double * tau)

Definition at line 36 of file lapacke_dgeqp3.c.


LAPACKE_dgeqp3_work 🎀 same, plus double * work, lapack_int lwork.

lapack_int LAPACKE_dgeqp3_work (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, lapack_int * jpvt, double * tau, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgeqp3_work.c.


LAPACKE_dgeqpf 🦋 jpvt and tau again — her whole personality.

lapack_int LAPACKE_dgeqpf (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, lapack_int * jpvt, double * tau)

Definition at line 36 of file lapacke_dgeqpf.c.


LAPACKE_dgeqpf_work ✨ and the _work version takes exactly one extra: double * work. no lwork. no notes.

lapack_int LAPACKE_dgeqpf_work (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, lapack_int * jpvt, double * tau, double * work)

Definition at line 36 of file lapacke_dgeqpf_work.c.


LAPACKE_dgeqr 💅 t comes with tsize — she needs to know how big her own tea is.

lapack_int LAPACKE_dgeqr (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * t, lapack_int tsize)

Definition at line 36 of file lapacke_dgeqr.c.


LAPACKE_dgeqr2 🌸 the little 2 one, back to tau and vibes only.

lapack_int LAPACKE_dgeqr2 (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * tau)

Definition at line 36 of file lapacke_dgeqr2.c.


LAPACKE_dgeqr2_work 💜 tau plus exactly one double * work. minimalist icon.

lapack_int LAPACKE_dgeqr2_work (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * tau, double * work)

Definition at line 36 of file lapacke_dgeqr2_work.c.


LAPACKE_dgeqr_work 🔥 t, tsize, work, lwork — the whole _work starter pack, assembled.

lapack_int LAPACKE_dgeqr_work (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * t, lapack_int tsize, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgeqr_work.c.


LAPACKE_dgeqrf 💖 the one everybody's cousin has called at least once. a, lda, tau.

lapack_int LAPACKE_dgeqrf (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * tau)

Definition at line 36 of file lapacke_dgeqrf.c.


LAPACKE_dgeqrf_work 🫶 same cast, now with double * work, lapack_int lwork making a cameo.

lapack_int LAPACKE_dgeqrf_work (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * tau, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgeqrf_work.c.


LAPACKE_dgeqrfp 🌈 the p is right there in the name and she is not subtle about it.

lapack_int LAPACKE_dgeqrfp (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * tau)

Definition at line 36 of file lapacke_dgeqrfp.c.


LAPACKE_dgeqrfp_work ⭐ and her _work counterpart, same signature as dgeqrf_work because of course it is.

lapack_int LAPACKE_dgeqrfp_work (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * tau, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgeqrfp_work.c.


LAPACKE_dgeqrt 🦋 nb and ldt in the house — block size plus a leading dimension for t. main character parameters, honestly.

lapack_int LAPACKE_dgeqrt (int matrix_layout, lapack_int m, lapack_int n, lapack_int nb, double * a, lapack_int lda, double * t, lapack_int ldt)

Definition at line 36 of file lapacke_dgeqrt.c.


LAPACKE_dgeqrt2 💫 no nb here, just a, lda, t, ldt. clean.

lapack_int LAPACKE_dgeqrt2 (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * t, lapack_int ldt)

Definition at line 36 of file lapacke_dgeqrt2.c.


LAPACKE_dgeqrt2_work 🎀 identical parameter list to dgeqrt2 — yes, even in the _work file. she said "same".

lapack_int LAPACKE_dgeqrt2_work (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * t, lapack_int ldt)

Definition at line 36 of file lapacke_dgeqrt2_work.c.


LAPACKE_dgeqrt3 ✨ the third sister. same four-ish friends, different lore.

lapack_int LAPACKE_dgeqrt3 (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * t, lapack_int ldt)

Definition at line 36 of file lapacke_dgeqrt3.c.


LAPACKE_dgeqrt3_work 🌸 and yes — same again. a, lda, t, ldt. no extra work param sneaking in here, don't @ me.

lapack_int LAPACKE_dgeqrt3_work (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * t, lapack_int ldt)

Definition at line 36 of file lapacke_dgeqrt3_work.c.


LAPACKE_dgeqrt_work 💜 the base one's workspace twin, with double * work riding along.

lapack_int LAPACKE_dgeqrt_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int nb, double * a, lapack_int lda, double * t, lapack_int ldt, double * work)

Definition at line 36 of file lapacke_dgeqrt_work.c.


LAPACKE_dgerfs 🔥 error bounds era!! ferr and berr at the end, ipiv in the middle, trans up front. she's stacked.

lapack_int LAPACKE_dgerfs (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, const double * af, lapack_int ldaf, const lapack_int * ipiv, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * ferr, double * berr)

Definition at line 36 of file lapacke_dgerfs.c.


LAPACKE_dgerfs_work 💀 the exact same fourteen args PLUS double * work, lapack_int * iwork. she brought friends. plural.

lapack_int LAPACKE_dgerfs_work (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, const double * af, lapack_int ldaf, const lapack_int * ipiv, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * ferr, double * berr, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dgerfs_work.c.


LAPACKE_dgerfsx 👑 the deluxe edition. equed, r, c, rcond, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params — the whole dang registry.

lapack_int LAPACKE_dgerfsx (int matrix_layout, char trans, char equed, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, const double * af, lapack_int ldaf, const lapack_int * ipiv, const double * r, const double * c, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params)

Definition at line 36 of file lapacke_dgerfsx.c.


LAPACKE_dgerfsx_work 🫶 same twenty-three params, and then double * work, lapack_int * iwork show up fashionably late.

lapack_int LAPACKE_dgerfsx_work (int matrix_layout, char trans, char equed, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, const double * af, lapack_int ldaf, const lapack_int * ipiv, const double * r, const double * c, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dgerfsx_work.c.


LAPACKE_dgerqf 🌈 back to the cozy three-piece: a, lda, tau.

lapack_int LAPACKE_dgerqf (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * tau)

Definition at line 36 of file lapacke_dgerqf.c.


LAPACKE_dgerqf_work ⭐ plus double * work, lapack_int lwork, obviously.

lapack_int LAPACKE_dgerqf_work (int matrix_layout, lapack_int m, lapack_int n, double * a, lapack_int lda, double * tau, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgerqf_work.c.


LAPACKE_dgesdd 🦋 divide-and-conquer SVD vibes — jobz instead of separate jobu/jobvt, plus s, u, ldu, vt, ldvt. one char, two outputs, iconic.

lapack_int LAPACKE_dgesdd (int matrix_layout, char jobz, lapack_int m, lapack_int n, double * a, lapack_int lda, double * s, double * u, lapack_int ldu, double * vt, lapack_int ldvt)

Definition at line 36 of file lapacke_dgesdd.c.


LAPACKE_dgesdd_work 💫 and she brought BOTH double * work, lapack_int lwork AND lapack_int * iwork. double workspace, zero regrets.

lapack_int LAPACKE_dgesdd_work (int matrix_layout, char jobz, lapack_int m, lapack_int n, double * a, lapack_int lda, double * s, double * u, lapack_int ldu, double * vt, lapack_int ldvt, double * work, lapack_int lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_dgesdd_work.c.


LAPACKE_dgesv 🎀 no m here, just n — square business only. ipiv is in the building, and b/ldb close it out.

lapack_int LAPACKE_dgesv (int matrix_layout, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, lapack_int * ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dgesv.c.


LAPACKE_dgesv_work ✨ fun fact from the header: the parameter list is identical to dgesv. no extra work args. she said what she said.

lapack_int LAPACKE_dgesv_work (int matrix_layout, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, lapack_int * ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dgesv_work.c.


LAPACKE_dgesvd 💜 the classic SVD — jobu AND jobvt as separate chars, and superb sitting at the end like a little trophy.

lapack_int LAPACKE_dgesvd (int matrix_layout, char jobu, char jobvt, lapack_int m, lapack_int n, double * a, lapack_int lda, double * s, double * u, lapack_int ldu, double * vt, lapack_int ldvt, double * superb)

Definition at line 36 of file lapacke_dgesvd.c.


LAPACKE_dgesvd_work 🌸 same, except superb peaces out and double * work, lapack_int lwork slide in. trade-off.

lapack_int LAPACKE_dgesvd_work (int matrix_layout, char jobu, char jobvt, lapack_int m, lapack_int n, double * a, lapack_int lda, double * s, double * u, lapack_int ldu, double * vt, lapack_int ldvt, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgesvd_work.c.


LAPACKE_dgesvdx 🔥 okay she's got RANGE — literally: a char range, plus vl, vu, il, iu, ns. fancy indexing energy fr fr.

lapack_int LAPACKE_dgesvdx (int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, lapack_int * ns, double * s, double * u, lapack_int ldu, double * vt, lapack_int ldvt, lapack_int * superb)

Definition at line 36 of file lapacke_dgesvdx.c.


LAPACKE_dgesvdx_work 🧚 same big roster, but superb is swapped for double * work, lapack_int lwork, lapack_int * iwork. the _work special 💅

lapack_int LAPACKE_dgesvdx_work (int matrix_layout, char jobu, char jobvt, char range, lapack_int m, lapack_int n, double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, lapack_int * ns, double * s, double * u, lapack_int ldu, double * vt, lapack_int ldvt, double * work, lapack_int lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_dgesvdx_work.c.


LAPACKE_dgesvj 👑 THREE chars up front — joba, jobu, jobv — plus sva, mv, v, ldv, and a stat at the end. she's mysterious and loaded with options.

lapack_int LAPACKE_dgesvj (int matrix_layout, char joba, char jobu, char jobv, lapack_int m, lapack_int n, double * a, lapack_int lda, double * sva, lapack_int mv, double * v, lapack_int ldv, double * stat)

Definition at line 36 of file lapacke_dgesvj.c.


LAPACKE_dgesvj_work 🍓 and the _work edition: stat clocks out, double * work, lapack_int lwork clock in. that's the pattern and she's sticking to it.

lapack_int LAPACKE_dgesvj_work (int matrix_layout, char joba, char jobu, char jobv, lapack_int m, lapack_int n, double * a, lapack_int lda, double * sva, lapack_int mv, double * v, lapack_int ldv, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgesvj_work.c.


that's the dge cluster wrapped, and the docs are absolutely not done with us yet — keep scrolling bestie, there's more 💖

LAPACKE_dgesvx — bestie, this is the expert version of the solve: it gives you the solution AND checks its own vibe (equilibration, condition estimate, ferr/berr). Note the extra rpivot at the end, she's special 💅

lapack_int LAPACKE_dgesvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * af,
    lapack_int ldaf, lapack_int * ipiv, char * equed, double * r, double *
    c, double * b, lapack_int ldb, double * x, lapack_int ldx, double *
    rcond, double * ferr, double * berr, double * rpivot)

Defined at line 36 of lapacke_dgesvx.c.

LAPACKE_dgesvx_work — same dgesvx energy 🫶, except you're the one handing over the workspace and integer workspace instead of her doing the shopping for you.

lapack_int LAPACKE_dgesvx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * af,
    lapack_int ldaf, lapack_int * ipiv, char * equed, double * r, double *
    c, double * b, lapack_int ldb, double * x, lapack_int ldx, double *
    rcond, double * ferr, double * berr, double * work, lapack_int * iwork)

Defined at line 36 of lapacke_dgesvx_work.c.

LAPACKE_dgesvxx — the extra-extra one 😭 she's serving error bounds on a platter: rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, plus nparams and params. Literally the whole confidence package.

lapack_int LAPACKE_dgesvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * af,
    lapack_int ldaf, lapack_int * ipiv, char * equed, double * r, double *
    c, double * b, lapack_int ldb, double * x, lapack_int ldx, double *
    rcond, double * rpvgrw, double * berr, lapack_int n_err_bnds, double *
    err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double *
    params)

Defined at line 36 of lapacke_dgesvxx.c.

LAPACKE_dgesvxx_work — the _work twin of the above 🌸 same everything, but work and iwork are your problem now. Slay, but bring your own buffers.

lapack_int LAPACKE_dgesvxx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * af,
    lapack_int ldaf, lapack_int * ipiv, char * equed, double * r, double *
    c, double * b, lapack_int ldb, double * x, lapack_int ldx, double *
    rcond, double * rpvgrw, double * berr, lapack_int n_err_bnds, double *
    err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double *
    params, double * work, lapack_int * iwork)

Defined at line 36 of lapacke_dgesvxx_work.c.


🌈 the LU debut era

LAPACKE_dgetf2 — unblocked LU factorization with partial pivoting, the little engine that could ✨ m, n, a, lda, ipiv, that's the whole cast.

lapack_int LAPACKE_dgetf2 (int matrix_layout, lapack_int m, lapack_int n,
    double * a, lapack_int lda, lapack_int * ipiv)

Defined at line 36 of lapacke_dgetf2.c.

LAPACKE_dgetf2_work — same dgetf2, _work flavor 🎀

lapack_int LAPACKE_dgetf2_work (int matrix_layout, lapack_int m, lapack_int
    n, double * a, lapack_int lda, lapack_int * ipiv)

Defined at line 36 of lapacke_dgetf2_work.c.

LAPACKE_dgetrf — the main character of factorization 👑 blocked LU with partial pivoting. If you've ever wondered "how do I even start", it's this one.

lapack_int LAPACKE_dgetrf (int matrix_layout, lapack_int m, lapack_int n,
    double * a, lapack_int lda, lapack_int * ipiv)

Defined at line 36 of lapacke_dgetrf.c.

LAPACKE_dgetrf2 — recursive-flavored dgetrf variant, same signature as its sibling, no cap 🧚

lapack_int LAPACKE_dgetrf2 (int matrix_layout, lapack_int m, lapack_int n,
    double * a, lapack_int lda, lapack_int * ipiv)

Defined at line 36 of lapacke_dgetrf2.c.

LAPACKE_dgetrf2_work — and here she is in _work form 💖

lapack_int LAPACKE_dgetrf2_work (int matrix_layout, lapack_int m, lapack_int
    n, double * a, lapack_int lda, lapack_int * ipiv)

Defined at line 36 of lapacke_dgetrf2_work.c.

LAPACKE_dgetrf_work — the _work version of dgetrf. Same args, same dreams ⭐

lapack_int LAPACKE_dgetrf_work (int matrix_layout, lapack_int m, lapack_int
    n, double * a, lapack_int lda, lapack_int * ipiv)

Defined at line 36 of lapacke_dgetrf_work.c.

LAPACKE_dgetri — you already factored it? Iconic. Now invert it 💅 note that ipiv is const here, she's read-only and thriving.

lapack_int LAPACKE_dgetri (int matrix_layout, lapack_int n, double * a,
    lapack_int lda, const lapack_int * ipiv)

Defined at line 36 of lapacke_dgetri.c.

LAPACKE_dgetri_work — same inversion, but you're supplying work and lwork yourself 🫶

lapack_int LAPACKE_dgetri_work (int matrix_layout, lapack_int n, double * a,
    lapack_int lda, const lapack_int * ipiv, double * work, lapack_int
    lwork)

Defined at line 36 of lapacke_dgetri_work.c.

LAPACKE_dgetrs — solved-by-factoring, bestie 🔥 you hand her the LU factors (a, lda, ipiv) and she handles the solve. trans decides how she reads it.

lapack_int LAPACKE_dgetrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, const lapack_int *
    ipiv, double * b, lapack_int ldb)

Defined at line 36 of lapacke_dgetrs.c.

LAPACKE_dgetrs_work — same solve, _work dressing ✨

lapack_int LAPACKE_dgetrs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, const lapack_int *
    ipiv, double * b, lapack_int ldb)

Defined at line 36 of lapacke_dgetrs_work.c.

LAPACKE_dgetsls — least squares via divide-and-conquer 🦋 note the cast is m, n, nrhs (not n/nrhs like the square solvers), so mind your shapes.

lapack_int LAPACKE_dgetsls (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * b,
    lapack_int ldb)

Defined at line 36 of lapacke_dgetsls.c.

LAPACKE_dgetsls_work — least squares, but with work + lwork handed over like a good friend 🍓

lapack_int LAPACKE_dgetsls_work (int matrix_layout, char trans, lapack_int
    m, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double *
    b, lapack_int ldb, double * work, lapack_int lwork)

Defined at line 36 of lapacke_dgetsls_work.c.


💜 generalized eigenvalue era: balancing & back-transforming

LAPACKE_dggbak — takes the balancing scales from dggbal and back-transforms the eigenvectors in v 😭 the glow-up reversal, fr fr.

lapack_int LAPACKE_dggbak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const double * lscale,
    const double * rscale, lapack_int m, double * v, lapack_int ldv)

Defined at line 36 of lapacke_dggbak.c.

LAPACKE_dggbak_work — same back-transform, _work cut 🎀 same exact argument list too.

lapack_int LAPACKE_dggbak_work (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const double * lscale,
    const double * rscale, lapack_int m, double * v, lapack_int ldv)

Defined at line 36 of lapacke_dggbak_work.c.

LAPACKE_dggbal — balances a pair of matrices (a, b) so the eigenproblem behaves 🌸 hands you back ilo, ihi, lscale and rscale. The pre-game ritual.

lapack_int LAPACKE_dggbal (int matrix_layout, char job, lapack_int n, double
    * a, lapack_int lda, double * b, lapack_int ldb, lapack_int * ilo,
    lapack_int * ihi, double * lscale, double * rscale)

Defined at line 36 of lapacke_dggbal.c.

LAPACKE_dggbal_work — balancing with a work array you provide 🧚

lapack_int LAPACKE_dggbal_work (int matrix_layout, char job, lapack_int n,
    double * a, lapack_int lda, double * b, lapack_int ldb, lapack_int *
    ilo, lapack_int * ihi, double * lscale, double * rscale, double * work)

Defined at line 36 of lapacke_dggbal_work.c.


🔥 the QZ / generalized Schur squad

LAPACKE_dgges — generalized Schur decomposition, the real deal 👑 jobvsl and jobvsr decide whether you get left/right Schur vectors, sort + selctg (LAPACK_D_SELECT3) let you pick eigenvalues, and sdim reports how many made the cut. Outputs: alphar, alphai, beta.

lapack_int LAPACKE_dgges (int matrix_layout, char jobvsl, char jobvsr, char
    sort, LAPACK_D_SELECT3 selctg, lapack_int n, double * a, lapack_int lda,
    double * b, lapack_int ldb, lapack_int * sdim, double * alphar, double *
    alphai, double * beta, double * vsl, lapack_int ldvsl, double * vsr,
    lapack_int ldvsr)

Defined at line 36 of lapacke_dgges.c.

LAPACKE_dgges3 — the 3 variant of dgges, same signature down to the letter ✨ she's just built different internally.

lapack_int LAPACKE_dgges3 (int matrix_layout, char jobvsl, char jobvsr, char
    sort, LAPACK_D_SELECT3 selctg, lapack_int n, double * a, lapack_int lda,
    double * b, lapack_int ldb, lapack_int * sdim, double * alphar, double *
    alphai, double * beta, double * vsl, lapack_int ldvsl, double * vsr,
    lapack_int ldvsr)

Defined at line 36 of lapacke_dgges3.c.

LAPACKE_dgges3_work — dgges3 plus work, lwork, and a bwork (lapack_logical *) array for the sort selector 🫶

lapack_int LAPACKE_dgges3_work (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_D_SELECT3 selctg, lapack_int n, double * a, lapack_int
    lda, double * b, lapack_int ldb, lapack_int * sdim, double * alphar,
    double * alphai, double * beta, double * vsl, lapack_int ldvsl, double *
    vsr, lapack_int ldvsr, double * work, lapack_int lwork, lapack_logical *
    bwork)

Defined at line 36 of lapacke_dgges3_work.c.

LAPACKE_dgges_work — dgges with work, lwork and bwork in the mix 💀 same LAPACK_D_SELECT3 selector, no substitutions.

lapack_int LAPACKE_dgges_work (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_D_SELECT3 selctg, lapack_int n, double * a, lapack_int
    lda, double * b, lapack_int ldb, lapack_int * sdim, double * alphar,
    double * alphai, double * beta, double * vsl, lapack_int ldvsl, double *
    vsr, lapack_int ldvsr, double * work, lapack_int lwork, lapack_logical *
    bwork)

Defined at line 36 of lapacke_dgges_work.c.

LAPACKE_dggesx — the deluxe dgges 🎀 extra sense char, and she gives you rconde and rcondv — the reciprocal condition numbers for the eigenvalues and eigenvectors. She's thorough, we love her.

lapack_int LAPACKE_dggesx (int matrix_layout, char jobvsl, char jobvsr, char
    sort, LAPACK_D_SELECT3 selctg, char sense, lapack_int n, double * a,
    lapack_int lda, double * b, lapack_int ldb, lapack_int * sdim, double *
    alphar, double * alphai, double * beta, double * vsl, lapack_int ldvsl,
    double * vsr, lapack_int ldvsr, double * rconde, double * rcondv)

Defined at line 36 of lapacke_dggesx.c.

LAPACKE_dggesx_work — the full-workspace dggesx 😭 work/lwork, iwork/liwork, AND bwork. Bring a tote bag.

lapack_int LAPACKE_dggesx_work (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_D_SELECT3 selctg, char sense, lapack_int n, double *
    a, lapack_int lda, double * b, lapack_int ldb, lapack_int * sdim, double
    * alphar, double * alphai, double * beta, double * vsl, lapack_int
    ldvsl, double * vsr, lapack_int ldvsr, double * rconde, double * rcondv,
    double * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork,
    lapack_logical * bwork)

Defined at line 36 of lapacke_dggesx_work.c.


🌸 generalized eigenvalue problems, straight up

LAPACKE_dggev — generalized eigenvalues for the pencil (a, b) 💖 jobvl/jobvr control the left and right eigenvector matrices vl/vr, and the eigenvalues come back as alphar, alphai, beta.

lapack_int LAPACKE_dggev (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * alphar, double * alphai, double * beta, double * vl, lapack_int
    ldvl, double * vr, lapack_int ldvr)

Defined at line 36 of lapacke_dggev.c.

LAPACKE_dggev3 — the 3 variant of dggev, identical argument list, character for character 🌈

lapack_int LAPACKE_dggev3 (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * alphar, double * alphai, double * beta, double * vl, lapack_int
    ldvl, double * vr, lapack_int ldvr)

Defined at line 36 of lapacke_dggev3.c.

LAPACKE_dggev3_work — dggev3 with work and lwork 🧚

lapack_int LAPACKE_dggev3_work (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * alphar, double * alphai, double * beta, double * vl, lapack_int
    ldvl, double * vr, lapack_int ldvr, double * work, lapack_int lwork)

Defined at line 36 of lapacke_dggev3_work.c.

LAPACKE_dggev_work — dggev with work and lwork, same everything else ⭐

lapack_int LAPACKE_dggev_work (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * alphar, double * alphai, double * beta, double * vl, lapack_int
    ldvl, double * vr, lapack_int ldvr, double * work, lapack_int lwork)

Defined at line 36 of lapacke_dggev_work.c.

LAPACKE_dggevx — the maximalist generalized eigen solver 👑 balanc + sense up front, then she hands you ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde and rcondv. She said "I'm giving you everything."

lapack_int LAPACKE_dggevx (int matrix_layout, char balanc, char jobvl, char
    jobvr, char sense, lapack_int n, double * a, lapack_int lda, double * b,
    lapack_int ldb, double * alphar, double * alphai, double * beta, double
    * vl, lapack_int ldvl, double * vr, lapack_int ldvr, lapack_int * ilo,
    lapack_int * ihi, double * lscale, double * rscale, double * abnrm,
    double * bbnrm, double * rconde, double * rcondv)

Defined at line 36 of lapacke_dggevx.c.

LAPACKE_dggevx_work — that whole maximalist package, plus work/lwork, iwork, and bwork 💀 packing for a whole semester abroad.

lapack_int LAPACKE_dggevx_work (int matrix_layout, char balanc, char jobvl,
    char jobvr, char sense, lapack_int n, double * a, lapack_int lda, double
    * b, lapack_int ldb, double * alphar, double * alphai, double * beta,
    double * vl, lapack_int ldvl, double * vr, lapack_int ldvr, lapack_int *
    ilo, lapack_int * ihi, double * lscale, double * rscale, double * abnrm,
    double * bbnrm, double * rconde, double * rcondv, double * work,
    lapack_int lwork, lapack_int * iwork, lapack_logical * bwork)

Defined at line 36 of lapacke_dggevx_work.c.


🎀 the constrained-least-squares corner

LAPACKE_dggglm — solves the generalized linear regression problem for the pencil (a, b) 🦋 d goes in, x and y come out. Note the argument order: n, then m, then p. Don't shuffle them, bestie, order matters.

lapack_int LAPACKE_dggglm (int matrix_layout, lapack_int n, lapack_int m,
    lapack_int p, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * d, double * x, double * y)

Defined at line 36 of lapacke_dggglm.c.

LAPACKE_dggglm_work — the same GLM solve with work and lwork supplied by you 💜

lapack_int LAPACKE_dggglm_work (int matrix_layout, lapack_int n, lapack_int
    m, lapack_int p, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * d, double * x, double * y, double * work, lapack_int lwork)

Defined at line 36 of lapacke_dggglm_work.c.

LAPACKE_dgghd3 — Hessenberg-triangular reduction of the pair (a, b) 🔥 compq and compz control whether q and z get updated, and ilo/ihi carry the balancing range. This is the setup girlie before the QZ main event.

lapack_int LAPACKE_dgghd3 (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, double * a, lapack_int
    lda, double * b, lapack_int ldb, double * q, lapack_int ldq, double * z,
    lapack_int ldz)

Defined at line 36 of lapacke_dgghd3.c.

  • ### 🦋 LAPACKE_dgghd3_work

The full-glow-up version with a scratch workspace, bestie 💅

lapack_int LAPACKE_dgghd3_work (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, double * a, lapack_int
    lda, double * b, lapack_int ldb, double * q, lapack_int ldq, double * z,
    lapack_int ldz, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgghd3_work.c.


  • ### 🎀 LAPACKE_dgghrd

Reduces a pair of matrices to generalized Hessenberg form — no _work twin energy here, it just goes ✨

lapack_int LAPACKE_dgghrd (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, double * a, lapack_int
    lda, double * b, lapack_int ldb, double * q, lapack_int ldq, double * z,
    lapack_int ldz)

Definition at line 36 of file lapacke_dgghrd.c.

  • ### 🎀 LAPACKE_dgghrd_work

Same signature as its sibling above, fr fr — the workspace variant of the Hessenberg reduction 🫶

lapack_int LAPACKE_dgghrd_work (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, double * a, lapack_int
    lda, double * b, lapack_int ldb, double * q, lapack_int ldq, double * z,
    lapack_int ldz)

Definition at line 36 of file lapacke_dgghrd_work.c.


  • ### 🌸 LAPACKE_dgglse

Solves the linear equality-constrained least squares problem, the way that it just handles it 😌

lapack_int LAPACKE_dgglse (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int p, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * c, double * d, double * x)

Definition at line 36 of file lapacke_dgglse.c.

  • ### 🌸 LAPACKE_dgglse_work

Same solve, but now with work and lwork so you can bring your own scratch space 💖

lapack_int LAPACKE_dgglse_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int p, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * c, double * d, double * x, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dgglse_work.c.


  • ### 🧚 LAPACKE_dggqrf

Generalized QR factorization — note the order bestie, it's n, then m, then p 👀

lapack_int LAPACKE_dggqrf (int matrix_layout, lapack_int n, lapack_int m,
    lapack_int p, double * a, lapack_int lda, double * taua, double * b,
    lapack_int ldb, double * taub)

Definition at line 36 of file lapacke_dggqrf.c.

  • ### 🧚 LAPACKE_dggqrf_work

The workspace edition, two taus and all 🌈

lapack_int LAPACKE_dggqrf_work (int matrix_layout, lapack_int n, lapack_int
    m, lapack_int p, double * a, lapack_int lda, double * taua, double * b,
    lapack_int ldb, double * taub, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dggqrf_work.c.


  • ### 💜 LAPACKE_dggrqf

Generalized RQ factorization — and heads up, the leading dims go m, p, n here, which is a whole different order than the QR one, so don't mix them up 😭

lapack_int LAPACKE_dggrqf (int matrix_layout, lapack_int m, lapack_int p,
    lapack_int n, double * a, lapack_int lda, double * taua, double * b,
    lapack_int ldb, double * taub)

Definition at line 36 of file lapacke_dggrqf.c.

  • ### 💜 LAPACKE_dggrqf_work

RQ factorization plus your very own work/lwork moment ✨

lapack_int LAPACKE_dggrqf_work (int matrix_layout, lapack_int m, lapack_int
    p, lapack_int n, double * a, lapack_int lda, double * taua, double * b,
    lapack_int ldb, double * taub, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dggrqf_work.c.


  • ### 👑 LAPACKE_dggsvd

Generalized singular value decomposition, the classic OG — gives you k, l, alpha, beta and the trio u, v, q, plus iwork for the int-loving internals 💀

lapack_int LAPACKE_dggsvd (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * alpha, double * beta, double * u, lapack_int ldu, double * v,
    lapack_int ldv, double * q, lapack_int ldq, lapack_int * iwork)

Definition at line 36 of file lapacke_dggsvd.c.

  • ### 👑 LAPACKE_dggsvd3

The 3-era glow-up of the GSVD — same argument list, upgraded internals 🦋

lapack_int LAPACKE_dggsvd3 (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * alpha, double * beta, double * u, lapack_int ldu, double * v,
    lapack_int ldv, double * q, lapack_int ldq, lapack_int * iwork)

Definition at line 36 of file lapacke_dggsvd3.c.

  • ### 👑 LAPACKE_dggsvd3_work

The 3 version but make it workspace-y: work, lwork, then iwork at the very end 🎀

lapack_int LAPACKE_dggsvd3_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * alpha, double * beta, double * u, lapack_int ldu, double * v,
    lapack_int ldv, double * q, lapack_int ldq, double * work, lapack_int
    lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_dggsvd3_work.c.

  • ### 👑 LAPACKE_dggsvd_work

Careful, bestie — this one takes work and iwork but there's no lwork in the list, don't invent one 🙈

lapack_int LAPACKE_dggsvd_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * alpha, double * beta, double * u, lapack_int ldu, double * v,
    lapack_int ldv, double * q, lapack_int ldq, double * work, lapack_int *
    iwork)

Definition at line 36 of file lapacke_dggsvd_work.c.


  • ### 🍓 LAPACKE_dggsvp

Preprocessing step for the GSVD pipeline — takes tolerances tola and tolb and hands you back k and l ✨

lapack_int LAPACKE_dggsvp (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, double * a, lapack_int
    lda, double * b, lapack_int ldb, double tola, double tolb, lapack_int *
    k, lapack_int * l, double * u, lapack_int ldu, double * v, lapack_int
    ldv, double * q, lapack_int ldq)

Definition at line 36 of file lapacke_dggsvp.c.

  • ### 🍓 LAPACKE_dggsvp3

The 3-flavored preprocessing — same exact signature as LAPACKE_dggsvp, twin energy fr fr 🫶

lapack_int LAPACKE_dggsvp3 (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, double * a, lapack_int
    lda, double * b, lapack_int ldb, double tola, double tolb, lapack_int *
    k, lapack_int * l, double * u, lapack_int ldu, double * v, lapack_int
    ldv, double * q, lapack_int ldq)

Definition at line 36 of file lapacke_dggsvp3.c.

  • ### 🍓 LAPACKE_dggsvp3_work

Now with a whole backstage crew: iwork, tau, work and lwork 🎤

lapack_int LAPACKE_dggsvp3_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, double * a,
    lapack_int lda, double * b, lapack_int ldb, double tola, double tolb,
    lapack_int * k, lapack_int * l, double * u, lapack_int ldu, double * v,
    lapack_int ldv, double * q, lapack_int ldq, lapack_int * iwork, double *
    tau, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dggsvp3_work.c.

  • ### 🍓 LAPACKE_dggsvp_work

Same crew but shorter guest list: iwork, tau, work — and nope, no lwork here either, clock it 💅

lapack_int LAPACKE_dggsvp_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, double * a,
    lapack_int lda, double * b, lapack_int ldb, double tola, double tolb,
    lapack_int * k, lapack_int * l, double * u, lapack_int ldu, double * v,
    lapack_int ldv, double * q, lapack_int ldq, lapack_int * iwork, double *
    tau, double * work)

Definition at line 36 of file lapacke_dggsvp_work.c.


  • ### 🌈 LAPACKE_dgtcon

Estimates the reciprocal condition number of a tridiagonal matrix — and catch this, there's no matrix_layout argument at all, it's built different 👀

lapack_int LAPACKE_dgtcon (char norm, lapack_int n, const double * dl, const
    double * d, const double * du, const double * du2, const lapack_int *
    ipiv, double anorm, double * rcond)

Definition at line 36 of file lapacke_dgtcon.c.

  • ### 🌈 LAPACKE_dgtcon_work

Condition estimation with your own work and iwork scratch space 🎀

lapack_int LAPACKE_dgtcon_work (char norm, lapack_int n, const double * dl,
    const double * d, const double * du, const double * du2, const
    lapack_int * ipiv, double anorm, double * rcond, double * work,
    lapack_int * iwork)

Definition at line 36 of file lapacke_dgtcon_work.c.


  • ### 🔥 LAPACKE_dgtrfs

Refines a tridiagonal solve and hands you back ferr and berr — the error report card, basically 📝

lapack_int LAPACKE_dgtrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const double * dl, const double * d, const double * du,
    const double * dlf, const double * df, const double * duf, const double
    * du2, const lapack_int * ipiv, const double * b, lapack_int ldb, double
    * x, lapack_int ldx, double * ferr, double * berr)

Definition at line 36 of file lapacke_dgtrfs.c.

  • ### 🔥 LAPACKE_dgtrfs_work

Same refinement, now auditioning work and iwork for the cast ✨

lapack_int LAPACKE_dgtrfs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const double * dl, const double * d, const double * du,
    const double * dlf, const double * df, const double * duf, const double
    * du2, const lapack_int * ipiv, const double * b, lapack_int ldb, double
    * x, lapack_int ldx, double * ferr, double * berr, double * work,
    lapack_int * iwork)

Definition at line 36 of file lapacke_dgtrfs_work.c.


  • ### 💖 LAPACKE_dgtsv

Solves a tridiagonal system — dl, d, du are the three stripes and b gets overwritten all casual-like 👑

lapack_int LAPACKE_dgtsv (int matrix_layout, lapack_int n, lapack_int nrhs,
    double * dl, double * d, double * du, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dgtsv.c.

  • ### 💖 LAPACKE_dgtsv_work

Literally the same signature as LAPACKE_dgtsv — the _work name is doing a lot of heavy lifting here 💀

lapack_int LAPACKE_dgtsv_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, double * dl, double * d, double * du, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dgtsv_work.c.


  • ### 🦋 LAPACKE_dgtsvx

The expert-mode tridiagonal solver: fact for whether you already factored, trans, and it delivers rcond, ferr, berr like a full report 🎀

lapack_int LAPACKE_dgtsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const double * dl, const double * d,
    const double * du, double * dlf, double * df, double * duf, double *
    du2, lapack_int * ipiv, const double * b, lapack_int ldb, double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr)

Definition at line 36 of file lapacke_dgtsvx.c.

  • ### 🦋 LAPACKE_dgtsvx_work

Everything from above plus work and iwork at the tail end 🫶

lapack_int LAPACKE_dgtsvx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const double * dl, const double * d,
    const double * du, double * dlf, double * df, double * duf, double *
    du2, lapack_int * ipiv, const double * b, lapack_int ldb, double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr, double *
    work, lapack_int * iwork)

Definition at line 36 of file lapacke_dgtsvx_work.c.


  • ### 🎀 LAPACKE_dgttrf

Factors a tridiagonal matrix — another one with no matrix_layout, it just starts right in with n 😌

lapack_int LAPACKE_dgttrf (lapack_int n, double * dl, double * d, double *
    du, double * du2, lapack_int * ipiv)

Definition at line 36 of file lapacke_dgttrf.c.

  • ### 🎀 LAPACKE_dgttrf_work

Identical signature to LAPACKE_dgttrf, same six arguments, no notes 🌸

lapack_int LAPACKE_dgttrf_work (lapack_int n, double * dl, double * d,
    double * du, double * du2, lapack_int * ipiv)

Definition at line 36 of file lapacke_dgttrf_work.c.


  • ### ⭐ LAPACKE_dgttrs

Solves using the factorization dgttrf already produced — du2 and ipiv come along for the ride 💅

lapack_int LAPACKE_dgttrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const double * dl, const double * d, const double * du,
    const double * du2, const lapack_int * ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dgttrs.c.

  • ### ⭐ LAPACKE_dgttrs_work

Same arguments as LAPACKE_dgttrs exactly, no extras, that's the whole vibe 🦋

lapack_int LAPACKE_dgttrs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const double * dl, const double * d, const double * du,
    const double * du2, const lapack_int * ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dgttrs_work.c.


  • ### 🐛 LAPACKE_dhgeqz

The generalized Hessenberg eigenvalue problem — you feed it h, t, q, z and it hands you alphar, alphai, beta ✨

lapack_int LAPACKE_dhgeqz (int matrix_layout, char job, char compq, char
    compz, lapack_int n, lapack_int ilo, lapack_int ihi, double * h,
    lapack_int ldh, double * t, lapack_int ldt, double * alphar, double *
    alphai, double * beta, double * q, lapack_int ldq, double * z,
    lapack_int ldz)

Definition at line 36 of file lapacke_dhgeqz.c.

  • ### 🐛 LAPACKE_dhgeqz_work

Same whole eigenvalue quest, plus work and lwork to give it room to breathe 🫶

lapack_int LAPACKE_dhgeqz_work (int matrix_layout, char job, char compq,
    char compz, lapack_int n, lapack_int ilo, lapack_int ihi, double * h,
    lapack_int ldh, double * t, lapack_int ldt, double * alphar, double *
    alphai, double * beta, double * q, lapack_int ldq, double * z,
    lapack_int ldz, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dhgeqz_work.c.


  • ### 🌸 LAPACKE_dhsein

Inverse iteration for Hessenberg eigenvectors — select picks your victims and ifaill/ifailr report back on the left and right ones 😭

lapack_int LAPACKE_dhsein (int matrix_layout, char job, char eigsrc, char
    initv, lapack_logical * select, lapack_int n, const double * h,
    lapack_int ldh, double * wr, const double * wi, double * vl, lapack_int
    ldvl, double * vr, lapack_int ldvr, lapack_int mm, lapack_int * m,
    lapack_int * ifaill, lapack_int * ifailr)

Definition at line 36 of file lapacke_dhsein.c.

  • ### 🌸 LAPACKE_dhsein_work

The workspace cut — work slides in right before ifaill and ifailr, order matters bestie 💅

lapack_int LAPACKE_dhsein_work (int matrix_layout, char job, char eigsrc,
    char initv, lapack_logical * select, lapack_int n, const double * h,
    lapack_int ldh, double * wr, const double * wi, double * vl, lapack_int
    ldvl, double * vr, lapack_int ldvr, lapack_int mm, lapack_int * m,
    double * work, lapack_int * ifaill, lapack_int * ifailr)

Definition at line 36 of file lapacke_dhsein_work.c.


  • ### 🧚 LAPACKE_dhseqr

Computes the eigenvalues (and optionally the Schur form) of an upper Hessenberg matrix — wr and wi are the real/imaginary couple goals 👑💖

lapack_int LAPACKE_dhseqr (int matrix_layout, char job, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, double * h, lapack_int
    ldh, double * wr, double * wi, double * z, lapack_int ldz)

Definition at line 36 of file lapacke_dhseqr.c.

🦋 LAPACKE_dhseqr_work

lapack_int LAPACKE_dhseqr_work (int matrix_layout, char job, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, double * h, lapack_int
    ldh, double * wr, double * wi, double * z, lapack_int ldz, double *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_dhseqr_work.c.

Okay so this is the _work twin, and the way she's carrying a whole double * work plus her own lwork on top of h, ldh, wr, wi, z, ldz… she's fully packed for the trip, bestie. job, compz, ilo, ihi — the little char-and-int entourage. Iconic.

🎀 LAPACKE_dlacn2

lapack_int LAPACKE_dlacn2 (lapack_int n, double * v, double * x, lapack_int
    * isgn, double * est, lapack_int * kase, lapack_int * isave)

Definition at line 36 of file lapacke_dlacn2.c.

No matrix_layout here, no layout drama, she just takes n, v, x, isgn, est, kase, isave and goes. Three of those are lapack_int * pointers and honestly the pointer-to-kase and pointer-to-isave combo is giving "state machine main character energy" 🫶.

✨ LAPACKE_dlacn2_work

lapack_int LAPACKE_dlacn2_work (lapack_int n, double * v, double * x,
    lapack_int * isgn, double * est, lapack_int * kase, lapack_int * isave)

Definition at line 36 of file lapacke_dlacn2_work.c.

Same seven arguments, same order, one different file — lapacke_dlacn2_work.c instead of lapacke_dlacn2.c. Do not get these two confused, babe, they are twinsies but fr fr different files. 💅

🌸 LAPACKE_dlacpy

lapack_int LAPACKE_dlacpy (int matrix_layout, char uplo, lapack_int m,
    lapack_int n, const double * a, lapack_int lda, double * b, lapack_int
    ldb)

Definition at line 36 of file lapacke_dlacpy.c.

a comes in const (don't you dare touch her 💀), b comes out as a plain double *, and uplo gets to pick a corner. Plus m, n, lda, ldb because dimensions and leading dimensions are the whole personality of this library lowkey.

🧚 LAPACKE_dlacpy_work

lapack_int LAPACKE_dlacpy_work (int matrix_layout, char uplo, lapack_int m,
    lapack_int n, const double * a, lapack_int lda, double * b, lapack_int
    ldb)

Definition at line 36 of file lapacke_dlacpy_work.c.

Identical parameter list to her non-_work sister — matrix_layout, uplo, m, n, a, lda, b, ldb — just filed under lapacke_dlacpy_work.c. Slay, same fit different day.

🦋 LAPACKE_dlag2s

lapack_int LAPACKE_dlag2s (int matrix_layout, lapack_int m, lapack_int n,
    const double * a, lapack_int lda, float * sa, lapack_int ldsa)

Definition at line 36 of file lapacke_dlag2s.c.

Not me pointing at the float * sa and the double * a in the same breath — yes bestie, both types are here, lda for the double one and ldsa for the float one. Read the leading dimensions carefully, the letters are the lore. 🔥

⭐ LAPACKE_dlag2s_work

lapack_int LAPACKE_dlag2s_work (int matrix_layout, lapack_int m, lapack_int
    n, const double * a, lapack_int lda, float * sa, lapack_int ldsa)

Definition at line 36 of file lapacke_dlag2s_work.c.

Same seven args, same float * sa, same ldsa, and she lives at lapacke_dlag2s_work.c. If you're squinting at the screen to tell them apart, valid, we've all been there 😭.

🎀 LAPACKE_dlagge

lapack_int LAPACKE_dlagge (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, const double * d, double * a, lapack_int
    lda, lapack_int * iseed)

Definition at line 36 of file lapacke_dlagge.c.

kl and ku both showing up, d is const and a is not, and iseed is a lapack_int * — that's a seed being handed over by pointer, keep that in mind. No cap, she's got nine parameters and she's using every one. 💜

✨ LAPACKE_dlagge_work

lapack_int LAPACKE_dlagge_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const double * d, double * a,
    lapack_int lda, lapack_int * iseed, double * work)

Definition at line 36 of file lapacke_dlagge_work.c.

Everything from LAPACKE_dlagge plus a trailing double * work — that's the entire diff, bestie, and she's at lapacke_dlagge_work.c. The _work suffix is literally just "and also bring a workspace." 🫶

🌈 LAPACKE_dlagsy

lapack_int LAPACKE_dlagsy (int matrix_layout, lapack_int n, lapack_int k,
    const double * d, double * a, lapack_int lda, lapack_int * iseed)

Definition at line 36 of file lapacke_dlagsy.c.

Seven args: layout, n, k, const double * d, double * a, lda, lapack_int * iseed. Shorter than her lagge cousin — no m, no kl/ku — she said "square or nothing" and honestly? Respect.

🦋 LAPACKE_dlagsy_work

lapack_int LAPACKE_dlagsy_work (int matrix_layout, lapack_int n, lapack_int
    k, const double * d, double * a, lapack_int lda, lapack_int * iseed,
    double * work)

Definition at line 36 of file lapacke_dlagsy_work.c.

Yup, that's LAPACKE_dlagsy with double * work tacked on the end, chillin' in lapacke_dlagsy_work.c. Same vibe, extra baggage, we support her. 🎀

👑 LAPACKE_dlamch

double LAPACKE_dlamch (char cmach)

Definition at line 36 of file lapacke_dlamch.c.

One argument. One. char cmach. And she returns a double. The minimalism is honestly giving main character energy — no layout, no dimensions, just vibes and a character. ⭐

💅 LAPACKE_dlamch_work

double LAPACKE_dlamch_work (char cmach)

Definition at line 36 of file lapacke_dlamch_work.c.

Same single char cmach, same double return, different file: lapacke_dlamch_work.c. Yes the _work version of a one-argument function also exists, and yes she ate. 💀

🌸 LAPACKE_dlange

double LAPACKE_dlange (int matrix_layout, char norm, lapack_int m,
    lapack_int n, const double * a, lapack_int lda)

Definition at line 36 of file lapacke_dlange.c.

Returns a double, takes norm as a char, and a is const double * because she's just looking, not touching. m, n, lda — the classic trio. We stan a read-only queen. 🫶

✨ LAPACKE_dlange_work

double LAPACKE_dlange_work (int matrix_layout, char norm, lapack_int m,
    lapack_int n, const double * a, lapack_int lda, double * work)

Definition at line 36 of file lapacke_dlange_work.c.

Adds a double * work at the end and relocates to lapacke_dlange_work.c. Still returns double, still char norm, still not modifying a. Consistency is her brand. 🔥

🎀 LAPACKE_dlansy

double LAPACKE_dlansy (int matrix_layout, char norm, char uplo, lapack_int
    n, const double * a, lapack_int lda)

Definition at line 36 of file lapacke_dlansy.c.

Two chars this time — norm and uplo — because she wants to know both how you're measuring and which triangle you're admitting exists. Only n here, no m, and I love that for her.

🧚 LAPACKE_dlansy_work

double LAPACKE_dlansy_work (int matrix_layout, char norm, char uplo,
    lapack_int n, const double * a, lapack_int lda, double * work)

Definition at line 36 of file lapacke_dlansy_work.c.

matrix_layout, norm, uplo, n, a, lda, then work. That's the whole lineup, and the file is lapacke_dlansy_work.c. Copy that, don't transpose it. 🦋

🌈 LAPACKE_dlantr

double LAPACKE_dlantr (int matrix_layout, char norm, char uplo, char diag,
    lapack_int m, lapack_int n, const double * a, lapack_int lda)

Definition at line 36 of file lapacke_dlantr.c.

THREE chars: norm, uplo, diag. Look at her go. Plus m and n are both back, a is const, lda tags along, and the return type is double. She contains multitudes. 💜

⭐ LAPACKE_dlantr_work

double LAPACKE_dlantr_work (int matrix_layout, char norm, char uplo, char
    diag, lapack_int m, lapack_int n, const double * a, lapack_int lda,
    double * work)

Definition at line 36 of file lapacke_dlantr_work.c.

Same three-char party — norm, uplo, diag — same m, n, a, lda, and then double * work walks in. Definition at line 36 of lapacke_dlantr_work.c. Gorgeous, no notes. 🎀

🦋 LAPACKE_dlapmr

lapack_int LAPACKE_dlapmr (int matrix_layout, lapack_logical forwrd,
    lapack_int m, lapack_int n, double * x, lapack_int ldx, lapack_int * k)

Definition at line 36 of file lapacke_dlapmr.c.

lapack_logical forwrd — not int, not char, a whole lapack_logical, and the parameter is literally named forwrd with the vowel missing. The way I would die for this spelling 😭. x is mutable, k is a lapack_int *.

✨ LAPACKE_dlapmr_work

lapack_int LAPACKE_dlapmr_work (int matrix_layout, lapack_logical forwrd,
    lapack_int m, lapack_int n, double * x, lapack_int ldx, lapack_int * k)

Definition at line 36 of file lapacke_dlapmr_work.c.

Same seven, forwrd still missing that vowel, and she's at lapacke_dlapmr_work.c. Note bestie: the _work version here takes no extra work argument — the signature is identical. Yes really. Read it again. 👀

🎀 LAPACKE_dlapmt

lapack_int LAPACKE_dlapmt (int matrix_layout, lapack_logical forwrd,
    lapack_int m, lapack_int n, double * x, lapack_int ldx, lapack_int * k)

Definition at line 36 of file lapacke_dlapmt.c.

One letter apart from dlapmr in the name and character-for-character identical in the signature — forwrd, m, n, x, ldx, k. Please check your spelling at 2am, I'm begging. 🙈

🌸 LAPACKE_dlapmt_work

lapack_int LAPACKE_dlapmt_work (int matrix_layout, lapack_logical forwrd,
    lapack_int m, lapack_int n, double * x, lapack_int ldx, lapack_int * k)

Definition at line 36 of file lapacke_dlapmt_work.c.

Same as above, lands in lapacke_dlapmt_work.c, no extra workspace parameter. She's low-maintenance like that. 💅

🧚 LAPACKE_dlapy2

double LAPACKE_dlapy2 (double x, double y)

Definition at line 36 of file lapacke_dlapy2.c.

Two doubles in, one double out, zero drama. x and y and that's the whole cast. The way she's just a little guy doing her little thing 😭💖

⭐ LAPACKE_dlapy2_work

double LAPACKE_dlapy2_work (double x, double y)

Definition at line 36 of file lapacke_dlapy2_work.c.

double x, double y, returns double, file lapacke_dlapy2_work.c. That's it. That's the entry. Short and perfect and she knows it. ✨

🌈 LAPACKE_dlapy3

double LAPACKE_dlapy3 (double x, double y, double z)

Definition at line 36 of file lapacke_dlapy3.c.

Okay she got a third one. x, y, z, all double, returns double. Growth! Evolution! We love a trilogy. 🔥

🦋 LAPACKE_dlapy3_work

double LAPACKE_dlapy3_work (double x, double y, double z)

Definition at line 36 of file lapacke_dlapy3_work.c.

double x, double y, double z, returns double, lives in lapacke_dlapy3_work.c. Same trio, different address. Periodt. 🎀

💜 LAPACKE_dlarfb

lapack_int LAPACKE_dlarfb (int matrix_layout, char side, char trans, char
    direct, char storev, lapack_int m, lapack_int n, lapack_int k, const
    double * v, lapack_int ldv, const double * t, lapack_int ldt, double *
    c, lapack_int ldc)

Definition at line 36 of file lapacke_dlarfb.c.

FOUR chars — side, trans, direct, storev — and then m, n, k because why have one dimension when you can have three. v and t are const, c is the one getting written to, and ldv, ldt, ldc are all watching their respective backs. This is a fourteen-argument situation and she's thriving. 👑

✨ LAPACKE_dlarfb_work

lapack_int LAPACKE_dlarfb_work (int matrix_layout, char side, char trans,
    char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    const double * v, lapack_int ldv, const double * t, lapack_int ldt,
    double * c, lapack_int ldc, double * work, lapack_int ldwork)

Definition at line 36 of file lapacke_dlarfb_work.c.

Sixteen args now, because she brought double * work AND lapack_int ldwork to the function. A leading dimension for the workspace. That's not a flex, that's a lifestyle. 🔥

🌸 LAPACKE_dlarfg

lapack_int LAPACKE_dlarfg (lapack_int n, double * alpha, double * x,
    lapack_int incx, double * tau)

Definition at line 36 of file lapacke_dlarfg.c.

No matrix_layout! Just n, double * alpha, double * x, lapack_int incx, double * tau. And look at incx — an increment, not a leading dimension. Different flavor of pointer math, bestie, keep up. 😤

🧚 LAPACKE_dlarfg_work

lapack_int LAPACKE_dlarfg_work (lapack_int n, double * alpha, double * x,
    lapack_int incx, double * tau)

Definition at line 36 of file lapacke_dlarfg_work.c.

Same five: n, alpha, x, incx, tau. No extra workspace arg. The _work name is doing heavy lifting here and honestly, she's mysterious. 💅

🦋 LAPACKE_dlarft

lapack_int LAPACKE_dlarft (int matrix_layout, char direct, char storev,
    lapack_int n, lapack_int k, const double * v, lapack_int ldv, const
    double * tau, double * t, lapack_int ldt)

Definition at line 36 of file lapacke_dlarft.c.

direct and storev are the two chars, n and k the two ints, v and tau are both const double *, and t comes out swinging as a plain double *. ldv and ldt for their respective leading dimensions. Ten args, all accounted for. ⭐

🎀 LAPACKE_dlarft_work

lapack_int LAPACKE_dlarft_work (int matrix_layout, char direct, char storev,
    lapack_int n, lapack_int k, const double * v, lapack_int ldv, const
    double * tau, double * t, lapack_int ldt)

Definition at line 36 of file lapacke_dlarft_work.c.

Identical ten-argument list to LAPACKE_dlarft, just at lapacke_dlarft_work.c. No hidden work param. She's the "I already have everything I need" of _work functions. 🫶

🌈 LAPACKE_dlarfx

lapack_int LAPACKE_dlarfx (int matrix_layout, char side, lapack_int m,
    lapack_int n, const double * v, double tau, double * c, lapack_int ldc,
    double * work)

Definition at line 36 of file lapacke_dlarfx.c.

Heads up: tau is a plain double, NOT a pointer — do not go dereferencing her, that's a whole different bug. v is const double *, c is writable, and double * work shows up even in the non-_work version. Yes bestie, read the sig twice. 👀

✨ LAPACKE_dlarfx_work

lapack_int LAPACKE_dlarfx_work (int matrix_layout, char side, lapack_int m,
    lapack_int n, const double * v, double tau, double * c, lapack_int ldc,
    double * work)

Definition at line 36 of file lapacke_dlarfx_work.c.

Byte-for-byte the same parameter list as LAPACKE_dlarfx, double tau included, defined at lapacke_dlarfx_work.c. The only glow-up is the filename. 💀

🦋 LAPACKE_dlarnv

lapack_int LAPACKE_dlarnv (lapack_int idist, lapack_int * iseed, lapack_int
    n, double * x)

Definition at line 36 of file lapacke_dlarnv.c.

idist (an int, not a char, don't assume), iseed as a lapack_int *, then n and double * x. Only four args and no layout — she's a tiny little icon and she knows exactly what she's about. 🎀

⭐ LAPACKE_dlarnv_work

lapack_int LAPACKE_dlarnv_work (lapack_int idist, lapack_int * iseed,
    lapack_int n, double * x)

Definition at line 36 of file lapacke_dlarnv_work.c.

Same four — idist, iseed, n, x — at lapacke_dlarnv_work.c. Again: no bonus work pointer. The _work suffix is not a contract, bestie, it's a surname. 💅

🌸 LAPACKE_dlartgp

lapack_int LAPACKE_dlartgp (double f, double g, double * cs, double * sn,
    double * r)

Definition at line 36 of file lapacke_dlartgp.c.

f and g go in as plain doubles, then THREE double * outputs: cs, sn, r. She's handing you three things back at once, which is basically a gift. 🫶

🧚 LAPACKE_dlartgp_work

lapack_int LAPACKE_dlartgp_work (double f, double g, double * cs, double *
    sn, double * r)

Definition at line 36 of file lapacke_dlartgp_work.c.

f, g, cs, sn, r — nothing added, nothing removed, plus the new address lapacke_dlartgp_work.c. She's consistent, she's reliable, she's a queen. 👑

🌈 LAPACKE_dlartgs

lapack_int LAPACKE_dlartgs (double x, double y, double sigma, double * cs,
    double * sn)

Definition at line 36 of file lapacke_dlartgs.c.

Sibling of dlartgp but different enough to matter: three plain doubles in — x, y, sigma — and only TWO pointer outputs, cs and sn. No r here. Don't go looking for r, r has left the building. 😭

🎀 LAPACKE_dlartgs_work

lapack_int LAPACKE_dlartgs_work (double x, double y, double sigma, double *
    cs, double * sn)

Definition at line 36 of file lapacke_dlartgs_work.c.

x, y, sigma, cs, sn. Five args, zero surprises, definition at line 36 of lapacke_dlartgs_work.c. A calm, collected icon. ✨

🦋 LAPACKE_dlascl

lapack_int LAPACKE_dlascl (int matrix_layout, char type, lapack_int kl,
    lapack_int ku, double cfrom, double cto, lapack_int m, lapack_int n,
    double * a, lapack_int lda)

Definition at line 36 of file lapacke_dlascl.c.

Careful here, bestie — cfrom and cto are plain doubles, not pointers, and the parameter is named type, not uplo. kl, ku, m, n, a, lda round out the ten. Yes, type is a char. Yes, it matters. 💅

⭐ LAPACKE_dlascl_work

lapack_int LAPACKE_dlascl_work (int matrix_layout, char type, lapack_int kl,
    lapack_int ku, double cfrom, double cto, lapack_int m, lapack_int n,
    double * a, lapack_int lda)

Definition at line 36 of file lapacke_dlascl_work.c.

Same ten, same plain-double cfrom/cto, same char type, now at lapacke_dlascl_work.c. Copy-paste energy but make it official documentation. 🫶

🌸 LAPACKE_dlaset

lapack_int LAPACKE_dlaset (int matrix_layout, char uplo, lapack_int m,
    lapack_int n, double alpha, double beta, double * a, lapack_int lda)

Definition at line 36 of file lapacke_dlaset.c.

alpha and beta are values, not pointers — that's the whole thing to remember, and I need you to remember it so I don't have to explain a segfault at brunch. Then uplo, m, n, a, lda. 🍓

🧚 LAPACKE_dlaset_work

lapack_int LAPACKE_dlaset_work (int matrix_layout, char uplo, lapack_int m,
    lapack_int n, double alpha, double beta, double * a, lapack_int lda)

Definition at line 36 of file lapacke_dlaset_work.c.

matrix_layout, uplo, m, n, alpha, beta, a, lda — identical to her sister — but she's filed under lapacke_dlaset_work.c. The _work versions are literally a family at this point. 💜

🌈 LAPACKE_dlasrt

lapack_int LAPACKE_dlasrt (char id, lapack_int n, double * d)

Definition at line 36 of file lapacke_dlasrt.c.

Three arguments. char id, lapack_int n, double * d. That's her whole world and she is unbothered and thriving. The audacity of this minimalism 🔥.

🎀 LAPACKE_dlasrt_work

lapack_int LAPACKE_dlasrt_work (char id, lapack_int n, double * d)

Definition at line 36 of file lapacke_dlasrt_work.c.

id, n, d. Same three, new file: lapacke_dlasrt_work.c. Consistency is literally her superpower. ⭐

🦋 LAPACKE_dlassq

lapack_int LAPACKE_dlassq (lapack_int n, double * x, lapack_int incx, double
    * scale, double * sumsq)

Definition at line 36 of file lapacke_dlassq.c.

n, double * x, incx, then TWO in-out doubles — scale and sumsq — both passed by pointer. Note that x isn't const here, bestie, she's not promising anything. 👀

✨ LAPACKE_dlassq_work

lapack_int LAPACKE_dlassq_work (lapack_int n, double * x, lapack_int incx,
    double * scale, double * sumsq)

Definition at line 36 of file lapacke_dlassq_work.c.

n, x, incx, scale, sumsq, and nothing else, in lapacke_dlassq_work.c. Still no const. Still not sorry. 💅

🌸 LAPACKE_dlaswp

lapack_int LAPACKE_dlaswp (int matrix_layout, lapack_int n, double * a,
    lapack_int lda, lapack_int k1, lapack_int k2, const lapack_int * ipiv,
    lapack_int incx)

Definition at line 36 of file lapacke_dlaswp.c.

ipiv is const lapack_int * — that's the permutation index array, and she is NOT being rewritten, so keep your hands off. Then k1, k2, incx, a, lda, n, matrix_layout. Eight and out. 🔥

🧚 LAPACKE_dlaswp_work

lapack_int LAPACKE_dlaswp_work (int matrix_layout, lapack_int n, double * a,
    lapack_int lda, lapack_int k1, lapack_int k2, const lapack_int * ipiv,
    lapack_int incx)

Definition at line 36 of file lapacke_dlaswp_work.c.

Same eight, const lapack_int * ipiv still const, and the file is lapacke_dlaswp_work.c. Another _work with no extra work arg — colleen, she's booked and busy. 🎀

🌈 LAPACKE_dlatms

lapack_int LAPACKE_dlatms (int matrix_layout, lapack_int m, lapack_int n,
    char dist, lapack_int * iseed, char sym, double * d, lapack_int mode,
    double cond, double dmax, lapack_int kl, lapack_int ku, char pack,
    double * a, lapack_int lda)

Definition at line 36 of file lapacke_dlatms.c.

FIFTEEN arguments and the whole cast is here: dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda, m, n, matrix_layout. Chars, ints, a pointer to int, a pointer to double, and two plain doubles (cond and dmax — values, not pointers, don't start). She's the full ensemble episode. 👑🔥

⭐ LAPACKE_dlatms_work

lapack_int LAPACKE_dlatms_work (int matrix_layout, lapack_int m, lapack_int
    n, char dist, lapack_int * iseed, char sym, double * d, lapack_int mode,
    double cond, double dmax, lapack_int kl, lapack_int ku, char pack,
    double * a, lapack_int lda, double * work)

Definition at line 36 of file lapacke_dlatms_work.c.

Sixteen args — everything from LAPACKE_dlatms plus one beautiful trailing double * work. Same dist, same sym, same pack, same plain cond and dmax. At lapacke_dlatms_work.c. Genuinely obsessed. 💜

🦋 LAPACKE_dlauum

lapack_int LAPACKE_dlauum (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda)

Definition at line 36 of file lapacke_dlauum.c.

Five args, name has three vowels in a row, uplo picks a triangle, a goes in and comes back changed, lda supervises. Short, sweet, spelled weirdly — a whole mood. 🎀

✨ LAPACKE_dlauum_work

lapack_int LAPACKE_dlauum_work (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda)

Definition at line 36 of file lapacke_dlauum_work.c.

matrix_layout, uplo, n, a, lda — same five, no additions — but she's registered at lapacke_dlauum_work.c. Three vowels and a _work, iconic. 🌈

🌸 LAPACKE_dopgtr

lapack_int LAPACKE_dopgtr (int matrix_layout, char uplo, lapack_int n, const
    double * ap, const double * tau, double * q, lapack_int ldq)

Definition at line 36 of file lapacke_dopgtr.c.

ap and tau are both const double * — she's reading them and leaving them exactly as she found them — while q is the writable one with ldq in tow. Plus uplo and n. Seven, clean, done. 💅

🧚 LAPACKE_dopgtr_work

lapack_int LAPACKE_dopgtr_work (int matrix_layout, char uplo, lapack_int n,
    const double * ap, const double * tau, double * q, lapack_int ldq,
    double * work)

Definition at line 36 of file lapacke_dopgtr_work.c.

matrix_layout, uplo, n, ap, tau, q, ldq, work — eight args, the last one new, at lapacke_dopgtr_work.c. Same constness promises, extra workspace. 🫶

🌈 LAPACKE_dopmtr

lapack_int LAPACKE_dopmtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const double * ap, const double *
    tau, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dopmtr.c.

Three chars back to back — side, uplo, trans — then m and n, then const double * ap and const double * tau chillin' read-only, and c taking the hit with ldc right there with her. Ten arguments, no work pointer in sight, and that's exactly how she likes it. ⭐


More coming, bestie — hold the vibe check, we're not done yet 🫶✨

  • LAPACKE_dopmtr_work — the _work edition of dopmtr, with the full work array handed to you so you can be the boss of your own buffer 💅
lapack_int LAPACKE_dopmtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const double * ap, const double
    * tau, double * c, lapack_int ldc, double * work)

Definition at line 36 of file lapacke_dopmtr_work.c.


  • LAPACKE_dorbdb — bestie, that's a lot of double * in one place: x11, x12, x21, x22, each with its own ld escort, plus theta, phi, taup1, taup2, tauq1, tauq2 🦋
lapack_int LAPACKE_dorbdb (int matrix_layout, char trans, char signs,
    lapack_int m, lapack_int p, lapack_int q, double * x11, lapack_int
    ldx11, double * x12, lapack_int ldx12, double * x21, lapack_int ldx21,
    double * x22, lapack_int ldx22, double * theta, double * phi, double *
    taup1, double * taup2, double * tauq1, double * tauq2)

Definition at line 36 of file lapacke_dorbdb.c.

  • LAPACKE_dorbdb_work — same iconic cast of characters, except now you're also carrying work and telling it your lwork. main character buffer energy ✨
lapack_int LAPACKE_dorbdb_work (int matrix_layout, char trans, char signs,
    lapack_int m, lapack_int p, lapack_int q, double * x11, lapack_int
    ldx11, double * x12, lapack_int ldx12, double * x21, lapack_int ldx21,
    double * x22, lapack_int ldx22, double * theta, double * phi, double *
    taup1, double * taup2, double * tauq1, double * tauq2, double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_dorbdb_work.c.

  • LAPACKE_dorcsd — four job flags in a trench coat: jobu1, jobu2, jobv1t, jobv2t, then trans and signs for good measure, and then so many matrices 🫶
lapack_int LAPACKE_dorcsd (int matrix_layout, char jobu1, char jobu2, char
    jobv1t, char jobv2t, char trans, char signs, lapack_int m, lapack_int p,
    lapack_int q, double * x11, lapack_int ldx11, double * x12, lapack_int
    ldx12, double * x21, lapack_int ldx21, double * x22, lapack_int ldx22,
    double * theta, double * u1, lapack_int ldu1, double * u2, lapack_int
    ldu2, double * v1t, lapack_int ldv1t, double * v2t, lapack_int ldv2t)

Definition at line 36 of file lapacke_dorcsd.c.

  • LAPACKE_dorcsd2by1 — the "2by1" remix 🌈 fewer matrices (x11, x21), same chaotic flag situation.
lapack_int LAPACKE_dorcsd2by1 (int matrix_layout, char jobu1, char jobu2,
    char jobv1t, lapack_int m, lapack_int p, lapack_int q, double * x11,
    lapack_int ldx11, double * x21, lapack_int ldx21, double * theta, double
    * u1, lapack_int ldu1, double * u2, lapack_int ldu2, double * v1t,
    lapack_int ldv1t)

Definition at line 36 of file lapacke_dorcsd2by1.c.

  • LAPACKE_dorcsd2by1_work — the _work version, and look, it brought friends: work, lwork and iwork 😭
lapack_int LAPACKE_dorcsd2by1_work (int matrix_layout, char jobu1, char
    jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q, double *
    x11, lapack_int ldx11, double * x21, lapack_int ldx21, double * theta,
    double * u1, lapack_int ldu1, double * u2, lapack_int ldu2, double *
    v1t, lapack_int ldv1t, double * work, lapack_int lwork, lapack_int *
    iwork)

Definition at line 36 of file lapacke_dorcsd2by1_work.c.

  • LAPACKE_dorcsd_work — the full dorcsd guest list plus work, lwork, iwork at the door 🎀
lapack_int LAPACKE_dorcsd_work (int matrix_layout, char jobu1, char jobu2,
    char jobv1t, char jobv2t, char trans, char signs, lapack_int m,
    lapack_int p, lapack_int q, double * x11, lapack_int ldx11, double *
    x12, lapack_int ldx12, double * x21, lapack_int ldx21, double * x22,
    lapack_int ldx22, double * theta, double * u1, lapack_int ldu1, double *
    u2, lapack_int ldu2, double * v1t, lapack_int ldv1t, double * v2t,
    lapack_int ldv2t, double * work, lapack_int lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_dorcsd_work.c.


  • LAPACKE_dorgbr — vect, m, n, k, then a with its lda, and tau. Genuinely so clean for once, we love a low-drama signature 💜
lapack_int LAPACKE_dorgbr (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int k, double * a, lapack_int lda, const double *
    tau)

Definition at line 36 of file lapacke_dorgbr.c.

  • LAPACKE_dorgbr_work — same thing but with work and lwork bolted on the end, as is tradition ✨
lapack_int LAPACKE_dorgbr_work (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int k, double * a, lapack_int lda, const double *
    tau, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dorgbr_work.c.

  • LAPACKE_dorgbr's cousin LAPACKE_dorghr — this one's got ilo and ihi instead of m, n, k, so mind the difference bestie 👀
lapack_int LAPACKE_dorghr (int matrix_layout, lapack_int n, lapack_int ilo,
    lapack_int ihi, double * a, lapack_int lda, const double * tau)

Definition at line 36 of file lapacke_dorghr.c.

  • LAPACKE_dorghr_work — dorghr with the work/lwork glow-up 🌸
lapack_int LAPACKE_dorghr_work (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, double * a, lapack_int lda, const double * tau,
    double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dorghr_work.c.

  • LAPACKE_dorglq — back to the m, n, k trio. The lq girlies ate, no notes 🔥
lapack_int LAPACKE_dorglq (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, double * a, lapack_int lda, const double * tau)

Definition at line 36 of file lapacke_dorglq.c.

  • LAPACKE_dorglq_work — plus work, plus lwork. Periodt.
lapack_int LAPACKE_dorglq_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, double * a, lapack_int lda, const double * tau, double
    * work, lapack_int lwork)

Definition at line 36 of file lapacke_dorglq_work.c.

  • LAPACKE_dorgql — literally the same shape as dorglq, just with the letters flipped. Do not mix them up, iykyk 💀
lapack_int LAPACKE_dorgql (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, double * a, lapack_int lda, const double * tau)

Definition at line 36 of file lapacke_dorgql.c.

  • LAPACKE_dorgql_work — the _work twin of the above, work and lwork included 🎀
lapack_int LAPACKE_dorgql_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, double * a, lapack_int lda, const double * tau, double
    * work, lapack_int lwork)

Definition at line 36 of file lapacke_dorgql_work.c.

  • LAPACKE_dorgqr — the iconic one, the qr classic 👑 same m, n, k, same a/lda/tau trio.
lapack_int LAPACKE_dorgqr (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, double * a, lapack_int lda, const double * tau)

Definition at line 36 of file lapacke_dorgqr.c.

  • LAPACKE_dorgqr_work — and here's its _work version, buffer and all 🦋
lapack_int LAPACKE_dorgqr_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, double * a, lapack_int lda, const double * tau, double
    * work, lapack_int lwork)

Definition at line 36 of file lapacke_dorgqr_work.c.

  • LAPACKE_dorgrq — rq edition, same lineup, different vibe ⭐
lapack_int LAPACKE_dorgrq (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, double * a, lapack_int lda, const double * tau)

Definition at line 36 of file lapacke_dorgrq.c.

  • LAPACKE_dorgrq_work — same but with the work/lwork sprinkles ✨
lapack_int LAPACKE_dorgrq_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, double * a, lapack_int lda, const double * tau, double
    * work, lapack_int lwork)

Definition at line 36 of file lapacke_dorgrq_work.c.

  • LAPACKE_dorgtr — switches it up with uplo instead of the m/n/k situation. Note the flex 💅
lapack_int LAPACKE_dorgtr (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, const double * tau)

Definition at line 36 of file lapacke_dorgtr.c.

  • LAPACKE_dorgtr_work — dorgtr with work and lwork tagging along 🫶
lapack_int LAPACKE_dorgtr_work (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, const double * tau, double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_dorgtr_work.c.


  • LAPACKE_dormbr — now we're in the orm era, bestie. vect and side and trans, plus m, n, k, and the c/ldc combo at the end 🌈
lapack_int LAPACKE_dormbr (int matrix_layout, char vect, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const double * a,
    lapack_int lda, const double * tau, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dormbr.c.

  • LAPACKE_dormbr_work — same, plus work and lwork, obviously 😌
lapack_int LAPACKE_dormbr_work (int matrix_layout, char vect, char side,
    char trans, lapack_int m, lapack_int n, lapack_int k, const double * a,
    lapack_int lda, const double * tau, double * c, lapack_int ldc, double *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_dormbr_work.c.

  • LAPACKE_dormhr — swaps vect for ilo/ihi. Chaotic of her but we respect it 🎀
lapack_int LAPACKE_dormhr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const double
    * a, lapack_int lda, const double * tau, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dormhr.c.

  • LAPACKE_dormhr_work — _work energy, work array, lwork count 🔥
lapack_int LAPACKE_dormhr_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const double
    * a, lapack_int lda, const double * tau, double * c, lapack_int ldc,
    double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dormhr_work.c.

  • LAPACKE_dormlq — side + trans, then m, n, k, then a/lda/tau and c/ldc. It's giving very consistent ✨
lapack_int LAPACKE_dormlq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int
    lda, const double * tau, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dormlq.c.

  • LAPACKE_dormlq_work — the buffered remix, work and lwork included 🦋
lapack_int LAPACKE_dormlq_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int
    lda, const double * tau, double * c, lapack_int ldc, double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_dormlq_work.c.

  • LAPACKE_dormql — again, letters flipped from dormlq, everything else identical. Stay awake bestie ⭐
lapack_int LAPACKE_dormql (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int
    lda, const double * tau, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dormql.c.

  • LAPACKE_dormql_work — the _work twin, zero surprises, all vibes 💜
lapack_int LAPACKE_dormql_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int
    lda, const double * tau, double * c, lapack_int ldc, double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_dormql_work.c.

  • LAPACKE_dormqr — the main character of the orm family, sorry not sorry 👑
lapack_int LAPACKE_dormqr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int
    lda, const double * tau, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dormqr.c.

  • LAPACKE_dormqr_work — dormqr but you're driving the buffer yourself 🎀
lapack_int LAPACKE_dormqr_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int
    lda, const double * tau, double * c, lapack_int ldc, double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_dormqr_work.c.

  • LAPACKE_dormrq — rq girlie, same parameter party 🌸
lapack_int LAPACKE_dormrq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int
    lda, const double * tau, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dormrq.c.

  • LAPACKE_dormrq_work — and with work + lwork, she's complete 🫶
lapack_int LAPACKE_dormrq_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const double * a, lapack_int
    lda, const double * tau, double * c, lapack_int ldc, double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_dormrq_work.c.

  • LAPACKE_dormrz — ok she's different: there's a lapack_int l sitting between k and a, so read carefully 👀🔥
lapack_int LAPACKE_dormrz (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, const double *
    a, lapack_int lda, const double * tau, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dormrz.c.

  • LAPACKE_dormrz_work — the extra l and the work/lwork duo. Triple-check your args, ngl 💀
lapack_int LAPACKE_dormrz_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, const double *
    a, lapack_int lda, const double * tau, double * c, lapack_int ldc,
    double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dormrz_work.c.

  • LAPACKE_dormtr — brings back uplo! So it's side, uplo, trans, then m, n, a, lda, tau, c, ldc 🌈
lapack_int LAPACKE_dormtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const double * a, lapack_int lda,
    const double * tau, double * c, lapack_int ldc)

Definition at line 36 of file lapacke_dormtr.c.

  • LAPACKE_dormtr_work — dormtr plus the work/lwork encore ⭐
lapack_int LAPACKE_dormtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const double * a, lapack_int
    lda, const double * tau, double * c, lapack_int ldc, double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_dormtr_work.c.


  • LAPACKE_dpbcon — new family alert 🚨 pb! We got uplo, n, kd, ab with ldab, then anorm and rcond.
lapack_int LAPACKE_dpbcon (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const double * ab, lapack_int ldab, double anorm, double
    * rcond)

Definition at line 36 of file lapacke_dpbcon.c.

  • LAPACKE_dpbcon_work — same but now with BOTH a work array and an iwork integer array 🍓
lapack_int LAPACKE_dpbcon_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const double * ab, lapack_int ldab, double anorm, double
    * rcond, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dpbcon_work.c.

  • LAPACKE_dpbequ — last one in this batch! uplo, n, kd, ab, ldab, then three outputs: s, scond, amax. She's giving results 💅
lapack_int LAPACKE_dpbequ (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const double * ab, lapack_int ldab, double * s, double *
    scond, double * amax)

Definition at line 36 of file lapacke_dpbequ.c.

LAPACKE_dpbequ_work

lapack_int LAPACKE_dpbequ_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const double * ab, lapack_int ldab, double * s, double *
    scond, double * amax)

Definition at line 36 of file lapacke_dpbequ_work.c.

okay so this is the _work twin of the equilibration vibe 💅 note the ab/ldab band-storage energy and the trio of output pointers s, scond, amax — all hanging out at the end of the arg list like the last three people to leave the party. 🎀

LAPACKE_dpbrfs

lapack_int LAPACKE_dpbrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const double * ab, lapack_int ldab,
    const double * afb, lapack_int ldafb, const double * b, lapack_int ldb,
    double * x, lapack_int ldx, double * ferr, double * berr)

Definition at line 36 of file lapacke_dpbrfs.c.

bestie look at this arg list — ab + ldab, then afb + ldafb, then b + ldb, then x + ldx, and finally ferr and berr are just... vibing at the end 🦋 every matrix brings its own leading dimension, that's the whole aesthetic, no cap.

LAPACKE_dpbrfs_work

lapack_int LAPACKE_dpbrfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const double * ab, lapack_int ldab,
    const double * afb, lapack_int ldafb, const double * b, lapack_int ldb,
    double * x, lapack_int ldx, double * ferr, double * berr, double * work,
    lapack_int * iwork)

Definition at line 36 of file lapacke_dpbrfs_work.c.

literally the same lineup as LAPACKE_dpbrfs but it brought friends 💀 you get work (a double *) and iwork (a lapack_int *) tacked on the end. the more the merrier honestly 🫶

LAPACKE_dpbstf

lapack_int LAPACKE_dpbstf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kb, double * bb, lapack_int ldbb)

Definition at line 36 of file lapacke_dpbstf.c.

short, sweet, and to the point 🌸 uplo, n, kb, then your bb matrix with its ldbb leading dimension. sometimes a function just knows what it wants and doesn't overthink it ✨

LAPACKE_dpbstf_work

lapack_int LAPACKE_dpbstf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kb, double * bb, lapack_int ldbb)

Definition at line 36 of file lapacke_dpbstf_work.c.

iconic behaviour: identical signature to LAPACKE_dpbstf, just the _work version doing its thing in its own file. yes they're the same. no I will not be explaining further. 💅

LAPACKE_dpbsv

lapack_int LAPACKE_dpbsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, double * ab, lapack_int ldab, double *
    b, lapack_int ldb)

Definition at line 36 of file lapacke_dpbsv.c.

the -sv girlies ate with this one 🔥 band matrix ab with ldab, right-hand side b with ldb, and nrhs for how many right-hand sides you're serving. main character energy fr fr 👑

LAPACKE_dpbsv_work

lapack_int LAPACKE_dpbsv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, double * ab, lapack_int ldab, double *
    b, lapack_int ldb)

Definition at line 36 of file lapacke_dpbsv_work.c.

same signature as LAPACKE_dpbsv, different file, same amount of drama. 🍓 two icons, one family.

LAPACKE_dpbsvx

lapack_int LAPACKE_dpbsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, double * ab, lapack_int
    ldab, double * afb, lapack_int ldafb, char * equed, double * s, double *
    b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double *
    ferr, double * berr)

Definition at line 36 of file lapacke_dpbsvx.c.

the extra x at the end of the name really said "let me cook" 😭 and look at this arg list — fact up front as a char, then equed and s and b/ldb and x/ldx, then the review squad rcond, ferr, berr. it's giving whole ordeal. a beautiful one though. ✨

LAPACKE_dpbsvx_work

lapack_int LAPACKE_dpbsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, double * ab, lapack_int
    ldab, double * afb, lapack_int ldafb, char * equed, double * s, double *
    b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double *
    ferr, double * berr, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dpbsvx_work.c.

LAPACKE_dpbsvx but with work and iwork bolted onto the end like the little bows on a gift 🎀 exact same everything else, keep the order, don't rearrange, iykyk.

LAPACKE_dpbtrf

lapack_int LAPACKE_dpbtrf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, double * ab, lapack_int ldab)

Definition at line 36 of file lapacke_dpbtrf.c.

uplo + n + kd and one lone ab/ldab pair. six args, zero notes, absolutely flawless. ⭐

LAPACKE_dpbtrf_work

lapack_int LAPACKE_dpbtrf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, double * ab, lapack_int ldab)

Definition at line 36 of file lapacke_dpbtrf_work.c.

yep, identical to LAPACKE_dpbtrf, the _work suffix is doing all the heavy lifting in the naming department. 💜

LAPACKE_dpbtrs

lapack_int LAPACKE_dpbtrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const double * ab, lapack_int ldab,
    double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dpbtrs.c.

notice ab is const double * here but b is plain double * — one reads, one writes, that's the whole dynamic 🔥 nrhs is there to tell you how many right-hand sides b is packing.

LAPACKE_dpbtrs_work

lapack_int LAPACKE_dpbtrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const double * ab, lapack_int ldab,
    double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dpbtrs_work.c.

identical to LAPACKE_dpbtrs, no extra args, no notes, just the _work label. consistencty is a love language 🫶

LAPACKE_dpftrf

lapack_int LAPACKE_dpftrf (int matrix_layout, char transr, char uplo,
    lapack_int n, double * a)

Definition at line 36 of file lapacke_dpftrf.c.

two char args back to back (transr then uplo) and then a single a with no leading dimension in sight 😳 yes bestie, no lda, read it again, it's really not there. iconic.

LAPACKE_dpftrf_work

lapack_int LAPACKE_dpftrf_work (int matrix_layout, char transr, char uplo,
    lapack_int n, double * a)

Definition at line 36 of file lapacke_dpftrf_work.c.

same five args as LAPACKE_dpftrf. still no leading dimension. we stay unbothered 🌸

LAPACKE_dpftri

lapack_int LAPACKE_dpftri (int matrix_layout, char transr, char uplo,
    lapack_int n, double * a)

Definition at line 36 of file lapacke_dpftri.c.

transr! uplo! n! a! that's the whole thing. short king behaviour honestly 💀

LAPACKE_dpftri_work

lapack_int LAPACKE_dpftri_work (int matrix_layout, char transr, char uplo,
    lapack_int n, double * a)

Definition at line 36 of file lapacke_dpftri_work.c.

identical signature, _work edition, no extra args. the consistency is lowkey soothing 🦋

LAPACKE_dpftrs

lapack_int LAPACKE_dpftrs (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_int nrhs, const double * a, double * b, lapack_int
    ldb)

Definition at line 36 of file lapacke_dpftrs.c.

a is const, b is not, nrhs tells you how many columns of b are in play, and ldb is hanging on at the end being its usual self. ✨

LAPACKE_dpftrs_work

lapack_int LAPACKE_dpftrs_work (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_int nrhs, const double * a, double * b, lapack_int
    ldb)

Definition at line 36 of file lapacke_dpftrs_work.c.

matchy-matchy with LAPACKE_dpftrs, just living in a different file. we love a reliable sibling 🌈

LAPACKE_dpocon

lapack_int LAPACKE_dpocon (int matrix_layout, char uplo, lapack_int n, const
    double * a, lapack_int lda, double anorm, double * rcond)

Definition at line 36 of file lapacke_dpocon.c.

okay so anorm is a plain double (not a pointer!) sitting right between lda and rcond, and that little detail is the whole personality of this function. don't let your brain autopilot past it 🙈

LAPACKE_dpocon_work

lapack_int LAPACKE_dpocon_work (int matrix_layout, char uplo, lapack_int n,
    const double * a, lapack_int lda, double anorm, double * rcond, double *
    work, lapack_int * iwork)

Definition at line 36 of file lapacke_dpocon_work.c.

anorm is still a plain double, and now work + iwork are at the end. the glow-up is subtle but it's there 💅

LAPACKE_dpoequ

lapack_int LAPACKE_dpoequ (int matrix_layout, lapack_int n, const double *
    a, lapack_int lda, double * s, double * scond, double * amax)

Definition at line 36 of file lapacke_dpoequ.c.

no uplo here bestie, it just goes matrix_layout, n, a/lda, then the pointer squad s, scond, amax. three outputs, no waiting 🎀

LAPACKE_dpoequ_work

lapack_int LAPACKE_dpoequ_work (int matrix_layout, lapack_int n, const
    double * a, lapack_int lda, double * s, double * scond, double * amax)

Definition at line 36 of file lapacke_dpoequ_work.c.

identical to LAPACKE_dpoequ. same s/scond/amax trio, same no-uplo energy. ⭐

LAPACKE_dpoequb

lapack_int LAPACKE_dpoequb (int matrix_layout, lapack_int n, const double *
    a, lapack_int lda, double * s, double * scond, double * amax)

Definition at line 36 of file lapacke_dpoequb.c.

the b at the end of the name is the ONLY difference from LAPACKE_dpoequ and the signature is genuinely the same. read that twice. yes. 🦋

LAPACKE_dpoequb_work

lapack_int LAPACKE_dpoequb_work (int matrix_layout, lapack_int n, const
    double * a, lapack_int lda, double * s, double * scond, double * amax)

Definition at line 36 of file lapacke_dpoequb_work.c.

and here's the _work of that one. same args. I'm as surprised as you are ✨

LAPACKE_dporfs

lapack_int LAPACKE_dporfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, const double * af,
    lapack_int ldaf, const double * b, lapack_int ldb, double * x,
    lapack_int ldx, double * ferr, double * berr)

Definition at line 36 of file lapacke_dporfs.c.

count the leading dimensions with me: lda, ldaf, ldb, ldx. four of them. four!! and after all that, ferr and berr just stroll in at the end like they own the place 😭

LAPACKE_dporfs_work

lapack_int LAPACKE_dporfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, const double * af,
    lapack_int ldaf, const double * b, lapack_int ldb, double * x,
    lapack_int ldx, double * ferr, double * berr, double * work, lapack_int
    * iwork)

Definition at line 36 of file lapacke_dporfs_work.c.

LAPACKE_dporfs plus work and iwork. all your const pointers stay const, don't get creative, just scroll to the end and add the two extras. 🫶

LAPACKE_dporfsx

lapack_int LAPACKE_dporfsx (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, const
    double * af, lapack_int ldaf, const double * s, const double * b,
    lapack_int ldb, double * x, lapack_int ldx, double * rcond, double *
    berr, lapack_int n_err_bnds, double * err_bnds_norm, double *
    err_bnds_comp, lapack_int nparams, double * params)

Definition at line 36 of file lapacke_dporfsx.c.

okay THIS one is the main character 🔥 twenty-one args. equed as a char, s as const, then rcond and berr, then the whole n_err_bnds / err_bnds_norm / err_bnds_comp / nparams / params finale. it's giving finale-of-the-tour energy 👑

LAPACKE_dporfsx_work

lapack_int LAPACKE_dporfsx_work (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, const
    double * af, lapack_int ldaf, const double * s, const double * b,
    lapack_int ldb, double * x, lapack_int ldx, double * rcond, double *
    berr, lapack_int n_err_bnds, double * err_bnds_norm, double *
    err_bnds_comp, lapack_int nparams, double * params, double * work,
    lapack_int * iwork)

Definition at line 36 of file lapacke_dporfsx_work.c.

twenty-three args now. TWENTY-THREE. take a breath, scroll the signature, and note that work and iwork are the only new additions at the very end 💀

LAPACKE_dposv

lapack_int LAPACKE_dposv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, double * a, lapack_int lda, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dposv.c.

short and slay. a/lda, b/ldb, both plain double *, both getting written to. no consts here, we're going in 🌈

LAPACKE_dposv_work

lapack_int LAPACKE_dposv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, double * a, lapack_int lda, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dposv_work.c.

same eight args as LAPACKE_dposv. no extras. no surprises. just vibes 🦋

LAPACKE_dposvx

lapack_int LAPACKE_dposvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * af,
    lapack_int ldaf, char * equed, double * s, double * b, lapack_int ldb,
    double * x, lapack_int ldx, double * rcond, double * ferr, double *
    berr)

Definition at line 36 of file lapacke_dposvx.c.

fact starts the show, equed is a char * (pointer this time, not a bare char — don't mix them up bestie 🙈), and the tail is rcond, ferr, berr. it's a lot and it's correct. 💅

LAPACKE_dposvx_work

lapack_int LAPACKE_dposvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * af,
    lapack_int ldaf, char * equed, double * s, double * b, lapack_int ldb,
    double * x, lapack_int ldx, double * rcond, double * ferr, double *
    berr, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dposvx_work.c.

the same eighteen plus work and iwork equals a nice round twenty. math is mathing today ✨

LAPACKE_dposvxx

lapack_int LAPACKE_dposvxx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * af,
    lapack_int ldaf, char * equed, double * s, double * b, lapack_int ldb,
    double * x, lapack_int ldx, double * rcond, double * rpvgrw, double *
    berr, lapack_int n_err_bnds, double * err_bnds_norm, double *
    err_bnds_comp, lapack_int nparams, double * params)

Definition at line 36 of file lapacke_dposvxx.c.

the double-x version said "add more" and honestly? it ate 🔥 spot the new rpvgrw tucked in right after rcond, plus the whole error-bounds crew at the end. one extra x, so many extra args. iconic. 👑

LAPACKE_dposvxx_work

lapack_int LAPACKE_dposvxx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * af,
    lapack_int ldaf, char * equed, double * s, double * b, lapack_int ldb,
    double * x, lapack_int ldx, double * rcond, double * rpvgrw, double *
    berr, lapack_int n_err_bnds, double * err_bnds_norm, double *
    err_bnds_comp, lapack_int nparams, double * params, double * work,
    lapack_int * iwork)

Definition at line 36 of file lapacke_dposvxx_work.c.

genuinely the longest one in this batch and it's not even close 😭 everything from LAPACKE_dposvxx, plus work and iwork, perfectly parked at the end. 🫶

LAPACKE_dpotrf

lapack_int LAPACKE_dpotrf (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda)

Definition at line 36 of file lapacke_dpotrf.c.

five args, one uplo, one a/lda pair. a classic. a legend. the blueprint 💜

LAPACKE_dpotrf2

lapack_int LAPACKE_dpotrf2 (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda)

Definition at line 36 of file lapacke_dpotrf2.c.

the 2 in the name is the entire difference from LAPACKE_dpotrf on the signature level. five args. same five. 🌸

LAPACKE_dpotrf2_work

lapack_int LAPACKE_dpotrf2_work (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda)

Definition at line 36 of file lapacke_dpotrf2_work.c.

_work on the end, still five args, still no extra buffers. obsessed with the restraint honestly 🎀

LAPACKE_dpotrf_work

lapack_int LAPACKE_dpotrf_work (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda)

Definition at line 36 of file lapacke_dpotrf_work.c.

the _work of the original LAPACKE_dpotrf, and yes, same five args, no trailing buffers. did I check twice? absolutely. 💅

LAPACKE_dpotri

lapack_int LAPACKE_dpotri (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda)

Definition at line 36 of file lapacke_dpotri.c.

-tri era. same skeleton as its siblings: matrix_layout, uplo, n, a, lda. a family that dresses alike 🦋

LAPACKE_dpotri_work

lapack_int LAPACKE_dpotri_work (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda)

Definition at line 36 of file lapacke_dpotri_work.c.

same five. _work version. that's the post ✨

LAPACKE_dpotrs

lapack_int LAPACKE_dpotrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, double * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_dpotrs.c.

here a went const on us (don't write, bestie) while b stays writable, and nrhs is wedged between n and the matrices. classic layout, no notes. ⭐

LAPACKE_dpotrs_work

lapack_int LAPACKE_dpotrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, double * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_dpotrs_work.c.

identical to LAPACKE_dpotrs, a still const, b still not, no extra args. consistent queen 💜

LAPACKE_dppcon

lapack_int LAPACKE_dppcon (int matrix_layout, char uplo, lapack_int n, const
    double * ap, double anorm, double * rcond)

Definition at line 36 of file lapacke_dppcon.c.

note the ap (not a, not ab — ap, packed storage energy 🌈), and there's no leading dimension because... there isn't one. anorm is a plain double, rcond is a pointer. 🍓

LAPACKE_dppcon_work

lapack_int LAPACKE_dppcon_work (int matrix_layout, char uplo, lapack_int n,
    const double * ap, double anorm, double * rcond, double * work,
    lapack_int * iwork)

Definition at line 36 of file lapacke_dppcon_work.c.

ap, anorm, rcond, then work and iwork come crashing the party at the end. same as LAPACKE_dppcon otherwise, promise 🫶

LAPACKE_dppequ 💖

lapack_int LAPACKE_dppequ (int matrix_layout, char uplo, lapack_int n, const double * ap, double * s, double * scond, double * amax)

bestie this one has no work twin energy, it's just out here doing the equilibration thing with s, scond and amax all up in the argument list. Definition at line 36 of file lapacke_dppequ.c.

LAPACKE_dppequ_work ✨

lapack_int LAPACKE_dppequ_work (int matrix_layout, char uplo, lapack_int n, const double * ap, double * s, double * scond, double * amax)

same exact arg list as its non-work sister, no cap, it's giving twins. Definition at line 36 of file lapacke_dppequ_work.c.

LAPACKE_dpprfs 🎀

lapack_int LAPACKE_dpprfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const double * ap, const double * afp, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * ferr, double * berr)

two const double * pointers, two leading dimension ints, and the iconic ferr/berr duo at the end. we love a full house. Definition at line 36 of file lapacke_dpprfs.c.

LAPACKE_dpprfs_work 💅

lapack_int LAPACKE_dpprfs_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const double * ap, const double * afp, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * ferr, double * berr, double * work, lapack_int * iwork)

everything from the previous one PLUS double * work, lapack_int * iwork tacked on the end. the work variants always gotta bring their friends fr fr. Definition at line 36 of file lapacke_dpprfs_work.c.

LAPACKE_dppsv 🦋

lapack_int LAPACKE_dppsv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * ap, double * b, lapack_int ldb)

short king. ap, b, ldb, done. Definition at line 36 of file lapacke_dppsv.c.

LAPACKE_dppsv_work 🌸

lapack_int LAPACKE_dppsv_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * ap, double * b, lapack_int ldb)

identical signature to the plain one — not a single extra arg, and honestly? respect. Definition at line 36 of file lapacke_dppsv_work.c.

LAPACKE_dppsvx 🔥

lapack_int LAPACKE_dppsvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, double * ap, double * afp, char * equed, double * s, double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * ferr, double * berr)

look at this cast list 😭 three chars (fact, uplo, and the pointer equed), then a whole parade of doubles ending in rcond, ferr, berr. main character energy. Definition at line 36 of file lapacke_dppsvx.c.

LAPACKE_dppsvx_work 👑

lapack_int LAPACKE_dppsvx_work (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, double * ap, double * afp, char * equed, double * s, double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * ferr, double * berr, double * work, lapack_int * iwork)

the whole dppsvx situation plus double * work, lapack_int * iwork because workspace is self-care. Definition at line 36 of file lapacke_dppsvx_work.c.

LAPACKE_dpptrf 🌈

lapack_int LAPACKE_dpptrf (int matrix_layout, char uplo, lapack_int n, double * ap)

four args, zero drama. minimalism ate. Definition at line 36 of file lapacke_dpptrf.c.

LAPACKE_dpptrf_work ⭐

lapack_int LAPACKE_dpptrf_work (int matrix_layout, char uplo, lapack_int n, double * ap)

yep, same four. the _work label here is doing absolutely nothing to the arg list and it's iconic for that. Definition at line 36 of file lapacke_dpptrf_work.c.

LAPACKE_dpptri 💜

lapack_int LAPACKE_dpptri (int matrix_layout, char uplo, lapack_int n, double * ap)

dpptri said "I too shall take exactly matrix_layout, uplo, n and ap." consistency queen. Definition at line 36 of file lapacke_dpptri.c.

LAPACKE_dpptri_work 🍓

lapack_int LAPACKE_dpptri_work (int matrix_layout, char uplo, lapack_int n, double * ap)

four args again, we're on a streak bestie. Definition at line 36 of file lapacke_dpptri_work.c.

LAPACKE_dpptrs 🧚

lapack_int LAPACKE_dpptrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const double * ap, double * b, lapack_int ldb)

ooh note the const on ap but not on b 👀 that's the tell. Definition at line 36 of file lapacke_dpptrs.c.

LAPACKE_dpptrs_work 💀

lapack_int LAPACKE_dpptrs_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const double * ap, double * b, lapack_int ldb)

same seven, no work pointer in sight, which is lowkey funny given the name. Definition at line 36 of file lapacke_dpptrs_work.c.

LAPACKE_dpstrf 🫶

lapack_int LAPACKE_dpstrf (int matrix_layout, char uplo, lapack_int n, double * a, lapack_int lda, lapack_int * piv, lapack_int * rank, double tol)

pivot reveal! piv, rank, tol — it's a whole narrative arc in eight parameters. Definition at line 36 of file lapacke_dpstrf.c.

LAPACKE_dpstrf_work 🌸

lapack_int LAPACKE_dpstrf_work (int matrix_layout, char uplo, lapack_int n, double * a, lapack_int lda, lapack_int * piv, lapack_int * rank, double tol, double * work)

the above plus one single double * work at the end. that's it, that's the whole diff. Definition at line 36 of file lapacke_dpstrf_work.c.

LAPACKE_dptcon ✨

lapack_int LAPACKE_dptcon (lapack_int n, const double * d, const double * e, double anorm, double * rcond)

WAIT. no matrix_layout?! bestie this one literally skipped the first parameter that everyone else has and just opened with lapack_int n 😳 note it, don't forget it. Definition at line 36 of file lapacke_dptcon.c.

LAPACKE_dptcon_work 💖

lapack_int LAPACKE_dptcon_work (lapack_int n, const double * d, const double * e, double anorm, double * rcond, double * work)

also matrix_layout-free, and it adds double * work on top of the anorm / rcond business. Definition at line 36 of file lapacke_dptcon_work.c.

LAPACKE_dpteqr 🎀

lapack_int LAPACKE_dpteqr (int matrix_layout, char compz, lapack_int n, double * d, double * e, double * z, lapack_int ldz)

compz is that girl — a char controlling whether z is even in the conversation. Definition at line 36 of file lapacke_dpteqr.c.

LAPACKE_dpteqr_work 🦋

lapack_int LAPACKE_dpteqr_work (int matrix_layout, char compz, lapack_int n, double * d, double * e, double * z, lapack_int ldz, double * work)

compz stays, ldz stays, and double * work joins the group chat. Definition at line 36 of file lapacke_dpteqr_work.c.

LAPACKE_dptrfs 🔥

lapack_int LAPACKE_dptrfs (int matrix_layout, lapack_int n, lapack_int nrhs, const double * d, const double * e, const double * df, const double * ef, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * ferr, double * berr)

count the consts with me: d, e, df, ef, b — five of them, all read-only icons, and only x gets to be written to. Definition at line 36 of file lapacke_dptrfs.c.

LAPACKE_dptrfs_work 💅

lapack_int LAPACKE_dptrfs_work (int matrix_layout, lapack_int n, lapack_int nrhs, const double * d, const double * e, const double * df, const double * ef, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * ferr, double * berr, double * work)

same huge list plus a lone double * work. notice: no iwork here, just the one workspace pointer, okayyy. Definition at line 36 of file lapacke_dptrfs_work.c.

LAPACKE_dptsv 🌈

lapack_int LAPACKE_dptsv (int matrix_layout, lapack_int n, lapack_int nrhs, double * d, double * e, double * b, lapack_int ldb)

no uplo! no packed-anything! just d, e, b and vibes. Definition at line 36 of file lapacke_dptsv.c.

LAPACKE_dptsv_work ⭐

lapack_int LAPACKE_dptsv_work (int matrix_layout, lapack_int n, lapack_int nrhs, double * d, double * e, double * b, lapack_int ldb)

identical seven args, the _work suffix is purely a state of mind. Definition at line 36 of file lapacke_dptsv_work.c.

LAPACKE_dptsvx 💜

lapack_int LAPACKE_dptsvx (int matrix_layout, char fact, lapack_int n, lapack_int nrhs, const double * d, const double * e, double * df, double * ef, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * ferr, double * berr)

sibling reveal: d/e are const but df/ef are NOT. that asymmetry is the whole point and it's giving "one of us has to change". Definition at line 36 of file lapacke_dptsvx.c.

LAPACKE_dptsvx_work 🍓

lapack_int LAPACKE_dptsvx_work (int matrix_layout, char fact, lapack_int n, lapack_int nrhs, const double * d, const double * e, double * df, double * ef, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * ferr, double * berr, double * work)

all those args, fact included, plus double * work at the tail. Definition at line 36 of file lapacke_dptsvx_work.c.

LAPACKE_dpttrf 🧚

lapack_int LAPACKE_dpttrf (lapack_int n, double * d, double * e)

THREE. ARGS. no matrix_layout, no uplo, nothing. d and e and a dream. Definition at line 36 of file lapacke_dpttrf.c.

LAPACKE_dpttrf_work 💀

lapack_int LAPACKE_dpttrf_work (lapack_int n, double * d, double * e)

also just n, d, e. the smallest signature on this whole stretch of the page honestly. Definition at line 36 of file lapacke_dpttrf_work.c.

LAPACKE_dpttrs 🫶

lapack_int LAPACKE_dpttrs (int matrix_layout, lapack_int n, lapack_int nrhs, const double * d, const double * e, double * b, lapack_int ldb)

matrix_layout is back babes, and d/e are const while b is free to be rewritten. Definition at line 36 of file lapacke_dpttrs.c.

LAPACKE_dpttrs_work 🌸

lapack_int LAPACKE_dpttrs_work (int matrix_layout, lapack_int n, lapack_int nrhs, const double * d, const double * e, double * b, lapack_int ldb)

same seven, same const situation, no extra workspace pointer. Definition at line 36 of file lapacke_dpttrs_work.c.

LAPACKE_dsbev ✨

lapack_int LAPACKE_dsbev (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * w, double * z, lapack_int ldz)

banded era begins 🎸 kd and ldab and ldz all living together, plus the w/z duo. Definition at line 36 of file lapacke_dsbev.c.

LAPACKE_dsbev_2stage 🔥

lapack_int LAPACKE_dsbev_2stage (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * w, double * z, lapack_int ldz)

the _2stage remix drops with the exact same ten args as the original. Definition at line 36 of file lapacke_dsbev_2stage.c.

LAPACKE_dsbev_2stage_work 💖

lapack_int LAPACKE_dsbev_2stage_work (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * w, double * z, lapack_int ldz, double * work, lapack_int lwork)

full name is a mouthful, and it brings double * work, lapack_int lwork — both of them, not just the pointer. Definition at line 36 of file lapacke_dsbev_2stage_work.c.

LAPACKE_dsbev_work 🎀

lapack_int LAPACKE_dsbev_work (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * w, double * z, lapack_int ldz, double * work)

note the difference from the _2stage_work one: here it's only double * work, no lwork 😌 character development. Definition at line 36 of file lapacke_dsbev_work.c.

LAPACKE_dsbevd 🦋

lapack_int LAPACKE_dsbevd (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * w, double * z, lapack_int ldz)

the d on the end stands for drama, and the args are identical to dsbev. Definition at line 36 of file lapacke_dsbevd.c.

LAPACKE_dsbevd_2stage 🌈

lapack_int LAPACKE_dsbevd_2stage (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * w, double * z, lapack_int ldz)

same ten, two stages, zero signature changes. Definition at line 36 of file lapacke_dsbevd_2stage.c.

LAPACKE_dsbevd_2stage_work ⭐

lapack_int LAPACKE_dsbevd_2stage_work (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * w, double * z, lapack_int ldz, double * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

FOUR extra args at the end: work, lwork, iwork, liwork. it said "workspace? yes, both kinds, with sizes." Definition at line 36 of file lapacke_dsbevd_2stage_work.c.

LAPACKE_dsbevd_work 💜

lapack_int LAPACKE_dsbevd_work (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * w, double * z, lapack_int ldz, double * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

same four extras as the 2stage version — double * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork. matchy matchy. Definition at line 36 of file lapacke_dsbevd_work.c.

LAPACKE_dsbevx 🍓

lapack_int LAPACKE_dsbevx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, double * z, lapack_int ldz, lapack_int * ifail)

HELLO twenty arguments 😭 range, vl, vu, il, iu, abstol, m, and that lovely little ifail pointer at the end. the full deluxe package. Definition at line 36 of file lapacke_dsbevx.c.

LAPACKE_dsbevx_2stage 🧚

lapack_int LAPACKE_dsbevx_2stage (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, double * z, lapack_int ldz, lapack_int * ifail)

all twenty again, ifail included, just with the _2stage glow-up. Definition at line 36 of file lapacke_dsbevx_2stage.c.

LAPACKE_dsbevx_2stage_work 💀

lapack_int LAPACKE_dsbevx_2stage_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, double * z, lapack_int ldz, double * work, lapack_int lwork, lapack_int * iwork, lapack_int * ifail)

twenty becomes twenty-four: double * work, lapack_int lwork, lapack_int * iwork get wedged in there and ifail holds down the last spot. Definition at line 36 of file lapacke_dsbevx_2stage_work.c.

LAPACKE_dsbevx_work 🫶

lapack_int LAPACKE_dsbevx_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, double * z, lapack_int ldz, double * work, lapack_int * iwork, lapack_int * ifail)

careful bestie, this one has work + iwork but NOT lwork — do not confuse it with the 2stage sibling 🔍 Definition at line 36 of file lapacke_dsbevx_work.c.

LAPACKE_dsbgst 🌸

lapack_int LAPACKE_dsbgst (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb, double * ab, lapack_int ldab, const double * bb, lapack_int ldbb, double * x, lapack_int ldx)

two bands (ka and kb), two leading dimensions (ldab, ldbb), and vect sitting up top doing its thing. also bb is const and x is not, noted 📝 Definition at line 36 of file lapacke_dsbgst.c.

LAPACKE_dsbgst_work ✨

lapack_int LAPACKE_dsbgst_work (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb, double * ab, lapack_int ldab, const double * bb, lapack_int ldbb, double * x, lapack_int ldx, double * work)

everything above, plus exactly one double * work. we love a low-drama addition. Definition at line 36 of file lapacke_dsbgst_work.c.

LAPACKE_dsbgv 🎀

lapack_int LAPACKE_dsbgv (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, double * ab, lapack_int ldab, double * bb, lapack_int ldbb, double * w, double * z, lapack_int ldz)

last one in this batch and it's a big mood: jobz, uplo, ka, kb, ab, ldab, bb, ldbb, then w, z, ldz to close it out. thirteen args, chef's kiss 👑 Definition at line 36 of file lapacke_dsbgv.c.


and yes, if you were wondering — every single one of these is at line 36 of its file. not a typo, that's just how this page rolls 💅 more coming, don't go anywhere bestie 🦋

LAPACKE_dsbgv_work 💜

lapack_int LAPACKE_dsbgv_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, double * ab, lapack_int
    ldab, double * bb, lapack_int ldbb, double * w, double * z, lapack_int
    ldz, double * work)

Definition at line 36 of file lapacke_dsbgv_work.c.


LAPACKE_dsbgvd 🎀

lapack_int LAPACKE_dsbgvd (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, double * ab, lapack_int
    ldab, double * bb, lapack_int ldbb, double * w, double * z, lapack_int
    ldz)

Definition at line 36 of file lapacke_dsbgvd.c.

LAPACKE_dsbgvd_work ✨

lapack_int LAPACKE_dsbgvd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, double * ab, lapack_int
    ldab, double * bb, lapack_int ldbb, double * w, double * z, lapack_int
    ldz, double * work, lapack_int lwork, lapack_int * iwork, lapack_int
    liwork)

Definition at line 36 of file lapacke_dsbgvd_work.c.


LAPACKE_dsbgvx 🦋

lapack_int LAPACKE_dsbgvx (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, lapack_int ka, lapack_int kb, double * ab,
    lapack_int ldab, double * bb, lapack_int ldbb, double * q, lapack_int
    ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol,
    lapack_int * m, double * w, double * z, lapack_int ldz, lapack_int *
    ifail)

Definition at line 36 of file lapacke_dsbgvx.c.

LAPACKE_dsbgvx_work 🌸

lapack_int LAPACKE_dsbgvx_work (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_int ka, lapack_int kb, double * ab,
    lapack_int ldab, double * bb, lapack_int ldbb, double * q, lapack_int
    ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol,
    lapack_int * m, double * w, double * z, lapack_int ldz, double * work,
    lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_dsbgvx_work.c.


LAPACKE_dsbtrd 🫶

lapack_int LAPACKE_dsbtrd (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * d,
    double * e, double * q, lapack_int ldq)

Definition at line 36 of file lapacke_dsbtrd.c.

LAPACKE_dsbtrd_work 💫

lapack_int LAPACKE_dsbtrd_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int kd, double * ab, lapack_int ldab, double * d,
    double * e, double * q, lapack_int ldq, double * work)

Definition at line 36 of file lapacke_dsbtrd_work.c.


LAPACKE_dsfrk 🔥

lapack_int LAPACKE_dsfrk (int matrix_layout, char transr, char uplo, char
    trans, lapack_int n, lapack_int k, double alpha, const double * a,
    lapack_int lda, double beta, double * c)

Definition at line 36 of file lapacke_dsfrk.c.

LAPACKE_dsfrk_work ⭐

lapack_int LAPACKE_dsfrk_work (int matrix_layout, char transr, char uplo,
    char trans, lapack_int n, lapack_int k, double alpha, const double * a,
    lapack_int lda, double beta, double * c)

Definition at line 36 of file lapacke_dsfrk_work.c.


LAPACKE_dsgesv 💅

lapack_int LAPACKE_dsgesv (int matrix_layout, lapack_int n, lapack_int nrhs,
    double * a, lapack_int lda, lapack_int * ipiv, double * b, lapack_int
    ldb, double * x, lapack_int ldx, lapack_int * iter)

Definition at line 36 of file lapacke_dsgesv.c.

LAPACKE_dsgesv_work 👑

lapack_int LAPACKE_dsgesv_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, double * a, lapack_int lda, lapack_int * ipiv, double * b,
    lapack_int ldb, double * x, lapack_int ldx, double * work, float *
    swork, lapack_int * iter)

Definition at line 36 of file lapacke_dsgesv_work.c.


LAPACKE_dspcon 🌈

lapack_int LAPACKE_dspcon (int matrix_layout, char uplo, lapack_int n, const
    double * ap, const lapack_int * ipiv, double anorm, double * rcond)

Definition at line 36 of file lapacke_dspcon.c.

LAPACKE_dspcon_work 🍓

lapack_int LAPACKE_dspcon_work (int matrix_layout, char uplo, lapack_int n,
    const double * ap, const lapack_int * ipiv, double anorm, double *
    rcond, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dspcon_work.c.


LAPACKE_dspev 🧚

lapack_int LAPACKE_dspev (int matrix_layout, char jobz, char uplo,
    lapack_int n, double * ap, double * w, double * z, lapack_int ldz)

Definition at line 36 of file lapacke_dspev.c.

LAPACKE_dspev_work 💖

lapack_int LAPACKE_dspev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, double * ap, double * w, double * z, lapack_int ldz,
    double * work)

Definition at line 36 of file lapacke_dspev_work.c.


LAPACKE_dspevd 🦋

lapack_int LAPACKE_dspevd (int matrix_layout, char jobz, char uplo,
    lapack_int n, double * ap, double * w, double * z, lapack_int ldz)

Definition at line 36 of file lapacke_dspevd.c.

LAPACKE_dspevd_work 💜

lapack_int LAPACKE_dspevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, double * ap, double * w, double * z, lapack_int ldz,
    double * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dspevd_work.c.


LAPACKE_dspevx ✨

lapack_int LAPACKE_dspevx (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, double * ap, double vl, double vu, lapack_int il,
    lapack_int iu, double abstol, lapack_int * m, double * w, double * z,
    lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_dspevx.c.

LAPACKE_dspevx_work 🌸

lapack_int LAPACKE_dspevx_work (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, double * ap, double vl, double vu, lapack_int
    il, lapack_int iu, double abstol, lapack_int * m, double * w, double *
    z, lapack_int ldz, double * work, lapack_int * iwork, lapack_int *
    ifail)

Definition at line 36 of file lapacke_dspevx_work.c.


LAPACKE_dspgst 🎀

lapack_int LAPACKE_dspgst (int matrix_layout, lapack_int itype, char uplo,
    lapack_int n, double * ap, const double * bp)

Definition at line 36 of file lapacke_dspgst.c.

LAPACKE_dspgst_work 🫶

lapack_int LAPACKE_dspgst_work (int matrix_layout, lapack_int itype, char
    uplo, lapack_int n, double * ap, const double * bp)

Definition at line 36 of file lapacke_dspgst_work.c.


LAPACKE_dspgv 🌟

lapack_int LAPACKE_dspgv (int matrix_layout, lapack_int itype, char jobz,
    char uplo, lapack_int n, double * ap, double * bp, double * w, double *
    z, lapack_int ldz)

Definition at line 36 of file lapacke_dspgv.c.

LAPACKE_dspgv_work 💫

lapack_int LAPACKE_dspgv_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, double * ap, double * bp, double * w,
    double * z, lapack_int ldz, double * work)

Definition at line 36 of file lapacke_dspgv_work.c.


LAPACKE_dspgvd 🔥

lapack_int LAPACKE_dspgvd (int matrix_layout, lapack_int itype, char jobz,
    char uplo, lapack_int n, double * ap, double * bp, double * w, double *
    z, lapack_int ldz)

Definition at line 36 of file lapacke_dspgvd.c.

LAPACKE_dspgvd_work ⭐

lapack_int LAPACKE_dspgvd_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, double * ap, double * bp, double * w,
    double * z, lapack_int ldz, double * work, lapack_int lwork, lapack_int
    * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dspgvd_work.c.


LAPACKE_dspgvx 🌈

lapack_int LAPACKE_dspgvx (int matrix_layout, lapack_int itype, char jobz,
    char range, char uplo, lapack_int n, double * ap, double * bp, double
    vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int *
    m, double * w, double * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_dspgvx.c.

LAPACKE_dspgvx_work 🍓

lapack_int LAPACKE_dspgvx_work (int matrix_layout, lapack_int itype, char
    jobz, char range, char uplo, lapack_int n, double * ap, double * bp,
    double vl, double vu, lapack_int il, lapack_int iu, double abstol,
    lapack_int * m, double * w, double * z, lapack_int ldz, double * work,
    lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_dspgvx_work.c.


LAPACKE_dsposv 💖

lapack_int LAPACKE_dsposv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * x, lapack_int ldx, lapack_int * iter)

Definition at line 36 of file lapacke_dsposv.c.

LAPACKE_dsposv_work 👑

lapack_int LAPACKE_dsposv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * x, lapack_int ldx, double * work, float * swork, lapack_int *
    iter)

Definition at line 36 of file lapacke_dsposv_work.c.


LAPACKE_dsprfs 🧚

lapack_int LAPACKE_dsprfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * ap, const double * afp, const lapack_int
    * ipiv, const double * b, lapack_int ldb, double * x, lapack_int ldx,
    double * ferr, double * berr)

Definition at line 36 of file lapacke_dsprfs.c.

LAPACKE_dsprfs_work 🦋

lapack_int LAPACKE_dsprfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * ap, const double * afp, const lapack_int
    * ipiv, const double * b, lapack_int ldb, double * x, lapack_int ldx,
    double * ferr, double * berr, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dsprfs_work.c.


LAPACKE_dspsv 💜

lapack_int LAPACKE_dspsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, double * ap, lapack_int * ipiv, double * b, lapack_int
    ldb)

Definition at line 36 of file lapacke_dspsv.c.

LAPACKE_dspsv_work ✨

lapack_int LAPACKE_dspsv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, double * ap, lapack_int * ipiv, double * b, lapack_int
    ldb)

Definition at line 36 of file lapacke_dspsv_work.c.


LAPACKE_dspsvx 🌸

lapack_int LAPACKE_dspsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const double * ap, double * afp,
    lapack_int * ipiv, const double * b, lapack_int ldb, double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr)

Definition at line 36 of file lapacke_dspsvx.c.

LAPACKE_dspsvx_work 🎀

lapack_int LAPACKE_dspsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const double * ap, double * afp,
    lapack_int * ipiv, const double * b, lapack_int ldb, double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr, double *
    work, lapack_int * iwork)

Definition at line 36 of file lapacke_dspsvx_work.c.


LAPACKE_dsptrd 🫶

lapack_int LAPACKE_dsptrd (int matrix_layout, char uplo, lapack_int n,
    double * ap, double * d, double * e, double * tau)

Definition at line 36 of file lapacke_dsptrd.c.

LAPACKE_dsptrd_work 💫

lapack_int LAPACKE_dsptrd_work (int matrix_layout, char uplo, lapack_int n,
    double * ap, double * d, double * e, double * tau)

Definition at line 36 of file lapacke_dsptrd_work.c.


LAPACKE_dsptrf 🔥

lapack_int LAPACKE_dsptrf (int matrix_layout, char uplo, lapack_int n,
    double * ap, lapack_int * ipiv)

Definition at line 36 of file lapacke_dsptrf.c.

LAPACKE_dsptrf_work ⭐

lapack_int LAPACKE_dsptrf_work (int matrix_layout, char uplo, lapack_int n,
    double * ap, lapack_int * ipiv)

Definition at line 36 of file lapacke_dsptrf_work.c.


LAPACKE_dsptri 🌈

lapack_int LAPACKE_dsptri (int matrix_layout, char uplo, lapack_int n,
    double * ap, const lapack_int * ipiv)

Definition at line 36 of file lapacke_dsptri.c.

LAPACKE_dsptri_work 🍓

lapack_int LAPACKE_dsptri_work (int matrix_layout, char uplo, lapack_int n,
    double * ap, const lapack_int * ipiv, double * work)

Definition at line 36 of file lapacke_dsptri_work.c.


LAPACKE_dsptrs 💖

lapack_int LAPACKE_dsptrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * ap, const lapack_int * ipiv, double * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_dsptrs.c.

LAPACKE_dsptrs_work 🧚

lapack_int LAPACKE_dsptrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * ap, const lapack_int * ipiv, double * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_dsptrs_work.c.

LAPACKE_dstebz

lapack_int LAPACKE_dstebz (char range, char order, lapack_int n, double vl,
    double vu, lapack_int il, lapack_int iu, double abstol, const double *
    d, const double * e, lapack_int * m, lapack_int * nsplit, double * w,
    lapack_int * iblock, lapack_int * isplit)

Definition at line 36 of file lapacke_dstebz.c.

okay so this one does not take a matrix_layout, bestie, it just raw-dogs straight into range, order, n, and the crew 💅 you got your vl/vu pair, your il/iu pair, abstol, and then it hands you back m, nsplit, w, iblock and isplit. That's a lot of outputs and honestly? iconic.


LAPACKE_dstebz_work

lapack_int LAPACKE_dstebz_work (char range, char order, lapack_int n, double
    vl, double vu, lapack_int il, lapack_int iu, double abstol, const double
    * d, const double * e, lapack_int * m, lapack_int * nsplit, double * w,
    lapack_int * iblock, lapack_int * isplit, double * work, lapack_int *
    iwork)

Definition at line 36 of file lapacke_dstebz_work.c.

same energy, but now she brought her own scratch space — work and iwork tagged on the end like two extra bags of snacks 🍓.


LAPACKE_dstedc

lapack_int LAPACKE_dstedc (int matrix_layout, char compz, lapack_int n,
    double * d, double * e, double * z, lapack_int ldz)

Definition at line 36 of file lapacke_dstedc.c.

we're back on matrix_layout duty bestie ✨ note the compz char and the ldz leading dimension doing its thing at the end.


LAPACKE_dstedc_work

lapack_int LAPACKE_dstedc_work (int matrix_layout, char compz, lapack_int n,
    double * d, double * e, double * z, lapack_int ldz, double * work,
    lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dstedc_work.c.

the _work version ate and left no crumbs — now with work, lwork, iwork and liwork all up in the signature 💀 both lwork and liwork so you know she's thorough.


LAPACKE_dstegr

lapack_int LAPACKE_dstegr (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, double abstol, lapack_int * m, double * w, double *
    z, lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_dstegr.c.

jobz + range combo meal 🍔 and she wraps up with isuppz which is genuinely such a name. ngl I respect it.


LAPACKE_dstegr_work

lapack_int LAPACKE_dstegr_work (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, double abstol, lapack_int * m, double * w, double *
    z, lapack_int ldz, lapack_int * isuppz, double * work, lapack_int lwork,
    lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dstegr_work.c.

same squad, plus work/lwork/iwork/liwork. she's long, she's extra, she's booked and busy 💅.


LAPACKE_dstein

lapack_int LAPACKE_dstein (int matrix_layout, lapack_int n, const double *
    d, const double * e, lapack_int m, const double * w, const lapack_int *
    iblock, const lapack_int * isplit, double * z, lapack_int ldz,
    lapack_int * ifailv)

Definition at line 36 of file lapacke_dstein.c.

look at all those const pointers — she's a reader, not a writer, for d, e, w, iblock and isplit 🎀 everything else is fair game. ends on ifailv, cutie.


LAPACKE_dstein_work

lapack_int LAPACKE_dstein_work (int matrix_layout, lapack_int n, const
    double * d, const double * e, lapack_int m, const double * w, const
    lapack_int * iblock, const lapack_int * isplit, double * z, lapack_int
    ldz, double * work, lapack_int * iwork, lapack_int * ifailv)

Definition at line 36 of file lapacke_dstein_work.c.

work and iwork slid in before ifailv — no lwork, no liwork here, that's just the vibe she's on ✨.


LAPACKE_dstemr

lapack_int LAPACKE_dstemr (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, lapack_int * m, double * w, double * z, lapack_int
    ldz, lapack_int nzc, lapack_int * isuppz, lapack_logical * tryrac)

Definition at line 36 of file lapacke_dstemr.c.

hello?? tryrac?? a lapack_logical * just hanging out at the end 💀 she's got opinions and I'm obsessed. also note there's no abstol in this one — do not come for me, that's literally the signature.


LAPACKE_dstemr_work

lapack_int LAPACKE_dstemr_work (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, lapack_int * m, double * w, double * z, lapack_int
    ldz, lapack_int nzc, lapack_int * isuppz, lapack_logical * tryrac,
    double * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dstemr_work.c.

tryrac plus four scratch args. that's a full roster, bestie 🫶.


LAPACKE_dsteqr

lapack_int LAPACKE_dsteqr (int matrix_layout, char compz, lapack_int n,
    double * d, double * e, double * z, lapack_int ldz)

Definition at line 36 of file lapacke_dsteqr.c.

short, sweet, compz-flavoured 🍓 seven args and she's out.


LAPACKE_dsteqr_work

lapack_int LAPACKE_dsteqr_work (int matrix_layout, char compz, lapack_int n,
    double * d, double * e, double * z, lapack_int ldz, double * work)

Definition at line 36 of file lapacke_dsteqr_work.c.

literally just one work pointer bolted on. no lwork, no iwork. minimal queen ✨.


LAPACKE_dsterf

lapack_int LAPACKE_dsterf (lapack_int n, double * d, double * e)

Definition at line 36 of file lapacke_dsterf.c.

THREE ARGS. no matrix_layout, no jobz, no nothing. just n, d, e. she said "keep it simple" and honestly? she ate 💅.


LAPACKE_dsterf_work

lapack_int LAPACKE_dsterf_work (lapack_int n, double * d, double * e)

Definition at line 36 of file lapacke_dsterf_work.c.

bestie. the _work version has the exact same signature. not a single extra arg. n, d, e, done. and that's on periodt 😭👑


LAPACKE_dstev

lapack_int LAPACKE_dstev (int matrix_layout, char jobz, lapack_int n, double
    * d, double * e, double * z, lapack_int ldz)

Definition at line 36 of file lapacke_dstev.c.

classic matrix_layout + jobz opener, then n, d, e, z, ldz. the usual suspects 🌸.


LAPACKE_dstev_work

lapack_int LAPACKE_dstev_work (int matrix_layout, char jobz, lapack_int n,
    double * d, double * e, double * z, lapack_int ldz, double * work)

Definition at line 36 of file lapacke_dstev_work.c.

one singular work at the end. she packed light 🎀.


LAPACKE_dstevd

lapack_int LAPACKE_dstevd (int matrix_layout, char jobz, lapack_int n,
    double * d, double * e, double * z, lapack_int ldz)

Definition at line 36 of file lapacke_dstevd.c.

okay so this is character-for-character the same signature as LAPACKE_dstev — different file, different function, same fit 💖.


LAPACKE_dstevd_work

lapack_int LAPACKE_dstevd_work (int matrix_layout, char jobz, lapack_int n,
    double * d, double * e, double * z, lapack_int ldz, double * work,
    lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dstevd_work.c.

and here's where they diverge — dstevd_work brought work, lwork, iwork, liwork. she's the overachiever sister, no cap 🔥.


LAPACKE_dstevr

lapack_int LAPACKE_dstevr (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, double abstol, lapack_int * m, double * w, double *
    z, lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_dstevr.c.

jobz and range, vl/vu, il/iu, abstol, then m, w, z, ldz, isuppz. she's giving full-service 🌈.


LAPACKE_dstevr_work

lapack_int LAPACKE_dstevr_work (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, double abstol, lapack_int * m, double * w, double *
    z, lapack_int ldz, lapack_int * isuppz, double * work, lapack_int lwork,
    lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dstevr_work.c.

all of the above plus the four scratch args. chef's kiss 💋.


LAPACKE_dstevx

lapack_int LAPACKE_dstevx (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, double abstol, lapack_int * m, double * w, double *
    z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_dstevx.c.

twinning with dstevr except the last arg is ifail instead of isuppz. small difference, big personality 💅.


LAPACKE_dstevx_work

lapack_int LAPACKE_dstevx_work (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, double abstol, lapack_int * m, double * w, double *
    z, lapack_int ldz, double * work, lapack_int * iwork, lapack_int *
    ifail)

Definition at line 36 of file lapacke_dstevx_work.c.

careful bestie 👀 the ifail got pushed to the very end after work and iwork — order matters, don't get cute with it.


LAPACKE_dsycon

lapack_int LAPACKE_dsycon (int matrix_layout, char uplo, lapack_int n, const
    double * a, lapack_int lda, const lapack_int * ipiv, double anorm,
    double * rcond)

Definition at line 36 of file lapacke_dsycon.c.

uplo instead of jobz, ipiv in the middle, anorm and rcond closing it out. note a and ipiv are const — she reads, she doesn't rewrite 🎀.


LAPACKE_dsycon_3

lapack_int LAPACKE_dsycon_3 (int matrix_layout, char uplo, lapack_int n,
    const double * a, lapack_int lda, const double * e, const lapack_int *
    ipiv, double anorm, double * rcond)

Definition at line 36 of file lapacke_dsycon_3.c.

the _3 variant snuck a const double * e in right after lda. that's the whole difference and she owns it ✨.


LAPACKE_dsycon_3_work

lapack_int LAPACKE_dsycon_3_work (int matrix_layout, char uplo, lapack_int
    n, const double * a, lapack_int lda, const double * e, const lapack_int
    * ipiv, double anorm, double * rcond, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dsycon_3_work.c.

same as _3 with work and iwork tagged on — and nope, no lwork/liwork in sight 🦋.


LAPACKE_dsycon_work

lapack_int LAPACKE_dsycon_work (int matrix_layout, char uplo, lapack_int n,
    const double * a, lapack_int lda, const lapack_int * ipiv, double anorm,
    double * rcond, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dsycon_work.c.

original flavour + work + iwork. that's it, that's the whole upgrade 💜.


LAPACKE_dsyconv

lapack_int LAPACKE_dsyconv (int matrix_layout, char uplo, char way,
    lapack_int n, double * a, lapack_int lda, const lapack_int * ipiv,
    double * e)

Definition at line 36 of file lapacke_dsyconv.c.

char way — the most Gen Z parameter name in the whole header and I will not be taking questions 💀 her name is way and she has a range.


LAPACKE_dsyconv_work

lapack_int LAPACKE_dsyconv_work (int matrix_layout, char uplo, char way,
    lapack_int n, double * a, lapack_int lda, const lapack_int * ipiv,
    double * e)

Definition at line 36 of file lapacke_dsyconv_work.c.

and the _work version is byte-for-byte the same signature as the non-_work one. she's got nothing to declare 🙈.


LAPACKE_dsyequb

lapack_int LAPACKE_dsyequb (int matrix_layout, char uplo, lapack_int n,
    const double * a, lapack_int lda, double * s, double * scond, double *
    amax)

Definition at line 36 of file lapacke_dsyequb.c.

three output scalars in a trench coat: s, scond, amax 😭 she said "you're getting all three, don't ask".


LAPACKE_dsyequb_work

lapack_int LAPACKE_dsyequb_work (int matrix_layout, char uplo, lapack_int n,
    const double * a, lapack_int lda, double * s, double * scond, double *
    amax, double * work)

Definition at line 36 of file lapacke_dsyequb_work.c.

same trio, plus a single work pointer sitting at the end like a little bow 🎀.


LAPACKE_dsyev

lapack_int LAPACKE_dsyev (int matrix_layout, char jobz, char uplo,
    lapack_int n, double * a, lapack_int lda, double * w)

Definition at line 36 of file lapacke_dsyev.c.

the iconic combo: matrix_layout, jobz, uplo, n, a, lda, w. seven args, zero notes, main character energy ✨.


LAPACKE_dsyev_2stage

lapack_int LAPACKE_dsyev_2stage (int matrix_layout, char jobz, char uplo,
    lapack_int n, double * a, lapack_int lda, double * w)

Definition at line 36 of file lapacke_dsyev_2stage.c.

identical signature to LAPACKE_dsyev — the 2stage is in the name, bestie, not the arg list 💅.


LAPACKE_dsyev_2stage_work

lapack_int LAPACKE_dsyev_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, double * a, lapack_int lda, double * w, double *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_dsyev_2stage_work.c.

now she's got work and lwork but not iwork/liwork — remember that, the d-variants are the ones that go full integer 😌.


LAPACKE_dsyev_work

lapack_int LAPACKE_dsyev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, double * a, lapack_int lda, double * w, double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_dsyev_work.c.

work + lwork, that's the whole glow-up 🌸.


LAPACKE_dsyevd

lapack_int LAPACKE_dsyevd (int matrix_layout, char jobz, char uplo,
    lapack_int n, double * a, lapack_int lda, double * w)

Definition at line 36 of file lapacke_dsyevd.c.

again, same seven-arg shape as dsyev and dsyev_2stage. the whole family shares a wardrobe 💖.


LAPACKE_dsyevd_2stage

lapack_int LAPACKE_dsyevd_2stage (int matrix_layout, char jobz, char uplo,
    lapack_int n, double * a, lapack_int lda, double * w)

Definition at line 36 of file lapacke_dsyevd_2stage.c.

yep — same seven. consistent queen 👑.


LAPACKE_dsyevd_2stage_work

lapack_int LAPACKE_dsyevd_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, double * a, lapack_int lda, double * w, double *
    work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dsyevd_2stage_work.c.

THERE they are — work, lwork, iwork, liwork. the d family always shows up with the full set 🔥.


LAPACKE_dsyevd_work

lapack_int LAPACKE_dsyevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, double * a, lapack_int lda, double * w, double * work,
    lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dsyevd_work.c.

same four scratch args, no shortcuts. she's thorough and she's not sorry 🫶.


LAPACKE_dsyevr

lapack_int LAPACKE_dsyevr (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, double * a, lapack_int lda, double vl, double vu,
    lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w,
    double * z, lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_dsyevr.c.

okay so dsyevr is that girl — jobz, range, uplo all up front, then the vl/vu/il/iu/abstol block, then m, w, z, ldz, isuppz. seventeen args and she's still standing 💅✨.


LAPACKE_dsyevr_2stage

lapack_int LAPACKE_dsyevr_2stage (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, double * a, lapack_int lda, double vl, double
    vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double
    * w, double * z, lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_dsyevr_2stage.c.

identical to LAPACKE_dsyevr — again, 2stage lives in the name only 🌈.


LAPACKE_dsyevr_2stage_work

lapack_int LAPACKE_dsyevr_2stage_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, double * a, lapack_int lda, double vl,
    double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m,
    double * w, double * z, lapack_int ldz, lapack_int * isuppz, double *
    work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dsyevr_2stage_work.c.

and she packed everything: isuppz then work, lwork, iwork, liwork. no notes, full marks 🎀.


LAPACKE_dsyevr_work

lapack_int LAPACKE_dsyevr_work (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, double * a, lapack_int lda, double vl, double
    vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double
    * w, double * z, lapack_int ldz, lapack_int * isuppz, double * work,
    lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dsyevr_work.c.

same as LAPACKE_dsyevr with the four scratch args on the tail end. twenty-one arguments. TWENTY-ONE. she's the moment, she's the hype, she's the whole group chat 😭💜.

still deep in the d-department, bestie — the double-precision tour continues 💜

LAPACKE_dsyevx

lapack_int LAPACKE_dsyevx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, double * z, lapack_int ldz, lapack_int * ifail)

the full-glow-up version with every knob out: jobz, range, uplo, vl/vu, il/iu, abstol, and it even hands you back m, w, z and ifail so nothing's a mystery ✨

Definition at line 36 of file lapacke_dsyevx.c.

LAPACKE_dsyevx_2stage

lapack_int LAPACKE_dsyevx_2stage (int matrix_layout, char jobz, char range, char uplo, lapack_int n, double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, double * z, lapack_int ldz, lapack_int * ifail)

same exact roster of arguments as LAPACKE_dsyevx, but the _2stage variant — two stages, twice the drama, zero extra params 🎀

Definition at line 36 of file lapacke_dsyevx_2stage.c.

LAPACKE_dsyevx_2stage_work

lapack_int LAPACKE_dsyevx_2stage_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, double * z, lapack_int ldz, double * work, lapack_int lwork, lapack_int * iwork, lapack_int * ifail)

the _work one, so you're bringing your own work + lwork and iwork — main character energy, you handle your own workspace 💅

Definition at line 36 of file lapacke_dsyevx_2stage_work.c.

LAPACKE_dsyevx_work

lapack_int LAPACKE_dsyevx_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, double * z, lapack_int ldz, double * work, lapack_int lwork, lapack_int * iwork, lapack_int * ifail)

classic _work edition of LAPACKE_dsyevx — everything from the plain version plus work, lwork and iwork 🫶

Definition at line 36 of file lapacke_dsyevx_work.c.


LAPACKE_dsygst

lapack_int LAPACKE_dsygst (int matrix_layout, lapack_int itype, char uplo, lapack_int n, double * a, lapack_int lda, const double * b, lapack_int ldb)

short, sweet, and it's the one where b is const — hands off the b, bestie 🙈 itype sets the whole situation.

Definition at line 36 of file lapacke_dsygst.c.

LAPACKE_dsygst_work

lapack_int LAPACKE_dsygst_work (int matrix_layout, lapack_int itype, char uplo, lapack_int n, double * a, lapack_int lda, const double * b, lapack_int ldb)

okay so this one has the exact same parameter list as LAPACKE_dsygst — no extra work, no lwork, nothing. it's giving "same outfit, different file" 💀

Definition at line 36 of file lapacke_dsygst_work.c.


LAPACKE_dsygv

lapack_int LAPACKE_dsygv (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb, double * w)

two matrices (a and b), a jobz, an uplo, and out comes w — the little generalised baddie 🌸

Definition at line 36 of file lapacke_dsygv.c.

LAPACKE_dsygv_2stage

lapack_int LAPACKE_dsygv_2stage (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb, double * w)

identical argument list to LAPACKE_dsygv, _2stage flavoured — the aesthetic upgrade, no new args 🔥

Definition at line 36 of file lapacke_dsygv_2stage.c.

LAPACKE_dsygv_2stage_work

lapack_int LAPACKE_dsygv_2stage_work (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb, double * w, double * work, lapack_int lwork)

_2stage + _work = you're supplying work and lwork yourself, and honestly? self-sufficient queen ✨

Definition at line 36 of file lapacke_dsygv_2stage_work.c.

LAPACKE_dsygv_work

lapack_int LAPACKE_dsygv_work (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb, double * w, double * work, lapack_int lwork)

LAPACKE_dsygv plus work + lwork at the end, like an accessory that actually does something 🎀

Definition at line 36 of file lapacke_dsygv_work.c.


LAPACKE_dsygvd

lapack_int LAPACKE_dsygvd (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb, double * w)

the d on the end is doing heavy lifting — note that this one's argument list matches LAPACKE_dsygv exactly 👑

Definition at line 36 of file lapacke_dsygvd.c.

LAPACKE_dsygvd_work

lapack_int LAPACKE_dsygvd_work (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb, double * w, double * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

oh she's thorough — work, lwork, and iwork with a matching liwork. two workspaces, because one is never enough 😭

Definition at line 36 of file lapacke_dsygvd_work.c.


LAPACKE_dsygvx

lapack_int LAPACKE_dsygvx (int matrix_layout, lapack_int itype, char jobz, char range, char uplo, lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, double * z, lapack_int ldz, lapack_int * ifail)

the maximalist of the dsygv family — range, vl, vu, il, iu, abstol, m, w, z, ldz, ifail, the whole entire friend group 💖

Definition at line 36 of file lapacke_dsygvx.c.

LAPACKE_dsygvx_work

lapack_int LAPACKE_dsygvx_work (int matrix_layout, lapack_int itype, char jobz, char range, char uplo, lapack_int n, double * a, lapack_int lda, double * b, lapack_int ldb, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, double * z, lapack_int ldz, double * work, lapack_int lwork, lapack_int * iwork, lapack_int * ifail)

everything LAPACKE_dsygvx has, plus work, lwork, iwork. it's a lot but she carries it gracefully 🦋

Definition at line 36 of file lapacke_dsygvx_work.c.


LAPACKE_dsyrfs

lapack_int LAPACKE_dsyrfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, const double * af, lapack_int ldaf, const lapack_int * ipiv, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * ferr, double * berr)

the refine-your-answer one — note the const squad: a, af, ipiv, b are all read-only sweeties, while x, ferr, berr are the ones that get written 🧚

Definition at line 36 of file lapacke_dsyrfs.c.

LAPACKE_dsyrfs_work

lapack_int LAPACKE_dsyrfs_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, const double * af, lapack_int ldaf, const lapack_int * ipiv, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * ferr, double * berr, double * work, lapack_int * iwork)

same as LAPACKE_dsyrfs but you also pass work and iwork (no lwork — don't come for me, that's literally what's written) 💀

Definition at line 36 of file lapacke_dsyrfs_work.c.


LAPACKE_dsyrfsx

lapack_int LAPACKE_dsyrfsx (int matrix_layout, char uplo, char equed, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, const double * af, lapack_int ldaf, const lapack_int * ipiv, const double * s, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params)

the x-tra edition 🙈 extra equed, extra s, and the whole error-bound situation: rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. she wants all the receipts.

Definition at line 36 of file lapacke_dsyrfsx.c.

LAPACKE_dsyrfsx_work

lapack_int LAPACKE_dsyrfsx_work (int matrix_layout, char uplo, char equed, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, const double * af, lapack_int ldaf, const lapack_int * ipiv, const double * s, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params, double * work, lapack_int * iwork)

literally LAPACKE_dsyrfsx with work and iwork tacked on the end, no lwork in sight, and that's just the way it is bestie 🎀

Definition at line 36 of file lapacke_dsyrfsx_work.c.


LAPACKE_dsysv

lapack_int LAPACKE_dsysv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, lapack_int * ipiv, double * b, lapack_int ldb)

clean, compact, ipiv in the middle — the no-frills dsysv original 🌈

Definition at line 36 of file lapacke_dsysv.c.

LAPACKE_dsysv_aa

lapack_int LAPACKE_dsysv_aa (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, lapack_int * ipiv, double * b, lapack_int ldb)

_aa on the name, but look — the parameters are character-for-character the same as LAPACKE_dsysv. the _aa is a personality trait, not a new argument 😌

Definition at line 36 of file lapacke_dsysv_aa.c.

LAPACKE_dsysv_aa_2stage

lapack_int LAPACKE_dsysv_aa_2stage (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, double * b, lapack_int ldb)

okay THIS one switches it up: tb + ltb and two pivot arrays, ipiv and ipiv2. double the pivots, double the fun 👑

Definition at line 36 of file lapacke_dsysv_aa_2stage.c.

LAPACKE_dsysv_aa_2stage_work

lapack_int LAPACKE_dsysv_aa_2stage_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, double * b, lapack_int ldb, double * work, lapack_int lwork)

the _work sibling of LAPACKE_dsysv_aa_2stage — keeps tb, ltb, ipiv, ipiv2, and adds work + lwork 🫶

Definition at line 36 of file lapacke_dsysv_aa_2stage_work.c.

LAPACKE_dsysv_aa_work

lapack_int LAPACKE_dsysv_aa_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, lapack_int * ipiv, double * b, lapack_int ldb, double * work, lapack_int lwork)

LAPACKE_dsysv_aa with work + lwork appended. simple math, iconic result ✨

Definition at line 36 of file lapacke_dsysv_aa_work.c.

LAPACKE_dsysv_rk

lapack_int LAPACKE_dsysv_rk (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * e, lapack_int * ipiv, double * b, lapack_int ldb)

this one brought e to the party — one extra double pointer, sitting right between lda and ipiv 🍓

Definition at line 36 of file lapacke_dsysv_rk.c.

LAPACKE_dsysv_rk_work

lapack_int LAPACKE_dsysv_rk_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * e, lapack_int * ipiv, double * b, lapack_int ldb, double * work, lapack_int lwork)

LAPACKE_dsysv_rk + work + lwork. the e stays, obviously, she's not going anywhere 💅

Definition at line 36 of file lapacke_dsysv_rk_work.c.

LAPACKE_dsysv_rook

lapack_int LAPACKE_dsysv_rook (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, lapack_int * ipiv, double * b, lapack_int ldb)

_rook, and yep — same arguments as plain LAPACKE_dsysv, down to the letter. the name is the whole plot twist 🔥

Definition at line 36 of file lapacke_dsysv_rook.c.

LAPACKE_dsysv_rook_work

lapack_int LAPACKE_dsysv_rook_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, lapack_int * ipiv, double * b, lapack_int ldb, double * work, lapack_int lwork)

the _rook with work + lwork bolted on the end, ready to go 🎀

Definition at line 36 of file lapacke_dsysv_rook_work.c.

LAPACKE_dsysv_work

lapack_int LAPACKE_dsysv_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, lapack_int * ipiv, double * b, lapack_int ldb, double * work, lapack_int lwork)

the plain one, but with feelings (the feelings are work and lwork) 💖

Definition at line 36 of file lapacke_dsysv_work.c.


LAPACKE_dsysvx

lapack_int LAPACKE_dsysvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, double * af, lapack_int ldaf, lapack_int * ipiv, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * ferr, double * berr)

note the fact flag up front and the fact that af and ipiv are not const (they're the pre-paid output slots), while a and b are locked down 🔒

Definition at line 36 of file lapacke_dsysvx.c.

LAPACKE_dsysvx_work

lapack_int LAPACKE_dsysvx_work (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, double * af, lapack_int ldaf, lapack_int * ipiv, const double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * ferr, double * berr, double * work, lapack_int lwork, lapack_int * iwork)

LAPACKE_dsysvx plus work, lwork, iwork. the full stack, no crumbs left behind 😭

Definition at line 36 of file lapacke_dsysvx_work.c.


LAPACKE_dsysvxx

lapack_int LAPACKE_dsysvxx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * af, lapack_int ldaf, lapack_int * ipiv, char * equed, double * s, double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * rpvgrw, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params)

the double-x icon 👑 she's got equed, s, rpvgrw, and the entire error-bound entourage. also heads up: a, af, ipiv, b are all non-const here, so nothing's protected. chaotic, love her.

Definition at line 36 of file lapacke_dsysvxx.c.

LAPACKE_dsysvxx_work

lapack_int LAPACKE_dsysvxx_work (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * af, lapack_int ldaf, lapack_int * ipiv, char * equed, double * s, double * b, lapack_int ldb, double * x, lapack_int ldx, double * rcond, double * rpvgrw, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params, double * work, lapack_int * iwork)

same as LAPACKE_dsysvxx plus work and iwork. still no lwork — yes I checked twice 💀

Definition at line 36 of file lapacke_dsysvxx_work.c.


LAPACKE_dsyswapr

lapack_int LAPACKE_dsyswapr (int matrix_layout, char uplo, lapack_int n, double * a, lapack_int lda, lapack_int i1, lapack_int i2)

short one! i1 and i2, two ints, right at the end. no ldz, no work, just vibes 🌸

Definition at line 36 of file lapacke_dsyswapr.c.

LAPACKE_dsyswapr_work

lapack_int LAPACKE_dsyswapr_work (int matrix_layout, char uplo, lapack_int n, double * a, lapack_int lda, lapack_int i1, lapack_int i2)

identical signature to LAPACKE_dsyswapr, _work in the filename only. they're twins, fr fr 🦋

Definition at line 36 of file lapacke_dsyswapr_work.c.


LAPACKE_dsytrd

lapack_int LAPACKE_dsytrd (int matrix_layout, char uplo, lapack_int n, double * a, lapack_int lda, double * d, double * e, double * tau)

d, e, tau — three little doubles out the door, no workspace required 🧚

Definition at line 36 of file lapacke_dsytrd.c.

LAPACKE_dsytrd_work

lapack_int LAPACKE_dsytrd_work (int matrix_layout, char uplo, lapack_int n, double * a, lapack_int lda, double * d, double * e, double * tau, double * work, lapack_int lwork)

the same trio (d, e, tau) but now you're paying rent in work and lwork — worth it 💜

Definition at line 36 of file lapacke_dsytrd_work.c.

LAPACKE_dsytrf

lapack_int LAPACKE_dsytrf (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_dsytrf.c.

The og. no _work, no suffix, just vibes and six args. matrix_layout, uplo, n, then a, lda and ipiv — and yes ipiv is a pointer to lapack_int, she's writing back to you 💅


LAPACKE_dsytrf_aa

lapack_int LAPACKE_dsytrf_aa (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_dsytrf_aa.c.

Same shape as her big sister, different file — lapacke_dsytrf_aa.c bestie, don't mix them up 🎀 the _aa suffix is the whole personality here.

LAPACKE_dsytrf_aa_2stage

lapack_int LAPACKE_dsytrf_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, double * a, lapack_int lda, double * tb, lapack_int ltb,
    lapack_int * ipiv, lapack_int * ipiv2)

Definition at line 36 of file lapacke_dsytrf_aa_2stage.c.

Two stages, two pivot arrays — ipiv and ipiv2, like she's double-booked 😭 plus the new besties tb and ltb show up. Definition at line 36 of lapacke_dsytrf_aa_2stage.c, iconic of her.

LAPACKE_dsytrf_aa_2stage_work

lapack_int LAPACKE_dsytrf_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, double * a, lapack_int lda, double * tb, lapack_int ltb,
    lapack_int * ipiv, lapack_int * ipiv2, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dsytrf_aa_2stage_work.c.

This is the _work girlie of the 2stage situation, which means she brought her own workspace: work and lwork, both handed straight to you 🫶 count the args, there's a lot, drink some water first.

LAPACKE_dsytrf_aa_work

lapack_int LAPACKE_dsytrf_aa_work (int matrix_layout, char uplo, lapack_int
    n, double * a, lapack_int lda, lapack_int * ipiv, double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_dsytrf_aa_work.c.

_aa plus _work equals a workspace you pass in yourself — work and lwork appended to the end, periodt. File: lapacke_dsytrf_aa_work.c ✨

LAPACKE_dsytrf_rk

lapack_int LAPACKE_dsytrf_rk (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, double * e, lapack_int * ipiv)

Definition at line 36 of file lapacke_dsytrf_rk.c.

_rk era 💖 and she's got a lil extra: e, a double *, sitting right there between lda and ipiv. Lowkey the roster changed, bestie.

LAPACKE_dsytrf_rk_work

lapack_int LAPACKE_dsytrf_rk_work (int matrix_layout, char uplo, lapack_int
    n, double * a, lapack_int lda, double * e, lapack_int * ipiv, double *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_dsytrf_rk_work.c.

Same _rk cast — matrix_layout, uplo, n, a, lda, e, ipiv — then work and lwork crash the party 🎀 defined at line 36 of lapacke_dsytrf_rk_work.c.

LAPACKE_dsytrf_rook

lapack_int LAPACKE_dsytrf_rook (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_dsytrf_rook.c.

No e here, no tb, no work — just the classic six. _rook is the whole lewk and the file is lapacke_dsytrf_rook.c 💅

LAPACKE_dsytrf_rook_work

lapack_int LAPACKE_dsytrf_rook_work (int matrix_layout, char uplo,
    lapack_int n, double * a, lapack_int lda, lapack_int * ipiv, double *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_dsytrf_rook_work.c.

_rook with her _work bestie along for the ride: work is a double *, lwork is a lapack_int, and they go last. obviously 🦋

LAPACKE_dsytrf_work

lapack_int LAPACKE_dsytrf_work (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, lapack_int * ipiv, double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_dsytrf_work.c.

The plain _work version, no suffixes, no drama, just work + lwork tacked on the end of the og arg list. Definition at line 36 of lapacke_dsytrf_work.c — she's consistent, I respect it ✨


LAPACKE_dsytri

lapack_int LAPACKE_dsytri (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, const lapack_int * ipiv)

Definition at line 36 of file lapacke_dsytri.c.

New family, same energy 🧚 note that ipiv is now const — she's only reading it, not touching, love that boundary setting for her.

LAPACKE_dsytri2

lapack_int LAPACKE_dsytri2 (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, const lapack_int * ipiv)

Definition at line 36 of file lapacke_dsytri2.c.

A 2 on the end, bestie, that's the plot twist. Args are identical to LAPACKE_dsytri char for char, but the file says lapacke_dsytri2.c so she's not the same girlie 😭

LAPACKE_dsytri2_work

lapack_int LAPACKE_dsytri2_work (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, const lapack_int * ipiv, double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_dsytri2_work.c.

_2_work — the sequel to the sequel 🌈 const lapack_int * ipiv stays const, and work / lwork join at the end. Definition at line 36 of lapacke_dsytri2_work.c.

LAPACKE_dsytri2x

lapack_int LAPACKE_dsytri2x (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, const lapack_int * ipiv, lapack_int nb)

Definition at line 36 of file lapacke_dsytri2x.c.

The x is silent but the nb is not 🎀 she takes a lapack_int nb as her final arg, and no work/lwork at all. different breed, honestly.

LAPACKE_dsytri2x_work

lapack_int LAPACKE_dsytri2x_work (int matrix_layout, char uplo, lapack_int
    n, double * a, lapack_int lda, const lapack_int * ipiv, double * work,
    lapack_int nb)

Definition at line 36 of file lapacke_dsytri2x_work.c.

And here's the gag: _work edition adds double * work but keeps nb right at the end, still a lapack_int. Not lwork. nb. Read it twice 🫶 file is lapacke_dsytri2x_work.c.

LAPACKE_dsytri_3

lapack_int LAPACKE_dsytri_3 (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, const double * e, const lapack_int * ipiv)

Definition at line 36 of file lapacke_dsytri_3.c.

_3 girlie pops in with a const double * e before the const lapack_int * ipiv — two consts in one signature, she's very "I know my boundaries" 💜

LAPACKE_dsytri_3_work

lapack_int LAPACKE_dsytri_3_work (int matrix_layout, char uplo, lapack_int
    n, double * a, lapack_int lda, const double * e, const lapack_int *
    ipiv, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dsytri_3_work.c.

_3_work = matrix_layout, uplo, n, a, lda, const double * e, const lapack_int * ipiv, then work and lwork. nine args, she's thorough, we stan 🌸

LAPACKE_dsytri_work

lapack_int LAPACKE_dsytri_work (int matrix_layout, char uplo, lapack_int n,
    double * a, lapack_int lda, const lapack_int * ipiv, double * work)

Definition at line 36 of file lapacke_dsytri_work.c.

okay bestie look at this one closely 👀 she has a double * work but there is NO lwork anywhere. That is not a typo, that's literally the signature. Definition at line 36 of lapacke_dsytri_work.c.


LAPACKE_dsytrs

lapack_int LAPACKE_dsytrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, const lapack_int *
    ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dsytrs.c.

_trs era begins and she's an s, so b and ldb enter the chat 💅 note a is const double * and ipiv is const lapack_int * — she reads, she does not write, she respects the source material.

LAPACKE_dsytrs2

lapack_int LAPACKE_dsytrs2 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, const lapack_int *
    ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dsytrs2.c.

the 2 is back and she brought the exact same arg list 🎀 identical to LAPACKE_dsytrs, but the file is lapacke_dsytrs2.c and that's the whole difference you can see from here. no cap.

LAPACKE_dsytrs2_work

lapack_int LAPACKE_dsytrs2_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, const lapack_int *
    ipiv, double * b, lapack_int ldb, double * work)

Definition at line 36 of file lapacke_dsytrs2_work.c.

_work version — and once again she adds double * work with no matching lwork. it's giving "I brought a snack but no bag". line 36, lapacke_dsytrs2_work.c 💀

LAPACKE_dsytrs_3

lapack_int LAPACKE_dsytrs_3 (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, const double * e,
    const lapack_int * ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dsytrs_3.c.

_3 shows up with const double * e squeezed between lda and ipiv. ten args total, she's highkey the main character of this little cluster 👑

LAPACKE_dsytrs_3_work

lapack_int LAPACKE_dsytrs_3_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const double * a, lapack_int lda, const double * e,
    const lapack_int * ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dsytrs_3_work.c.

okay so she's called _work but her arg list is exactly LAPACKE_dsytrs_3's — no work, no lwork, nothing extra. that's just how it is, bestie, I don't make the rules 😭 file: lapacke_dsytrs_3_work.c.

LAPACKE_dsytrs_aa

lapack_int LAPACKE_dsytrs_aa (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, const lapack_int *
    ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dsytrs_aa.c.

_aa on the _trs side, and the signature is the plain nine again — matrix_layout, uplo, n, nrhs, a, lda, ipiv, b, ldb. consistent queen 🌈

LAPACKE_dsytrs_aa_2stage

lapack_int LAPACKE_dsytrs_aa_2stage (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * tb,
    lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, double * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_dsytrs_aa_2stage.c.

FULL CAST, no consts in sight on a, tb, ipiv or ipiv2 🙈 both pivot arrays, both tb and ltb, plus b and ldb at the end. twelve args, she's extra in the best way. line 36 of lapacke_dsytrs_aa_2stage.c.

LAPACKE_dsytrs_aa_2stage_work

lapack_int LAPACKE_dsytrs_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, double * a, lapack_int lda, double * tb,
    lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, double * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_dsytrs_aa_2stage_work.c.

and the _work version is character-for-character the same as LAPACKE_dsytrs_aa_2stage — no workspace params at all. just the name changing. it's giving "same outfit, different caption" ✨ lapacke_dsytrs_aa_2stage_work.c.

LAPACKE_dsytrs_aa_work

lapack_int LAPACKE_dsytrs_aa_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, const double * a, lapack_int lda, const lapack_int *
    ipiv, double * b, lapack_int ldb, double * work, lapack_int lwork)

Definition at line 36 of file lapacke_dsytrs_aa_work.c.

here _work does bring the goods — double * work AND lapack_int lwork 🫶 consts back on a and ipiv. balance restored.

LAPACKE_dsytrs_rook

lapack_int LAPACKE_dsytrs_rook (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, const lapack_int *
    ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dsytrs_rook.c.

_rook crossover episode 🔥 same nine args, same const placement, different file: lapacke_dsytrs_rook.c. she's the rook girlie of the _trs world.

LAPACKE_dsytrs_rook_work

lapack_int LAPACKE_dsytrs_rook_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, const double * a, lapack_int lda, const
    lapack_int * ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dsytrs_rook_work.c.

again — _work in the name, no work in the args 🤡 she said "I'm working, I'm just not showing you my workspace". lapacke_dsytrs_rook_work.c, line 36.

LAPACKE_dsytrs_work

lapack_int LAPACKE_dsytrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * a, lapack_int lda, const lapack_int *
    ipiv, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dsytrs_work.c.

plain _work, plain nine args, no extra params. that's her whole thing and honestly? slay 💅


LAPACKE_dtbcon

lapack_int LAPACKE_dtbcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, lapack_int kd, const double * ab, lapack_int ldab,
    double * rcond)

Definition at line 36 of file lapacke_dtbcon.c.

NEW LETTER BLOCK, we're in the dtb era now 🦋 and look at all these chars: norm, uplo, diag — three whole character args before you even get to n. then kd, const double * ab, ldab, and double * rcond to finish. nine args, all accounted for.

LAPACKE_dtbcon_work

lapack_int LAPACKE_dtbcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, lapack_int kd, const double * ab, lapack_int
    ldab, double * rcond, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dtbcon_work.c.

her _work twin adds TWO arrays: double * work and lapack_int * iwork — note that iwork is an integer workspace and there's no lwork/liwork here 🎀 just vibes and pointers, line 36 of lapacke_dtbcon_work.c.

LAPACKE_dtbrfs

lapack_int LAPACKE_dtbrfs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int kd, lapack_int nrhs, const double * ab,
    lapack_int ldab, const double * b, lapack_int ldb, const double * x,
    lapack_int ldx, double * ferr, double * berr)

Definition at line 36 of file lapacke_dtbrfs.c.

FOURTEEN ARGS 😭 she went off. uplo, trans, diag on char duty, then n, kd, nrhs, ab, ldab, b, ldb, x, ldx, and the twin output girlies ferr and berr both double *. count them twice, bestie.

LAPACKE_dtbrfs_work

lapack_int LAPACKE_dtbrfs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const double *
    ab, lapack_int ldab, const double * b, lapack_int ldb, const double * x,
    lapack_int ldx, double * ferr, double * berr, double * work, lapack_int
    * iwork)

Definition at line 36 of file lapacke_dtbrfs_work.c.

fourteen becomes sixteen with double * work and lapack_int * iwork appended. still no length params for them. she's mysterious like that 💜 lapacke_dtbrfs_work.c.

LAPACKE_dtbtrs

lapack_int LAPACKE_dtbtrs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int kd, lapack_int nrhs, const double * ab,
    lapack_int ldab, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dtbtrs.c.

_trs again but make it dtb 🌸 eleven args, b is the only non-const double * in the data section — she's the one getting written to, and honestly? good for her.

LAPACKE_dtbtrs_work

lapack_int LAPACKE_dtbtrs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const double *
    ab, lapack_int ldab, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dtbtrs_work.c.

and yes, _work again with zero work params. same eleven args as LAPACKE_dtbtrs. I'm starting to think these _work names are just a personality trait 😭


LAPACKE_dtfsm

lapack_int LAPACKE_dtfsm (int matrix_layout, char transr, char side, char
    uplo, char trans, char diag, lapack_int m, lapack_int n, double alpha,
    const double * a, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dtfsm.c.

FIVE CHAR ARGS. transr, side, uplo, trans, diag — she said "let me give you every option at once" 💅 then m, n, a by-value double alpha, const double * a, double * b, and lapack_int ldb. twelve total, no notes.

LAPACKE_dtfsm_work

lapack_int LAPACKE_dtfsm_work (int matrix_layout, char transr, char side,
    char uplo, char trans, char diag, lapack_int m, lapack_int n, double
    alpha, const double * a, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dtfsm_work.c.

identical twin, literally same twelve args, alpha still passed by value 🎀 the _work thing continues to be a name-only situation. lapacke_dtfsm_work.c, line 36.

LAPACKE_dtftri

lapack_int LAPACKE_dtftri (int matrix_layout, char transr, char uplo, char
    diag, lapack_int n, double * a)

Definition at line 36 of file lapacke_dtftri.c.

finally a short one — six args 🧚 matrix_layout, transr, uplo, diag, n, and a single mutable double * a. after dtbrfs this feels like a spa day.

LAPACKE_dtftri_work

lapack_int LAPACKE_dtftri_work (int matrix_layout, char transr, char uplo,
    char diag, lapack_int n, double * a)

Definition at line 36 of file lapacke_dtftri_work.c.

same six, _work in the filename, no work arg. I've made my peace with it 🌈

LAPACKE_dtfttp

lapack_int LAPACKE_dtfttp (int matrix_layout, char transr, char uplo,
    lapack_int n, const double * arf, double * ap)

Definition at line 36 of file lapacke_dtfttp.c.

note the spelling bestie — that's arf and ap, _tfttp with the double t 😭 arf is const double *, ap is plain old double *. six args, two arrays.

LAPACKE_dtfttp_work

lapack_int LAPACKE_dtfttp_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const double * arf, double * ap)

Definition at line 36 of file lapacke_dtfttp_work.c.

yep. identical. _work in name only. arf const, ap not. line 36 of lapacke_dtfttp_work.c ✨

LAPACKE_dtfttr

lapack_int LAPACKE_dtfttr (int matrix_layout, char transr, char uplo,
    lapack_int n, const double * arf, double * a, lapack_int lda)

Definition at line 36 of file lapacke_dtfttr.c.

the tr ending means lda comes back into the picture 🫶 seven args: matrix_layout, transr, uplo, n, const double * arf, double * a, lapack_int lda.

LAPACKE_dtfttr_work

lapack_int LAPACKE_dtfttr_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const double * arf, double * a, lapack_int lda)

Definition at line 36 of file lapacke_dtfttr_work.c.

seven args again, _work in the filename only, and I'm just gonna assume she's doing her best 💀 lapacke_dtfttr_work.c.


LAPACKE_dtgevc

lapack_int LAPACKE_dtgevc (int matrix_layout, char side, char howmny, const
    lapack_logical * select, lapack_int n, const double * s, lapack_int lds,
    const double * p, lapack_int ldp, double * vl, lapack_int ldvl, double *
    vr, lapack_int ldvr, lapack_int mm, lapack_int * m)

Definition at line 36 of file lapacke_dtgevc.c.

okay this is the BIG one, FIFTEEN arguments 👑 and she's flexing a const lapack_logical * select right there in position four — a whole different type, not even double, not even a char. also howmny is spelled exactly like that, do not "fix" it. s/lds, p/ldp, vl/ldvl, vr/ldvr, then mm by value and lapack_int * m last. legendary.

LAPACKE_dtgevc_work

lapack_int LAPACKE_dtgevc_work (int matrix_layout, char side, char howmny,
    const lapack_logical * select, lapack_int n, const double * s,
    lapack_int lds, const double * p, lapack_int ldp, double * vl,
    lapack_int ldvl, double * vr, lapack_int ldvr, lapack_int mm, lapack_int
    * m, double * work)

Definition at line 36 of file lapacke_dtgevc_work.c.

sixteen args now — she tacked a double * work on the very end, and once more: no lwork 😭 select stays const lapack_logical *, m stays lapack_int *. perfection, no notes, line 36 of lapacke_dtgevc_work.c.

LAPACKE_dtgexc

lapack_int LAPACKE_dtgexc (int matrix_layout, lapack_logical wantq,
    lapack_logical wantz, lapack_int n, double * a, lapack_int lda, double *
    b, lapack_int ldb, double * q, lapack_int ldq, double * z, lapack_int
    ldz, lapack_int * ifst, lapack_int * ilst)

Definition at line 36 of file lapacke_dtgexc.c.

saving the loudest for last 🎀 FOURTEEN args, two lapack_logical flags (wantq, wantz) passed by value, then a/lda, b/ldb, q/ldq, z/ldz, and the finale: lapack_int * ifst and lapack_int * ilst. no const anywhere in the pointer list — she's writing to all of it. iconic. defined at line 36 of lapacke_dtgexc.c 💜

  • LAPACKE_dtgexc_work — bestie this is the _work twin of the one above it 🫶 same reorder-the-generalized-eigenvalues energy, except you bring the scratch space: there's a double * work and a lapack_int lwork at the end so you get to say exactly how big the workspace is. Main character of your own memory management, fr.
lapack_int LAPACKE_dtgexc_work (int matrix_layout, lapack_logical wantq,
    lapack_logical wantz, lapack_int n, double * a, lapack_int lda, double *
    b, lapack_int ldb, double * q, lapack_int ldq, double * z, lapack_int
    ldz, lapack_int * ifst, lapack_int * ilst, double * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_dtgexc_work.c.


  • LAPACKE_dtgsen — the reorder-and-decompose situation 👑 ijob tells it what you want computed, wantq and wantz say whether the q and z matrices are getting updated, and select is the logical array picking which eigenvalues go in the leading block. Comes back with m (how many got moved), pl, pr (the eigenvalue projections) and dif (the diffs). No workspace of your own — it handles that.
lapack_int LAPACKE_dtgsen (int matrix_layout, lapack_int ijob,
    lapack_logical wantq, lapack_logical wantz, const lapack_logical *
    select, lapack_int n, double * a, lapack_int lda, double * b, lapack_int
    ldb, double * alphar, double * alphai, double * beta, double * q,
    lapack_int ldq, double * z, lapack_int ldz, lapack_int * m, double * pl,
    double * pr, double * dif)

Definition at line 36 of file lapacke_dtgsen.c.

  • LAPACKE_dtgsen_work — same whole vibe as LAPACKE_dtgsen, but now you're also supplying work / lwork and iwork / liwork. Two workspaces, two sizes, zero excuses 💅
lapack_int LAPACKE_dtgsen_work (int matrix_layout, lapack_int ijob,
    lapack_logical wantq, lapack_logical wantz, const lapack_logical *
    select, lapack_int n, double * a, lapack_int lda, double * b, lapack_int
    ldb, double * alphar, double * alphai, double * beta, double * q,
    lapack_int ldq, double * z, lapack_int ldz, lapack_int * m, double * pl,
    double * pr, double * dif, double * work, lapack_int lwork, lapack_int *
    iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dtgsen_work.c.


  • LAPACKE_dtgsja — the generalized SVD situation ✨ jobu, jobv, jobq decide how much of u, v and q you actually want back, k and l are the sub-block bounds, and tola / tolb are your tolerances. Outputs alpha and beta (the generalized singular values live there) plus ncycle, the count of cycles it took. It ate and left no crumbs.
lapack_int LAPACKE_dtgsja (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k, lapack_int
    l, double * a, lapack_int lda, double * b, lapack_int ldb, double tola,
    double tolb, double * alpha, double * beta, double * u, lapack_int ldu,
    double * v, lapack_int ldv, double * q, lapack_int ldq, lapack_int *
    ncycle)

Definition at line 36 of file lapacke_dtgsja.c.

  • LAPACKE_dtgsja_work — identical cast of characters to LAPACKE_dtgsja, plus a double * work slot at the end 🎀 note it's work with no lwork here, so the sizing situation is what it is.
lapack_int LAPACKE_dtgsja_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
    lapack_int l, double * a, lapack_int lda, double * b, lapack_int ldb,
    double tola, double tolb, double * alpha, double * beta, double * u,
    lapack_int ldu, double * v, lapack_int ldv, double * q, lapack_int ldq,
    double * work, lapack_int * ncycle)

Definition at line 36 of file lapacke_dtgsja_work.c.


  • LAPACKE_dtgsna — condition numbers for eigenvalues and eigenvectors of a matrix pair, iykyk 🦋 job picks what you're estimating, howmny says whether select matters, vl and vr are the left/right eigenvector matrices, and mm is how many you're allowed to ask about — actual count lands in m. Answers go into s and dif.
lapack_int LAPACKE_dtgsna (int matrix_layout, char job, char howmny, const
    lapack_logical * select, lapack_int n, const double * a, lapack_int lda,
    const double * b, lapack_int ldb, const double * vl, lapack_int ldvl,
    const double * vr, lapack_int ldvr, double * s, double * dif, lapack_int
    mm, lapack_int * m)

Definition at line 36 of file lapacke_dtgsna.c.

  • LAPACKE_dtgsna_work — the _work version, obviously 💅 same job/howmny/select setup, and now you're also handing over work + lwork and iwork. Two extras, both yours to size.
lapack_int LAPACKE_dtgsna_work (int matrix_layout, char job, char howmny,
    const lapack_logical * select, lapack_int n, const double * a,
    lapack_int lda, const double * b, lapack_int ldb, const double * vl,
    lapack_int ldvl, const double * vr, lapack_int ldvr, double * s, double
    * dif, lapack_int mm, lapack_int * m, double * work, lapack_int lwork,
    lapack_int * iwork)

Definition at line 36 of file lapacke_dtgsna_work.c.


  • LAPACKE_dtgsyl — solves the generalized Sylvester equation, no cap 🔥 trans picks the transpose flavour, ijob picks the job, m and n are the block dims, and it works across a, b, c, d, e, f with their ld* leading dimensions. Comes back with scale and dif — like, it even tells you the scaling factor it had to apply. Considerate king behaviour.
lapack_int LAPACKE_dtgsyl (int matrix_layout, char trans, lapack_int ijob,
    lapack_int m, lapack_int n, const double * a, lapack_int lda, const
    double * b, lapack_int ldb, double * c, lapack_int ldc, const double *
    d, lapack_int ldd, const double * e, lapack_int lde, double * f,
    lapack_int ldf, double * scale, double * dif)

Definition at line 36 of file lapacke_dtgsyl.c.

  • LAPACKE_dtgsyl_work — same equation, same drama, but with work / lwork and iwork bolted on the end so you control the scratch 🧚
lapack_int LAPACKE_dtgsyl_work (int matrix_layout, char trans, lapack_int
    ijob, lapack_int m, lapack_int n, const double * a, lapack_int lda,
    const double * b, lapack_int ldb, double * c, lapack_int ldc, const
    double * d, lapack_int ldd, const double * e, lapack_int lde, double *
    f, lapack_int ldf, double * scale, double * dif, double * work,
    lapack_int lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_dtgsyl_work.c.


  • LAPACKE_dtpcon — estimate the reciprocal condition number of a triangular matrix in packed storage 🎀 norm, uplo and diag are your classic trio, ap is the packed matrix, and the answer drops into rcond. Short and iconic.
lapack_int LAPACKE_dtpcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const double * ap, double * rcond)

Definition at line 36 of file lapacke_dtpcon.c.

  • LAPACKE_dtpcon_work — same packed condition-number estimating, except now work and iwork are on you too 💀 the parameter list is doing the absolute most but she's worth it.
lapack_int LAPACKE_dtpcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const double * ap, double * rcond, double *
    work, lapack_int * iwork)

Definition at line 36 of file lapacke_dtpcon_work.c.


  • LAPACKE_dtpmqrt — applies a real orthogonal matrix defined as the product of a triangular-pentagonal block reflector 😭 okay the name is terrifying but she's just doing the multiply thing. side and trans set the direction/transpose, m, n, k, l, nb shape it all, v and t are the reflectors, a and b are the ones getting hit.
lapack_int LAPACKE_dtpmqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int nb,
    const double * v, lapack_int ldv, const double * t, lapack_int ldt,
    double * a, lapack_int lda, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dtpmqrt.c.

  • LAPACKE_dtpmqrt_work — the same triangular-pentagonal reflector application, but you showed up with your own double * work 🌸 one extra arg, all the same facts.
lapack_int LAPACKE_dtpmqrt_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int nb,
    const double * v, lapack_int ldv, const double * t, lapack_int ldt,
    double * a, lapack_int lda, double * b, lapack_int ldb, double * work)

Definition at line 36 of file lapacke_dtpmqrt_work.c.


  • LAPACKE_dtpqrt — computes a QR factorization of a triangular-pentagonal matrix pair 🦋 blocks of m, n, l, nb, matrix a, matrix b, output reflector stuff into t. This is the blocked-flavoured one.
lapack_int LAPACKE_dtpqrt (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int l, lapack_int nb, double * a, lapack_int lda, double * b,
    lapack_int ldb, double * t, lapack_int ldt)

Definition at line 36 of file lapacke_dtpqrt.c.

  • LAPACKE_dtpqrt2 — same triangular-pentagonal QR deal but the unblocked one — notice there's no nb here bestie, just m, n, l and the matrices 💅
lapack_int LAPACKE_dtpqrt2 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int l, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * t, lapack_int ldt)

Definition at line 36 of file lapacke_dtpqrt2.c.

  • LAPACKE_dtpqrt2_work — literally the exact same parameter list as LAPACKE_dtpqrt2 😭 same m, n, l, a, lda, b, ldb, t, ldt — she just lives in a differently-named file. No extra args. Not me pointing it out. 🙈
lapack_int LAPACKE_dtpqrt2_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * t, lapack_int ldt)

Definition at line 36 of file lapacke_dtpqrt2_work.c.

  • LAPACKE_dtpqrt_work — the blocked version again, with nb back in the lineup, plus a double * work at the end for the scratch 🫶
lapack_int LAPACKE_dtpqrt_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, lapack_int nb, double * a, lapack_int lda, double * b,
    lapack_int ldb, double * t, lapack_int ldt, double * work)

Definition at line 36 of file lapacke_dtpqrt_work.c.


  • LAPACKE_dtprfb — applies a real block reflector from the left or right 🔥 side, trans, direct and storev are four whole chars of configuration, then m, n, k, l sized things, v and t are the reflector data, and a / b get updated. Four char args is giving "I have layers" honestly.
lapack_int LAPACKE_dtprfb (int matrix_layout, char side, char trans, char
    direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    lapack_int l, const double * v, lapack_int ldv, const double * t,
    lapack_int ldt, double * a, lapack_int lda, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dtprfb.c.

  • LAPACKE_dtprfb_work — same block reflector application, and the workspace arg is double * work, lapack_int ldwork 👀 yes bestie it's ldwork here, not lwork. Do not get got by the name.
lapack_int LAPACKE_dtprfb_work (int matrix_layout, char side, char trans,
    char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    lapack_int l, const double * v, lapack_int ldv, const double * t,
    lapack_int ldt, double * a, lapack_int lda, double * b, lapack_int ldb,
    double * work, lapack_int ldwork)

Definition at line 36 of file lapacke_dtprfb_work.c.


  • LAPACKE_dtprfs — error bounds for a triangular solve in packed storage ✨ uplo, trans, diag set the problem, n and nrhs size it, ap is the packed factor, b is the right-hand side, x is the computed solution, and ferr / berr come back as your forward and backward error bounds. Chef's kiss.
lapack_int LAPACKE_dtprfs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const double * ap, const double *
    b, lapack_int ldb, const double * x, lapack_int ldx, double * ferr,
    double * berr)

Definition at line 36 of file lapacke_dtprfs.c.

  • LAPACKE_dtprfs_work — identical packed-solve error-bound situation, plus work and iwork for the internals 🎀 four extra tokens of pure administrative burden.
lapack_int LAPACKE_dtprfs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const double * ap, const
    double * b, lapack_int ldb, const double * x, lapack_int ldx, double *
    ferr, double * berr, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dtprfs_work.c.


  • LAPACKE_dtptri — inverse of a triangular matrix, packed storage, that's it that's the function 💜 uplo and diag say which triangle and whether the diagonal is unit, n is the order, ap is the packed matrix in and the inverse out. Six args. Iconic minimalism.
lapack_int LAPACKE_dtptri (int matrix_layout, char uplo, char diag,
    lapack_int n, double * ap)

Definition at line 36 of file lapacke_dtptri.c.

  • LAPACKE_dtptri_work — you already know the drill bestie: byte-for-byte the same parameters as LAPACKE_dtptri, just living in the _work file. No extra workspace, no notes. 💅
lapack_int LAPACKE_dtptri_work (int matrix_layout, char uplo, char diag,
    lapack_int n, double * ap)

Definition at line 36 of file lapacke_dtptri_work.c.


  • LAPACKE_dtptrs — solves a system with a triangular packed matrix, multiple right-hand sides welcome 🌈 uplo, trans, diag, n, nrhs, packed ap, and b with ldb is overwritten with the solution. Simple. Effective. Slays.
lapack_int LAPACKE_dtptrs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const double * ap, double * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_dtptrs.c.

  • LAPACKE_dtptrs_work — same triangular packed solve, same parameters exactly, different file 😌 lapacke_dtptrs_work.c is the whole difference. We love a low-effort queen.
lapack_int LAPACKE_dtptrs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const double * ap, double * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_dtptrs_work.c.


  • LAPACKE_dtpttf — converts from packed triangular format (ap) to RFP / rectangular full packed format (arf) ⭐️ transr says whether the RFP output is normal or transposed, uplo picks the triangle, n is the order. A format glow-up, honestly.
lapack_int LAPACKE_dtpttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const double * ap, double * arf)

Definition at line 36 of file lapacke_dtpttf.c.

  • LAPACKE_dtpttf_work — the exact same packed-to-RFP conversion with the exact same arguments 🫶 yes, both of them, identical. Don't ask.
lapack_int LAPACKE_dtpttf_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const double * ap, double * arf)

Definition at line 36 of file lapacke_dtpttf_work.c.


  • LAPACKE_dtpttr — the reverse glow-up: packed triangular (ap) → full triangular storage in a, with lda as the leading dim 🌸 uplo and n as always. Unpacking arc.
lapack_int LAPACKE_dtpttr (int matrix_layout, char uplo, lapack_int n, const
    double * ap, double * a, lapack_int lda)

Definition at line 36 of file lapacke_dtpttr.c.

  • LAPACKE_dtpttr_work — same unpacking arc, same six args, different filename 🎀 consistency is a love language.
lapack_int LAPACKE_dtpttr_work (int matrix_layout, char uplo, lapack_int n,
    const double * ap, double * a, lapack_int lda)

Definition at line 36 of file lapacke_dtpttr_work.c.


  • LAPACKE_dtrcon — reciprocal condition number estimate for a full-storage triangular matrix 👑 norm, uplo, diag, n, the matrix a with lda, answer into rcond. Classic trio, classic output.
lapack_int LAPACKE_dtrcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const double * a, lapack_int lda, double * rcond)

Definition at line 36 of file lapacke_dtrcon.c.

  • LAPACKE_dtrcon_work — same full-storage condition estimate with work and iwork handed over by you 💜
lapack_int LAPACKE_dtrcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const double * a, lapack_int lda, double *
    rcond, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dtrcon_work.c.


  • LAPACKE_dtrevc — computes eigenvectors of a real upper quasi-triangular matrix 😭 say that five times fast. side picks left / right / both, howmny decides whether select is even consulted, t is the quasi-triangular input, vl and vr receive the eigenvectors, mm is your capacity and m reports the real count.
lapack_int LAPACKE_dtrevc (int matrix_layout, char side, char howmny,
    lapack_logical * select, lapack_int n, const double * t, lapack_int ldt,
    double * vl, lapack_int ldvl, double * vr, lapack_int ldvr, lapack_int
    mm, lapack_int * m)

Definition at line 36 of file lapacke_dtrevc.c.

  • LAPACKE_dtrevc_work — same eigenvector extraction, plus a single double * work at the end. That's it, that's the diff 🦋
lapack_int LAPACKE_dtrevc_work (int matrix_layout, char side, char howmny,
    lapack_logical * select, lapack_int n, const double * t, lapack_int ldt,
    double * vl, lapack_int ldvl, double * vr, lapack_int ldvr, lapack_int
    mm, lapack_int * m, double * work)

Definition at line 36 of file lapacke_dtrevc_work.c.


  • LAPACKE_dtrexc — reorders the Schur factorization of a real matrix 🔥 compq says whether q gets updated, t is the quasi-triangular Schur factor, q is the orthogonal matrix, and ifst / ilst are read-write: you say where the block is, it tells you where the block ended up. Sneaky little in-out pair.
lapack_int LAPACKE_dtrexc (int matrix_layout, char compq, lapack_int n,
    double * t, lapack_int ldt, double * q, lapack_int ldq, lapack_int *
    ifst, lapack_int * ilst)

Definition at line 36 of file lapacke_dtrexc.c.

  • LAPACKE_dtrexc_work — the Schur reorder again, plus double * work on the end 🌟 note: no lwork. Just vibes.
lapack_int LAPACKE_dtrexc_work (int matrix_layout, char compq, lapack_int n,
    double * t, lapack_int ldt, double * q, lapack_int ldq, lapack_int *
    ifst, lapack_int * ilst, double * work)

Definition at line 36 of file lapacke_dtrexc_work.c.


  • LAPACKE_dtrrfs — error bounds for a triangular solve, full storage edition ✨ uplo, trans, diag, n, nrhs, matrix a with lda, right-hand side b with ldb, computed solution x with ldx, and ferr / berr out. Nine-ish things and every one of them matters.
lapack_int LAPACKE_dtrrfs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda,
    const double * b, lapack_int ldb, const double * x, lapack_int ldx,
    double * ferr, double * berr)

Definition at line 36 of file lapacke_dtrrfs.c.

  • LAPACKE_dtrrfs_work — same bounds, same ferr / berr payoff, plus work and iwork because of course 🎀
lapack_int LAPACKE_dtrrfs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const double * a, lapack_int
    lda, const double * b, lapack_int ldb, const double * x, lapack_int ldx,
    double * ferr, double * berr, double * work, lapack_int * iwork)

Definition at line 36 of file lapacke_dtrrfs_work.c.


  • LAPACKE_dtrsen — reorders a real Schur factorization and spits out condition numbers for the reordered cluster 👑 job and compq control what's computed and whether q is touched, select picks the eigenvalues, t is the Schur factor, q the orthogonal guy, wr and wi are the real/imaginary parts of the eigenvalues, m reports the cluster size, and s / sep come back as the condition estimates. A whole main-character arc in one call.
lapack_int LAPACKE_dtrsen (int matrix_layout, char job, char compq, const
    lapack_logical * select, lapack_int n, double * t, lapack_int ldt,
    double * q, lapack_int ldq, double * wr, double * wi, lapack_int * m,
    double * s, double * sep)

Definition at line 36 of file lapacke_dtrsen.c.

LAPACKE_dtrsen_work 💖 — exact signature, no cap:

lapack_int LAPACKE_dtrsen_work (int matrix_layout, char job, char compq,
    const lapack_logical * select, lapack_int n, double * t, lapack_int ldt,
    double * q, lapack_int ldq, double * wr, double * wi, lapack_int * m,
    double * s, double * sep, double * work, lapack_int lwork, lapack_int *
    iwork, lapack_int liwork)

Definition at line 36 of file lapacke_dtrsen_work.c.

LAPACKE_dtrsna 🌸 — the non-_work one, serving all its parameters:

lapack_int LAPACKE_dtrsna (int matrix_layout, char job, char howmny, const
    lapack_logical * select, lapack_int n, const double * t, lapack_int ldt,
    const double * vl, lapack_int ldvl, const double * vr, lapack_int ldvr,
    double * s, double * sep, lapack_int mm, lapack_int * m)

Definition at line 36 of file lapacke_dtrsna.c.

LAPACKE_dtrsna_work 🎀 — yes bestie, ldwork is right there, exactly like that:

lapack_int LAPACKE_dtrsna_work (int matrix_layout, char job, char howmny,
    const lapack_logical * select, lapack_int n, const double * t,
    lapack_int ldt, const double * vl, lapack_int ldvl, const double * vr,
    lapack_int ldvr, double * s, double * sep, lapack_int mm, lapack_int *
    m, double * work, lapack_int ldwork, lapack_int * iwork)

Definition at line 36 of file lapacke_dtrsna_work.c.

LAPACKE_dtrsyl 🦋 — exact signature:

lapack_int LAPACKE_dtrsyl (int matrix_layout, char trana, char tranb,
    lapack_int isgn, lapack_int m, lapack_int n, const double * a,
    lapack_int lda, const double * b, lapack_int ldb, double * c, lapack_int
    ldc, double * scale)

Definition at line 36 of file lapacke_dtrsyl.c.

LAPACKE_dtrsyl_work 💅 — _work edition, same parameter crew:

lapack_int LAPACKE_dtrsyl_work (int matrix_layout, char trana, char tranb,
    lapack_int isgn, lapack_int m, lapack_int n, const double * a,
    lapack_int lda, const double * b, lapack_int ldb, double * c, lapack_int
    ldc, double * scale)

Definition at line 36 of file lapacke_dtrsyl_work.c.

LAPACKE_dtrtri ✨ — short and iconic:

lapack_int LAPACKE_dtrtri (int matrix_layout, char uplo, char diag,
    lapack_int n, double * a, lapack_int lda)

Definition at line 36 of file lapacke_dtrtri.c.

LAPACKE_dtrtri_work 🫶 — same signature, _work name:

lapack_int LAPACKE_dtrtri_work (int matrix_layout, char uplo, char diag,
    lapack_int n, double * a, lapack_int lda)

Definition at line 36 of file lapacke_dtrtri_work.c.

LAPACKE_dtrtrs 😭 — exact signature:

lapack_int LAPACKE_dtrtrs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const double * a, lapack_int lda,
    double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dtrtrs.c.

LAPACKE_dtrtrs_work 🔥 — exact signature:

lapack_int LAPACKE_dtrtrs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const double * a, lapack_int
    lda, double * b, lapack_int ldb)

Definition at line 36 of file lapacke_dtrtrs_work.c.

LAPACKE_dtrttf 👑 — exact signature:

lapack_int LAPACKE_dtrttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const double * a, lapack_int lda, double * arf)

Definition at line 36 of file lapacke_dtrttf.c.

LAPACKE_dtrttf_work 🌈 — exact signature:

lapack_int LAPACKE_dtrttf_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const double * a, lapack_int lda, double * arf)

Definition at line 36 of file lapacke_dtrttf_work.c.

LAPACKE_dtrttp ⭐ — exact signature:

lapack_int LAPACKE_dtrttp (int matrix_layout, char uplo, lapack_int n, const
    double * a, lapack_int lda, double * ap)

Definition at line 36 of file lapacke_dtrttp.c.

LAPACKE_dtrttp_work 💀 — exact signature:

lapack_int LAPACKE_dtrttp_work (int matrix_layout, char uplo, lapack_int n,
    const double * a, lapack_int lda, double * ap)

Definition at line 36 of file lapacke_dtrttp_work.c.

LAPACKE_dtzrzf 🙈 — exact signature:

lapack_int LAPACKE_dtzrzf (int matrix_layout, lapack_int m, lapack_int n,
    double * a, lapack_int lda, double * tau)

Definition at line 36 of file lapacke_dtzrzf.c.

LAPACKE_dtzrzf_work 🍓 — exact signature:

lapack_int LAPACKE_dtzrzf_work (int matrix_layout, lapack_int m, lapack_int
    n, double * a, lapack_int lda, double * tau, double * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_dtzrzf_work.c.

LAPACKE_get_nancheck 🧚 — tiny no-arg one, living at line 43:

int LAPACKE_get_nancheck ()

Definition at line 43 of file lapacke_nancheck.c.

LAPACKE_ilaver 💜 — exact signature:

void LAPACKE_ilaver (lapack_int * vers_major, lapack_int * vers_minor,
    lapack_int * vers_patch)

Definition at line 36 of file lapacke_ilaver.c.

LAPACKE_sbbcsd 💖 — okay this parameter list is a whole main-character moment:

lapack_int LAPACKE_sbbcsd (int matrix_layout, char jobu1, char jobu2, char
    jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p, lapack_int
    q, float * theta, float * phi, float * u1, lapack_int ldu1, float * u2,
    lapack_int ldu2, float * v1t, lapack_int ldv1t, float * v2t, lapack_int
    ldv2t, float * b11d, float * b11e, float * b12d, float * b12e, float *
    b21d, float * b21e, float * b22d, float * b22e)

Definition at line 36 of file lapacke_sbbcsd.c.

LAPACKE_sbbcsd_work 🌸 — same energy, plus work and lwork:

lapack_int LAPACKE_sbbcsd_work (int matrix_layout, char jobu1, char jobu2,
    char jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p,
    lapack_int q, float * theta, float * phi, float * u1, lapack_int ldu1,
    float * u2, lapack_int ldu2, float * v1t, lapack_int ldv1t, float * v2t,
    lapack_int ldv2t, float * b11d, float * b11e, float * b12d, float *
    b12e, float * b21d, float * b21e, float * b22d, float * b22e, float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_sbbcsd_work.c.

LAPACKE_sbdsdc 🎀 — exact signature:

lapack_int LAPACKE_sbdsdc (int matrix_layout, char uplo, char compq,
    lapack_int n, float * d, float * e, float * u, lapack_int ldu, float *
    vt, lapack_int ldvt, float * q, lapack_int * iq)

Definition at line 36 of file lapacke_sbdsdc.c.

LAPACKE_sbdsdc_work 🦋 — exact signature:

lapack_int LAPACKE_sbdsdc_work (int matrix_layout, char uplo, char compq,
    lapack_int n, float * d, float * e, float * u, lapack_int ldu, float *
    vt, lapack_int ldvt, float * q, lapack_int * iq, float * work,
    lapack_int * iwork)

Definition at line 36 of file lapacke_sbdsdc_work.c.

LAPACKE_sbdsqr 💅 — exact signature:

lapack_int LAPACKE_sbdsqr (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, float * d, float * e,
    float * vt, lapack_int ldvt, float * u, lapack_int ldu, float * c,
    lapack_int ldc)

Definition at line 36 of file lapacke_sbdsqr.c.

LAPACKE_sbdsqr_work ✨ — exact signature:

lapack_int LAPACKE_sbdsqr_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, float * d, float * e,
    float * vt, lapack_int ldvt, float * u, lapack_int ldu, float * c,
    lapack_int ldc, float * work)

Definition at line 36 of file lapacke_sbdsqr_work.c.

LAPACKE_sbdsvdx 🫶 — exact signature:

lapack_int LAPACKE_sbdsvdx (int matrix_layout, char uplo, char jobz, char
    range, lapack_int n, float * d, float * e, float vl, float vu,
    lapack_int il, lapack_int iu, lapack_int * ns, float * s, float * z,
    lapack_int ldz, lapack_int * superb)

Definition at line 36 of file lapacke_sbdsvdx.c.

LAPACKE_sbdsvdx_work 😭 — exact signature, with work and iwork:

lapack_int LAPACKE_sbdsvdx_work (int matrix_layout, char uplo, char jobz,
    char range, lapack_int n, float * d, float * e, float vl, float vu,
    lapack_int il, lapack_int iu, lapack_int * ns, float * s, float * z,
    lapack_int ldz, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_sbdsvdx_work.c.

LAPACKE_sdisna 🔥 — exact signature:

lapack_int LAPACKE_sdisna (char job, lapack_int m, lapack_int n, const float
    * d, float * sep)

Definition at line 36 of file lapacke_sdisna.c.

LAPACKE_sdisna_work 👑 — exact signature:

lapack_int LAPACKE_sdisna_work (char job, lapack_int m, lapack_int n, const
    float * d, float * sep)

Definition at line 36 of file lapacke_sdisna_work.c.

LAPACKE_set_nancheck 🌈 — takes an int flag, line 38 said so:

void LAPACKE_set_nancheck (int flag)

Definition at line 38 of file lapacke_nancheck.c.

LAPACKE_sgbbrd ⭐ — exact signature:

lapack_int LAPACKE_sgbbrd (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku, float * ab,
    lapack_int ldab, float * d, float * e, float * q, lapack_int ldq, float
    * pt, lapack_int ldpt, float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sgbbrd.c.

LAPACKE_sgbbrd_work 💀 — exact signature, plus work:

lapack_int LAPACKE_sgbbrd_work (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku, float * ab,
    lapack_int ldab, float * d, float * e, float * q, lapack_int ldq, float
    * pt, lapack_int ldpt, float * c, lapack_int ldc, float * work)

Definition at line 36 of file lapacke_sgbbrd_work.c.

LAPACKE_sgbcon 🙈 — exact signature:

lapack_int LAPACKE_sgbcon (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const float * ab, lapack_int ldab, const
    lapack_int * ipiv, float anorm, float * rcond)

Definition at line 36 of file lapacke_sgbcon.c.

LAPACKE_sgbcon_work 🍓 — exact signature:

lapack_int LAPACKE_sgbcon_work (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const float * ab, lapack_int ldab, const
    lapack_int * ipiv, float anorm, float * rcond, float * work, lapack_int
    * iwork)

Definition at line 36 of file lapacke_sgbcon_work.c.

LAPACKE_sgbequ 🧚 — exact signature:

lapack_int LAPACKE_sgbequ (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, const float * ab, lapack_int ldab, float *
    r, float * c, float * rowcnd, float * colcnd, float * amax)

Definition at line 36 of file lapacke_sgbequ.c.

LAPACKE_sgbequ_work 💜 — exact signature:

lapack_int LAPACKE_sgbequ_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const float * ab, lapack_int ldab,
    float * r, float * c, float * rowcnd, float * colcnd, float * amax)

Definition at line 36 of file lapacke_sgbequ_work.c.

LAPACKE_sgbequb 💖 — exact signature:

lapack_int LAPACKE_sgbequb (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, const float * ab, lapack_int ldab, float *
    r, float * c, float * rowcnd, float * colcnd, float * amax)

Definition at line 36 of file lapacke_sgbequb.c.

LAPACKE_sgbequb_work 🌸 — exact signature:

lapack_int LAPACKE_sgbequb_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const float * ab, lapack_int ldab,
    float * r, float * c, float * rowcnd, float * colcnd, float * amax)

Definition at line 36 of file lapacke_sgbequb_work.c.

LAPACKE_sgbrfs 🎀 — exact signature:

lapack_int LAPACKE_sgbrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const float * ab,
    lapack_int ldab, const float * afb, lapack_int ldafb, const lapack_int *
    ipiv, const float * b, lapack_int ldb, float * x, lapack_int ldx, float
    * ferr, float * berr)

Definition at line 36 of file lapacke_sgbrfs.c.

LAPACKE_sgbrfs_work 🦋 — exact signature:

lapack_int LAPACKE_sgbrfs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const float * ab,
    lapack_int ldab, const float * afb, lapack_int ldafb, const lapack_int *
    ipiv, const float * b, lapack_int ldb, float * x, lapack_int ldx, float
    * ferr, float * berr, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_sgbrfs_work.c.

LAPACKE_sgbrfsx 💅 — okay this one is long, but every parameter is staying:

lapack_int LAPACKE_sgbrfsx (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const float
    * ab, lapack_int ldab, const float * afb, lapack_int ldafb, const
    lapack_int * ipiv, const float * r, const float * c, const float * b,
    lapack_int ldb, float * x, lapack_int ldx, float * rcond, float * berr,
    lapack_int n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
    lapack_int nparams, float * params)

Definition at line 36 of file lapacke_sgbrfsx.c.

LAPACKE_sgbrfsx_work ✨ — same long lineup, plus work and iwork:

lapack_int LAPACKE_sgbrfsx_work (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const float
    * ab, lapack_int ldab, const float * afb, lapack_int ldafb, const
    lapack_int * ipiv, const float * r, const float * c, const float * b,
    lapack_int ldb, float * x, lapack_int ldx, float * rcond, float * berr,
    lapack_int n_err_bnds, float * err_bnds_norm, float * err_bnds_comp,
    lapack_int nparams, float * params, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_sgbrfsx_work.c.

LAPACKE_sgbsv 🩵

lapack_int LAPACKE_sgbsv (int matrix_layout, lapack_int n, lapack_int kl,
    lapack_int ku, lapack_int nrhs, float * ab, lapack_int ldab, lapack_int
    * ipiv, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sgbsv.c.

Ten args, bestie. matrix_layout leads the parade, n, kl, ku, nrhs right behind it, then the band-storage pointer ab with its ldab, the pivot array ipiv, and finally b with ldb. Float in, float out. 💖

  • LAPACKE_sgbsv_work — same signature, top to bottom: int matrix_layout, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, float * ab, lapack_int ldab, lapack_int * ipiv, float * b, lapack_int ldb. Definition at line 36 of file lapacke_sgbsv_work.c. The _work twin, same face card. 🫶

LAPACKE_sgbsvx ✨

lapack_int LAPACKE_sgbsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, float * ab,
    lapack_int ldab, float * afb, lapack_int ldafb, lapack_int * ipiv, char
    * equed, float * r, float * c, float * b, lapack_int ldb, float * x,
    lapack_int ldx, float * rcond, float * ferr, float * berr, float *
    rpivot)

Definition at line 36 of file lapacke_sgbsvx.c.

okay this one is long long — twenty-three arguments, and the way she's serving fact, trans and equed as chars alongside all those float * outputs… character development fr fr. Note fact, trans, equed are char while ab, afb, r, c, b, x, rcond, ferr, berr, rpivot are all float *. Two matrices, two leading dims (ldab, ldafb), then ldb and ldx. Not a typo in sight. 💅

  • LAPACKE_sgbsvx_work — carries the exact same argument list as LAPACKE_sgbsvx, and then keeps going with float * work, lapack_int * iwork tacked on the end. Definition at line 36 of file lapacke_sgbsvx_work.c. The extra workspace era. 🎀

LAPACKE_sgbsvxx 👑

lapack_int LAPACKE_sgbsvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, float * ab,
    lapack_int ldab, float * afb, lapack_int ldafb, lapack_int * ipiv, char
    * equed, float * r, float * c, float * b, lapack_int ldb, float * x,
    lapack_int ldx, float * rcond, float * rpvgrw, float * berr, lapack_int
    n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int
    nparams, float * params)

Definition at line 36 of file lapacke_sgbsvxx.c.

The double-x variant said "and I took that personally." Twenty-seven arguments — she picked up rpvgrw, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params where sgbsvx had ferr. Main character energy, no cap. 🌈

  • LAPACKE_sgbsvxx_work — everything LAPACKE_sgbsvxx has, plus float * work, lapack_int * iwork at the tail. Definition at line 36 of file lapacke_sgbsvxx_work.c. Twenty-nine args and she's still standing. 💀

LAPACKE_sgbtrf 🦋

lapack_int LAPACKE_sgbtrf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, float * ab, lapack_int ldab, lapack_int *
    ipiv)

Definition at line 36 of file lapacke_sgbtrf.c.

Heads up: this one takes m and n, not just n like the gbsv crowd. So the full squad is matrix_layout, m, n, kl, ku, ab, ldab, ipiv. That's the whole list, nothing hiding. ✨

  • LAPACKE_sgbtrf_work — identical: int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, float * ab, lapack_int ldab, lapack_int * ipiv. Definition at line 36 of file lapacke_sgbtrf_work.c.

LAPACKE_sgbtrs 🌸

lapack_int LAPACKE_sgbtrs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const float * ab,
    lapack_int ldab, const lapack_int * ipiv, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sgbtrs.c.

Lowkey the glow-up here is the const: ab is const float * and ipiv is const lapack_int * — those two are read-only, they're just here to be looked at. b stays a plain float * because she's the one getting written. Respect the const-correctness, iykyk. 💜

  • LAPACKE_sgbtrs_work — same as above, const and all: int matrix_layout, char trans, lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const float * ab, lapack_int ldab, const lapack_int * ipiv, float * b, lapack_int ldb. Definition at line 36 of file lapacke_sgbtrs_work.c.

LAPACKE_sgebak 🎀

lapack_int LAPACKE_sgebak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const float * scale,
    lapack_int m, float * v, lapack_int ldv)

Definition at line 36 of file lapacke_sgebak.c.

Two chars out front (job, side), the ilo/ihi pair doing their little balancing act, a const float * scale, then m, v and ldv. Note that m shows up after scale — order matters when you're calling, bestie, don't shuffle the deck. 🫶

  • LAPACKE_sgebak_work — identical argument list, character for character. Definition at line 36 of file lapacke_sgebak_work.c.

LAPACKE_sgebal 🧚

lapack_int LAPACKE_sgebal (int matrix_layout, char job, lapack_int n, float
    * a, lapack_int lda, lapack_int * ilo, lapack_int * ihi, float * scale)

Definition at line 36 of file lapacke_sgebal.c.

ilo and ihi are lapack_int * here — pointers, so they're getting filled in. Same with scale. The matrix a comes with lda like always. Clean, tidy, iconic. ⭐

  • LAPACKE_sgebal_work — same: int matrix_layout, char job, lapack_int n, float * a, lapack_int lda, lapack_int * ilo, lapack_int * ihi, float * scale. Definition at line 36 of file lapacke_sgebal_work.c.

LAPACKE_sgebrd 🔥

lapack_int LAPACKE_sgebrd (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * d, float * e, float * tauq, float *
    taup)

Definition at line 36 of file lapacke_sgebrd.c.

m and n both present, then a/lda, and the quartet of outputs d, e, tauq, taup. Note the spelling — tauq and taup, q first, then p. Don't flip them, I'm begging. 😭

  • LAPACKE_sgebrd_work — the full LAPACKE_sgebrd list plus float * work, lapack_int lwork on the end. Definition at line 36 of file lapacke_sgebrd_work.c. Workspace era unlocked.

LAPACKE_sgecon 💅

lapack_int LAPACKE_sgecon (int matrix_layout, char norm, lapack_int n, const
    float * a, lapack_int lda, float anorm, float * rcond)

Definition at line 36 of file lapacke_sgecon.c.

norm is a char, a is const float * (read-only queen), and anorm is a plain float passed by value — not a pointer! Only rcond gets the *. That contrast is the whole vibe check of this signature tbh. 🌸

  • LAPACKE_sgecon_work — same front half, then float * work, lapack_int * iwork. Definition at line 36 of file lapacke_sgecon_work.c.

LAPACKE_sgeequ and LAPACKE_sgeequb 🍓

These two are literal twins and I'm obsessed.

lapack_int LAPACKE_sgeequ (int matrix_layout, lapack_int m, lapack_int n,
    const float * a, lapack_int lda, float * r, float * c, float * rowcnd,
    float * colcnd, float * amax)

Definition at line 36 of file lapacke_sgeequ.c.

  • LAPACKE_sgeequ_work — identical list: int matrix_layout, lapack_int m, lapack_int n, const float * a, lapack_int lda, float * r, float * c, float * rowcnd, float * colcnd, float * amax. Definition at line 36 of file lapacke_sgeequ_work.c.
lapack_int LAPACKE_sgeequb (int matrix_layout, lapack_int m, lapack_int n,
    const float * a, lapack_int lda, float * r, float * c, float * rowcnd,
    float * colcnd, float * amax)

Definition at line 36 of file lapacke_sgeequb.c.

  • LAPACKE_sgeequb_work — same again: int matrix_layout, lapack_int m, lapack_int n, const float * a, lapack_int lda, float * r, float * c, float * rowcnd, float * colcnd, float * amax. Definition at line 36 of file lapacke_sgeequb_work.c.

Four functions, one signature, zero notes. const float * a stays const in all of them. 🫶


LAPACKE_sgees 💜

lapack_int LAPACKE_sgees (int matrix_layout, char jobvs, char sort,
    LAPACK_S_SELECT2 select, lapack_int n, float * a, lapack_int lda,
    lapack_int * sdim, float * wr, float * wi, float * vs, lapack_int ldvs)

Definition at line 36 of file lapacke_sgees.c.

Ooh, a function pointer! LAPACK_S_SELECT2 select sits right there in position four, between char sort and lapack_int n. That's the typedef flex. Then sdim, wr, wi are all pointer outputs, and vs brings ldvs as its plus-one. ✨

  • LAPACKE_sgees_work — everything above plus float * work, lapack_int lwork, lapack_logical * bwork. Definition at line 36 of file lapacke_sgees_work.c. Note that's lapack_logical *, not lapack_int * — different type, bestie, don't get it twisted. 😭

LAPACKE_sgeesx 🌈

lapack_int LAPACKE_sgeesx (int matrix_layout, char jobvs, char sort,
    LAPACK_S_SELECT2 select, char sense, lapack_int n, float * a, lapack_int
    lda, lapack_int * sdim, float * wr, float * wi, float * vs, lapack_int
    ldvs, float * rconde, float * rcondv)

Definition at line 36 of file lapacke_sgeesx.c.

LAPACKE_sgees but make it extra: char sense slides in right after select, and the tail gains rconde and rcondv. Everything else is untouched. The x suffix is doing exactly what it says on the tin. 🔥

  • LAPACKE_sgeesx_work — the whole thing plus float * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork, lapack_logical * bwork. Definition at line 36 of file lapacke_sgeesx_work.c. Yes, iwork/liwork and bwork both ride along. Both. 🎀

LAPACKE_sgeev 🦋

lapack_int LAPACKE_sgeev (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, float * a, lapack_int lda, float * wr, float * wi, float *
    vl, lapack_int ldvl, float * vr, lapack_int ldvr)

Definition at line 36 of file lapacke_sgeev.c.

The classic!! Note the naming: jobvl and jobvr — no underscore, just l and r glued on. And the left/right eigenvectors come as the pairs vl/ldvl and vr/ldvr. Symmetry. We love to see it. 💖

  • LAPACKE_sgeev_work — the same twelve plus float * work, lapack_int lwork. Definition at line 36 of file lapacke_sgeev_work.c.

LAPACKE_sgeevx 👑

lapack_int LAPACKE_sgeevx (int matrix_layout, char balanc, char jobvl, char
    jobvr, char sense, lapack_int n, float * a, lapack_int lda, float * wr,
    float * wi, float * vl, lapack_int ldvl, float * vr, lapack_int ldvr,
    lapack_int * ilo, lapack_int * ihi, float * scale, float * abnrm, float *
    rconde, float * rcondv)

Definition at line 36 of file lapacke_sgeevx.c.

Four chars stacked up front — balanc, jobvl, jobvr, sense — and then a whole parade of outputs: wr, wi, vl, vr, ilo, ihi, scale, abnrm, rconde, rcondv. ilo and ihi are lapack_int *; everything else output-ish is float *. Twenty args of pure ✨.

  • LAPACKE_sgeevx_work — the exact same list plus float * work, lapack_int lwork, lapack_int * iwork at the end. Definition at line 36 of file lapacke_sgeevx_work.c. Note: iwork here, but no bwork — don't assume, check the signature. 🙈

LAPACKE_sgehrd ⭐

lapack_int LAPACKE_sgehrd (int matrix_layout, lapack_int n, lapack_int ilo,
    lapack_int ihi, float * a, lapack_int lda, float * tau)

Definition at line 36 of file lapacke_sgehrd.c.

Short and sweet — no m here, just n. ilo and ihi are by-value lapack_int this time (compare with sgebal, where they were pointers — love that journey for them). tau is a single float *. 💅

  • LAPACKE_sgehrd_work — same plus float * work, lapack_int lwork. Definition at line 36 of file lapacke_sgehrd_work.c.

LAPACKE_sgejsv 🧚

lapack_int LAPACKE_sgejsv (int matrix_layout, char joba, char jobu, char
    jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int n, float
    * a, lapack_int lda, float * sva, float * u, lapack_int ldu, float * v,
    lapack_int ldv, float * stat, lapack_int * istat)

Definition at line 36 of file lapacke_sgejsv.c.

Six — SIX — char job-prefixed arguments: joba, jobu, jobv, jobr, jobt, jobp. Say that five times fast. Then m, n, a/lda, sva, u/ldu, v/ldv, and the pair stat (float *) + istat (lapack_int *). The s-prefix on sva, stat and istat? Chef's kiss naming consistency. 🍓

  • LAPACKE_sgejsv_work — everything above, except stat and istat get swapped for float * work, lapack_int lwork, lapack_int * iwork. Definition at line 36 of file lapacke_sgejsv_work.c. Read that tail carefully, bestie — it's different. 😭

LAPACKE_sgelq 🌸

lapack_int LAPACKE_sgelq (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * t, lapack_int tsize)

Definition at line 36 of file lapacke_sgelq.c.

t comes with tsize — and tsize is a plain lapack_int, not a pointer. Little detail, big deal. ✨


LAPACKE_sgelq2 🎀

lapack_int LAPACKE_sgelq2 (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * tau)

Definition at line 36 of file lapacke_sgelq2.c.

The 2 version swaps the t/tsize duo for a single float * tau. That's it, that's the difference. 💖

  • LAPACKE_sgelq2_work — int matrix_layout, lapack_int m, lapack_int n, float * a, lapack_int lda, float * tau, float * work. Definition at line 36 of file lapacke_sgelq2_work.c. Notice: work but no lwork. Just float * work. Don't add args that aren't there. 🫶

LAPACKE_sgelq_work ⭐

lapack_int LAPACKE_sgelq_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, float * t, lapack_int tsize, float * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_sgelq_work.c.

There's the lwork!! t + tsize keep their spots and work + lwork join at the end. So if you were confused about which _work gets a length and which doesn't — sgelq_work yes, sgelq2_work no. Screenshot this. 📸


LAPACKE_sgelqf 🌈

lapack_int LAPACKE_sgelqf (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * tau)

Definition at line 36 of file lapacke_sgelqf.c.

Same shape as LAPACKE_sgelq2 — m, n, a, lda, tau. Those two are giving matching outfits. 👑

  • LAPACKE_sgelqf_work — int matrix_layout, lapack_int m, lapack_int n, float * a, lapack_int lda, float * tau, float * work, lapack_int lwork. Definition at line 36 of file lapacke_sgelqf_work.c. And this one does bring lwork. Full house. 🔥

✨ LAPACKE_sgels ✨

lapack_int LAPACKE_sgels (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_sgels.c. 💅

✨ LAPACKE_sgels_work ✨

lapack_int LAPACKE_sgels_work (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * b,
    lapack_int ldb, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_sgels_work.c. 🫶 the _work twin, same energy, extra work buffer.

✨ LAPACKE_sgelsd ✨

lapack_int LAPACKE_sgelsd (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int nrhs, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * s, float rcond, lapack_int * rank)

Definition at line 36 of file lapacke_sgelsd.c. 🎀 it's giving divide-and-conquer, honestly iconic.

✨ LAPACKE_sgelsd_work ✨

lapack_int LAPACKE_sgelsd_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, float * a, lapack_int lda, float * b, lapack_int
    ldb, float * s, float rcond, lapack_int * rank, float * work, lapack_int
    lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_sgelsd_work.c. ✨ note the extra iwork bestie, she brought a friend.

✨ LAPACKE_sgelss ✨

lapack_int LAPACKE_sgelss (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int nrhs, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * s, float rcond, lapack_int * rank)

Definition at line 36 of file lapacke_sgelss.c. 🌸 singular values, rcond, rank — the whole squad's here.

✨ LAPACKE_sgelss_work ✨

lapack_int LAPACKE_sgelss_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, float * a, lapack_int lda, float * b, lapack_int
    ldb, float * s, float rcond, lapack_int * rank, float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_sgelss_work.c. 💜

✨ LAPACKE_sgelsy ✨

lapack_int LAPACKE_sgelsy (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int nrhs, float * a, lapack_int lda, float * b, lapack_int ldb,
    lapack_int * jpvt, float rcond, lapack_int * rank)

Definition at line 36 of file lapacke_sgelsy.c. 🦋 that jpvt pointer says she does column pivoting, periodt.

✨ LAPACKE_sgelsy_work ✨

lapack_int LAPACKE_sgelsy_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nrhs, float * a, lapack_int lda, float * b, lapack_int
    ldb, lapack_int * jpvt, float rcond, lapack_int * rank, float * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_sgelsy_work.c. 🧚

✨ LAPACKE_sgemlq ✨

lapack_int LAPACKE_sgemlq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * t, lapack_int tsize, float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sgemlq.c. 🔥 side, trans, a tsize — she's fancy and she knows it. Also lowkey note the const — she does NOT mutate a or t, respectful queen.

✨ LAPACKE_sgemlq_work ✨

lapack_int LAPACKE_sgemlq_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * t, lapack_int tsize, float * c, lapack_int ldc, float
    * work, lapack_int lwork)

Definition at line 36 of file lapacke_sgemlq_work.c. ⭐

✨ LAPACKE_sgemqr ✨

lapack_int LAPACKE_sgemqr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * t, lapack_int tsize, float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sgemqr.c. 🌈 same shape as her sister sgemlq, different vibe entirely.

✨ LAPACKE_sgemqr_work ✨

lapack_int LAPACKE_sgemqr_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * t, lapack_int tsize, float * c, lapack_int ldc, float
    * work, lapack_int lwork)

Definition at line 36 of file lapacke_sgemqr_work.c. 🍓

✨ LAPACKE_sgemqrt ✨

lapack_int LAPACKE_sgemqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const float *
    v, lapack_int ldv, const float * t, lapack_int ldt, float * c,
    lapack_int ldc)

Definition at line 36 of file lapacke_sgemqrt.c. 💫 block size nb walked in so the QR could be blocked, as she should.

✨ LAPACKE_sgemqrt_work ✨

lapack_int LAPACKE_sgemqrt_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const float *
    v, lapack_int ldv, const float * t, lapack_int ldt, float * c,
    lapack_int ldc, float * work)

Definition at line 36 of file lapacke_sgemqrt_work.c. 🎀 heads up bestie, this _work one takes float * work but no lwork — that's exactly how it's written here, don't come for me.

✨ LAPACKE_sgeqlf ✨

lapack_int LAPACKE_sgeqlf (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * tau)

Definition at line 36 of file lapacke_sgeqlf.c. 🌸 QL factorization, the underrated L-on-the-left one, we stan.

✨ LAPACKE_sgeqlf_work ✨

lapack_int LAPACKE_sgeqlf_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, float * tau, float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_sgeqlf_work.c. 💜

✨ LAPACKE_sgeqp3 ✨

lapack_int LAPACKE_sgeqp3 (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, lapack_int * jpvt, float * tau)

Definition at line 36 of file lapacke_sgeqp3.c. ✨ pivoting plus QR — the p3 is the moment, iykyk.

✨ LAPACKE_sgeqp3_work ✨

lapack_int LAPACKE_sgeqp3_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, lapack_int * jpvt, float * tau, float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_sgeqp3_work.c. 🦋

✨ LAPACKE_sgeqpf ✨

lapack_int LAPACKE_sgeqpf (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, lapack_int * jpvt, float * tau)

Definition at line 36 of file lapacke_sgeqpf.c. 🎀 same fit as sgeqp3, different gen.

✨ LAPACKE_sgeqpf_work ✨

lapack_int LAPACKE_sgeqpf_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, lapack_int * jpvt, float * tau, float *
    work)

Definition at line 36 of file lapacke_sgeqpf_work.c. ⚠️ again — float * work with no lwork in the signature, exactly as written. Not my fault, I just report the tea.

✨ LAPACKE_sgeqr ✨

lapack_int LAPACKE_sgeqr (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * t, lapack_int tsize)

Definition at line 36 of file lapacke_sgeqr.c. 🌈 the new-gen representation, t + tsize instead of tau, main character energy.

✨ LAPACKE_sgeqr2 ✨

lapack_int LAPACKE_sgeqr2 (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * tau)

Definition at line 36 of file lapacke_sgeqr2.c. 🫶 unblocked, no work, no lwork — she's doing it manually and honestly.

✨ LAPACKE_sgeqr2_work ✨

lapack_int LAPACKE_sgeqr2_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, float * tau, float * work)

Definition at line 36 of file lapacke_sgeqr2_work.c. 💅 work shows up, lwork doesn't. That's the whole bit.

✨ LAPACKE_sgeqr_work ✨

lapack_int LAPACKE_sgeqr_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, float * t, lapack_int tsize, float * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_sgeqr_work.c. 🧚 (also peep the name order — sgeqr_work lives down here, not right after sgeqr. We keep the original order, don't @ me.)

✨ LAPACKE_sgeqrf ✨

lapack_int LAPACKE_sgeqrf (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * tau)

Definition at line 36 of file lapacke_sgeqrf.c. ⭐ the classic. The blueprint. The one everybody's cousin uses.

✨ LAPACKE_sgeqrf_work ✨

lapack_int LAPACKE_sgeqrf_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, float * tau, float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_sgeqrf_work.c. 💖

✨ LAPACKE_sgeqrfp ✨

lapack_int LAPACKE_sgeqrfp (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * tau)

Definition at line 36 of file lapacke_sgeqrfp.c. 🌸 that trailing p is right there in the name, bestie.

✨ LAPACKE_sgeqrfp_work ✨

lapack_int LAPACKE_sgeqrfp_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, float * tau, float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_sgeqrfp_work.c. 🦋

✨ LAPACKE_sgeqrt ✨

lapack_int LAPACKE_sgeqrt (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int nb, float * a, lapack_int lda, float * t, lapack_int ldt)

Definition at line 36 of file lapacke_sgeqrt.c. 🔥 blocked QR, nb in the building, t with her own ldt.

✨ LAPACKE_sgeqrt2 ✨

lapack_int LAPACKE_sgeqrt2 (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * t, lapack_int ldt)

Definition at line 36 of file lapacke_sgeqrt2.c. 💜 no nb — she's the unblocked version of the same aesthetic.

✨ LAPACKE_sgeqrt2_work ✨

lapack_int LAPACKE_sgeqrt2_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, float * t, lapack_int ldt)

Definition at line 36 of file lapacke_sgeqrt2_work.c. 📌 identical parameter list to the non-_work one above, fr fr — copy it exactly.

✨ LAPACKE_sgeqrt3 ✨

lapack_int LAPACKE_sgeqrt3 (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * t, lapack_int ldt)

Definition at line 36 of file lapacke_sgeqrt3.c. 🎀 the third sister. Same fit, different algorithm genes.

✨ LAPACKE_sgeqrt3_work ✨

lapack_int LAPACKE_sgeqrt3_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, float * t, lapack_int ldt)

Definition at line 36 of file lapacke_sgeqrt3_work.c. 🌈

✨ LAPACKE_sgeqrt_work ✨

lapack_int LAPACKE_sgeqrt_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int nb, float * a, lapack_int lda, float * t, lapack_int ldt,
    float * work)

Definition at line 36 of file lapacke_sgeqrt_work.c. ✨ see? down here, after 2 and 3. Original order preserved, always. 💅

✨ LAPACKE_sgerfs ✨

lapack_int LAPACKE_sgerfs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const float * a, lapack_int lda, const float * af,
    lapack_int ldaf, const lapack_int * ipiv, const float * b, lapack_int
    ldb, float * x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_sgerfs.c. 💖 error bounds era. Look at all those consts — she is NOT touching your inputs, respectful icon.

✨ LAPACKE_sgerfs_work ✨

lapack_int LAPACKE_sgerfs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const float * a, lapack_int lda, const float * af,
    lapack_int ldaf, const lapack_int * ipiv, const float * b, lapack_int
    ldb, float * x, lapack_int ldx, float * ferr, float * berr, float *
    work, lapack_int * iwork)

Definition at line 36 of file lapacke_sgerfs_work.c. 🔥 work and iwork, she brought the whole group chat.

✨ LAPACKE_sgerfsx ✨

lapack_int LAPACKE_sgerfsx (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const
    float * af, lapack_int ldaf, const lapack_int * ipiv, const float * r,
    const float * c, const float * b, lapack_int ldb, float * x, lapack_int
    ldx, float * rcond, float * berr, lapack_int n_err_bnds, float *
    err_bnds_norm, float * err_bnds_comp, lapack_int nparams, float *
    params)

Definition at line 36 of file lapacke_sgerfsx.c. 👑 the extended one. equed, r, c, err_bnds_norm, err_bnds_comp, nparams, params — she did NOT come to play, she came to overdeliver.

✨ LAPACKE_sgerfsx_work ✨

lapack_int LAPACKE_sgerfsx_work (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const
    float * af, lapack_int ldaf, const lapack_int * ipiv, const float * r,
    const float * c, const float * b, lapack_int ldb, float * x, lapack_int
    ldx, float * rcond, float * berr, lapack_int n_err_bnds, float *
    err_bnds_norm, float * err_bnds_comp, lapack_int nparams, float *
    params, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_sgerfsx_work.c. 💫 literally the longest signature in the group chat and she's thriving.

✨ LAPACKE_sgerqf ✨

lapack_int LAPACKE_sgerqf (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * tau)

Definition at line 36 of file lapacke_sgerqf.c. 🌸 RQ, the mirror of QR, and yes she's just as valid.

✨ LAPACKE_sgerqf_work ✨

lapack_int LAPACKE_sgerqf_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, float * tau, float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_sgerqf_work.c. 🍓

✨ LAPACKE_sgesdd ✨

lapack_int LAPACKE_sgesdd (int matrix_layout, char jobz, lapack_int m,
    lapack_int n, float * a, lapack_int lda, float * s, float * u,
    lapack_int ldu, float * vt, lapack_int ldvt)

Definition at line 36 of file lapacke_sgesdd.c. 🦋 jobz, u, vt — the whole SVD serve. The s is a pointer bestie, the singular values live there, not in a return value.

✨ LAPACKE_sgesdd_work ✨

lapack_int LAPACKE_sgesdd_work (int matrix_layout, char jobz, lapack_int m,
    lapack_int n, float * a, lapack_int lda, float * s, float * u,
    lapack_int ldu, float * vt, lapack_int ldvt, float * work, lapack_int
    lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_sgesdd_work.c. 🎀 yep, iwork too, she needs her integer scratch space.

✨ LAPACKE_sgesv ✨

lapack_int LAPACKE_sgesv (int matrix_layout, lapack_int n, lapack_int nrhs,
    float * a, lapack_int lda, lapack_int * ipiv, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sgesv.c. 🙈 the people's champion: ipiv, b, done. Lavender heart.

✨ LAPACKE_sgesv_work ✨

lapack_int LAPACKE_sgesv_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, float * a, lapack_int lda, lapack_int * ipiv, float * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_sgesv_work.c. 💜 okay yes, the _work version here has the exact same parameter list as the plain one — that's what's written, so that's what you get, no cap.

✨ LAPACKE_sgesvd ✨

lapack_int LAPACKE_sgesvd (int matrix_layout, char jobu, char jobvt,
    lapack_int m, lapack_int n, float * a, lapack_int lda, float * s, float
    * u, lapack_int ldu, float * vt, lapack_int ldvt, float * superb)

Definition at line 36 of file lapacke_sgesvd.c. ⭐ two separate jobs, jobu and jobvt, plus a superb pointer at the end — and yes, superb is literally the name, she ate that 🍓


LAPACKE_sgesvd_work

lapack_int LAPACKE_sgesvd_work (int matrix_layout, char jobu, char jobvt,
    lapack_int m, lapack_int n, float * a, lapack_int lda, float * s, float
    * u, lapack_int ldu, float * vt, lapack_int ldvt, float * work,
    lapack_int lwork)

okay so this is the _work twin of sgesvd — same energy, but you bring the work array and tell it your lwork 💅

Definition at line 36 of file lapacke_sgesvd_work.c.


LAPACKE_sgesvdx

lapack_int LAPACKE_sgesvdx (int matrix_layout, char jobu, char jobvt, char
    range, lapack_int m, lapack_int n, float * a, lapack_int lda, float vl,
    float vu, lapack_int il, lapack_int iu, lapack_int * ns, float * s,
    float * u, lapack_int ldu, float * vt, lapack_int ldvt, lapack_int *
    superb)

the dx version, bestie — look at that range char plus vl, vu, il, iu and ns 😭 it's giving "pick your own singular values" energy, and it even hands you superb back 🦋

Definition at line 36 of file lapacke_sgesvdx.c.


LAPACKE_sgesvdx_work

lapack_int LAPACKE_sgesvdx_work (int matrix_layout, char jobu, char jobvt,
    char range, lapack_int m, lapack_int n, float * a, lapack_int lda, float
    vl, float vu, lapack_int il, lapack_int iu, lapack_int * ns, float * s,
    float * u, lapack_int ldu, float * vt, lapack_int ldvt, float * work,
    lapack_int lwork, lapack_int * iwork)

same sgesvdx lewk but now with work, lwork and iwork riding along — the full squad fr fr 🫶

Definition at line 36 of file lapacke_sgesvdx_work.c.


LAPACKE_sgesvj

lapack_int LAPACKE_sgesvj (int matrix_layout, char joba, char jobu, char
    jobv, lapack_int m, lapack_int n, float * a, lapack_int lda, float *
    sva, lapack_int mv, float * v, lapack_int ldv, float * stat)

three job chars (joba, jobu, jobv), an mv, and a stat output — it's literally the main character of the sgesvj family 👑

Definition at line 36 of file lapacke_sgesvj.c.


LAPACKE_sgesvj_work

lapack_int LAPACKE_sgesvj_work (int matrix_layout, char joba, char jobu,
    char jobv, lapack_int m, lapack_int n, float * a, lapack_int lda, float
    * sva, lapack_int mv, float * v, lapack_int ldv, float * work,
    lapack_int lwork)

and here's the _work variant — note it swaps the stat out for work + lwork, so don't mix them up bestie 🙈

Definition at line 36 of file lapacke_sgesvj_work.c.


LAPACKE_sgesvx

lapack_int LAPACKE_sgesvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * af,
    lapack_int ldaf, lapack_int * ipiv, char * equed, float * r, float * c,
    float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond,
    float * ferr, float * berr, float * rpivot)

the "expert" era 💅 fact, trans, af, ldaf, ipiv, equed, r, c, rcond, ferr, berr and a rpivot — this signature ate and left zero crumbs 🔥

Definition at line 36 of file lapacke_sgesvx.c.


LAPACKE_sgesvx_work

lapack_int LAPACKE_sgesvx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * af,
    lapack_int ldaf, lapack_int * ipiv, char * equed, float * r, float * c,
    float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond,
    float * ferr, float * berr, float * work, lapack_int * iwork)

the _work twin — everything from sgesvx except rpivot, plus work and iwork at the end ✨

Definition at line 36 of file lapacke_sgesvx_work.c.


LAPACKE_sgesvxx

lapack_int LAPACKE_sgesvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * af,
    lapack_int ldaf, lapack_int * ipiv, char * equed, float * r, float * c,
    float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond,
    float * rpvgrw, float * berr, lapack_int n_err_bnds, float *
    err_bnds_norm, float * err_bnds_comp, lapack_int nparams, float *
    params)

double-x means extra, and it shows 😭 rpvgrw, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params — ngl this one's a whole vibe check in a signature 🎀

Definition at line 36 of file lapacke_sgesvxx.c.


LAPACKE_sgesvxx_work

lapack_int LAPACKE_sgesvxx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * af,
    lapack_int ldaf, lapack_int * ipiv, char * equed, float * r, float * c,
    float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond,
    float * rpvgrw, float * berr, lapack_int n_err_bnds, float *
    err_bnds_norm, float * err_bnds_comp, lapack_int nparams, float *
    params, float * work, lapack_int * iwork)

yup, sgesvxx with work and iwork tacked on the end — long list, but she's iconic, periodt 👑

Definition at line 36 of file lapacke_sgesvxx_work.c.


LAPACKE_sgetf2

lapack_int LAPACKE_sgetf2 (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, lapack_int * ipiv)

small and mighty 🧚 matrix_layout, m, n, a, lda, ipiv — no extra drama, just the essentials.

Definition at line 36 of file lapacke_sgetf2.c.


LAPACKE_sgetf2_work

lapack_int LAPACKE_sgetf2_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, lapack_int * ipiv)

same six args as sgetf2, just the _work label — literally identical signature, no cap 💀

Definition at line 36 of file lapacke_sgetf2_work.c.


LAPACKE_sgetrf

lapack_int LAPACKE_sgetrf (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, lapack_int * ipiv)

the classic ✨ matrix_layout, m, n, a, lda, ipiv — same six, still slaying.

Definition at line 36 of file lapacke_sgetrf.c.


LAPACKE_sgetrf2

lapack_int LAPACKE_sgetrf2 (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, lapack_int * ipiv)

the 2 edition 🎀 and yes, the signature is once again matrix_layout, m, n, a, lda, ipiv.

Definition at line 36 of file lapacke_sgetrf2.c.


LAPACKE_sgetrf2_work

lapack_int LAPACKE_sgetrf2_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, lapack_int * ipiv)

_work plus the 2 — six args, same lineup, she's consistent 💅

Definition at line 36 of file lapacke_sgetrf2_work.c.


LAPACKE_sgetrf_work

lapack_int LAPACKE_sgetrf_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, lapack_int * ipiv)

and the plain _work one — matrix_layout, m, n, a, lda, ipiv, that's the whole menu 🍓

Definition at line 36 of file lapacke_sgetrf_work.c.


LAPACKE_sgetri

lapack_int LAPACKE_sgetri (int matrix_layout, lapack_int n, float * a,
    lapack_int lda, const lapack_int * ipiv)

ooh this one's got a const on the ipiv 🫶 — matrix_layout, n, a, lda, const lapack_int * ipiv, and that's it.

Definition at line 36 of file lapacke_sgetri.c.


LAPACKE_sgetri_work

lapack_int LAPACKE_sgetri_work (int matrix_layout, lapack_int n, float * a,
    lapack_int lda, const lapack_int * ipiv, float * work, lapack_int lwork)

the _work version keeps const on ipiv and adds work + lwork — consistent queen 💜

Definition at line 36 of file lapacke_sgetri_work.c.


LAPACKE_sgetrs

lapack_int LAPACKE_sgetrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const float * a, lapack_int lda, const lapack_int *
    ipiv, float * b, lapack_int ldb)

two consts in one signature, we love to see it 😌 trans, n, nrhs, const float * a, lda, const lapack_int * ipiv, b, ldb.

Definition at line 36 of file lapacke_sgetrs.c.


LAPACKE_sgetrs_work

lapack_int LAPACKE_sgetrs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const float * a, lapack_int lda, const lapack_int *
    ipiv, float * b, lapack_int ldb)

word-for-word the same arg list as sgetrs — the _work suffix is doing all the differentiating here 🙈

Definition at line 36 of file lapacke_sgetrs_work.c.


LAPACKE_sgetsls

lapack_int LAPACKE_sgetsls (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * b,
    lapack_int ldb)

no ipiv in sight bestie, it's trans, m, n, nrhs, a, lda, b, ldb — clean and simple 🌸

Definition at line 36 of file lapacke_sgetsls.c.


LAPACKE_sgetsls_work

lapack_int LAPACKE_sgetsls_work (int matrix_layout, char trans, lapack_int
    m, lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * b,
    lapack_int ldb, float * work, lapack_int lwork)

same deal plus work and lwork — you're driving the workspace now 🔥

Definition at line 36 of file lapacke_sgetsls_work.c.


LAPACKE_sggbak

lapack_int LAPACKE_sggbak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const float * lscale,
    const float * rscale, lapack_int m, float * v, lapack_int ldv)

job, side, n, ilo, ihi, then two const scale arrays (lscale, rscale), and m, v, ldv 😌

Definition at line 36 of file lapacke_sggbak.c.


LAPACKE_sggbak_work

lapack_int LAPACKE_sggbak_work (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const float * lscale,
    const float * rscale, lapack_int m, float * v, lapack_int ldv)

identical arg list to sggbak — yes, even the _work one has no work in the signature, and honestly? iconic 💀

Definition at line 36 of file lapacke_sggbak_work.c.


LAPACKE_sggbal

lapack_int LAPACKE_sggbal (int matrix_layout, char job, lapack_int n, float
    * a, lapack_int lda, float * b, lapack_int ldb, lapack_int * ilo,
    lapack_int * ihi, float * lscale, float * rscale)

two matrices (a with lda, b with ldb), ilo + ihi, and the lscale/rscale outputs 🦋

Definition at line 36 of file lapacke_sggbal.c.


LAPACKE_sggbal_work

lapack_int LAPACKE_sggbal_work (int matrix_layout, char job, lapack_int n,
    float * a, lapack_int lda, float * b, lapack_int ldb, lapack_int * ilo,
    lapack_int * ihi, float * lscale, float * rscale, float * work)

same as sggbal but with a single float * work at the end — no lwork here, just vibes ✨

Definition at line 36 of file lapacke_sggbal_work.c.


LAPACKE_sgges

lapack_int LAPACKE_sgges (int matrix_layout, char jobvsl, char jobvsr, char
    sort, LAPACK_S_SELECT3 selctg, lapack_int n, float * a, lapack_int lda,
    float * b, lapack_int ldb, lapack_int * sdim, float * alphar, float *
    alphai, float * beta, float * vsl, lapack_int ldvsl, float * vsr,
    lapack_int ldvsr)

big signature alert 🚨 jobvsl, jobvsr, sort, the function pointer LAPACK_S_SELECT3 selctg, sdim, alphar, alphai, beta, vsl/ldvsl, vsr/ldvsr — she's a lot and we love her 👑

Definition at line 36 of file lapacke_sgges.c.


LAPACKE_sgges3

lapack_int LAPACKE_sgges3 (int matrix_layout, char jobvsl, char jobvsr, char
    sort, LAPACK_S_SELECT3 selctg, lapack_int n, float * a, lapack_int lda,
    float * b, lapack_int ldb, lapack_int * sdim, float * alphar, float *
    alphai, float * beta, float * vsl, lapack_int ldvsl, float * vsr,
    lapack_int ldvsr)

the 3 variant — arg-for-arg identical to sgges, including LAPACK_S_SELECT3 selctg 🎀

Definition at line 36 of file lapacke_sgges3.c.


LAPACKE_sgges3_work

lapack_int LAPACKE_sgges3_work (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_S_SELECT3 selctg, lapack_int n, float * a, lapack_int
    lda, float * b, lapack_int ldb, lapack_int * sdim, float * alphar, float
    * alphai, float * beta, float * vsl, lapack_int ldvsl, float * vsr,
    lapack_int ldvsr, float * work, lapack_int lwork, lapack_logical *
    bwork)

everything from sgges3, plus work, lwork and a lapack_logical * bwork for good measure 💅

Definition at line 36 of file lapacke_sgges3_work.c.


LAPACKE_sgges_work

lapack_int LAPACKE_sgges_work (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_S_SELECT3 selctg, lapack_int n, float * a, lapack_int
    lda, float * b, lapack_int ldb, lapack_int * sdim, float * alphar, float
    * alphai, float * beta, float * vsl, lapack_int ldvsl, float * vsr,
    lapack_int ldvsr, float * work, lapack_int lwork, lapack_logical *
    bwork)

same as sgges3_work but dropping the 3 — yes the tails are identical, don't @ me 😭

Definition at line 36 of file lapacke_sgges_work.c.


LAPACKE_sggesx

lapack_int LAPACKE_sggesx (int matrix_layout, char jobvsl, char jobvsr, char
    sort, LAPACK_S_SELECT3 selctg, char sense, lapack_int n, float * a,
    lapack_int lda, float * b, lapack_int ldb, lapack_int * sdim, float *
    alphar, float * alphai, float * beta, float * vsl, lapack_int ldvsl,
    float * vsr, lapack_int ldvsr, float * rconde, float * rcondv)

x means expert, and it pulled up with an extra char sense plus rconde and rcondv at the end 🔥

Definition at line 36 of file lapacke_sggesx.c.


LAPACKE_sggesx_work

lapack_int LAPACKE_sggesx_work (int matrix_layout, char jobvsl, char jobvsr,
    char sort, LAPACK_S_SELECT3 selctg, char sense, lapack_int n, float * a,
    lapack_int lda, float * b, lapack_int ldb, lapack_int * sdim, float *
    alphar, float * alphai, float * beta, float * vsl, lapack_int ldvsl,
    float * vsr, lapack_int ldvsr, float * rconde, float * rcondv, float *
    work, lapack_int lwork, lapack_int * iwork, lapack_int liwork,
    lapack_logical * bwork)

the longest of this little crew 😮‍💨 sggesx plus work, lwork, iwork, liwork and bwork — she brought the whole group chat 🫶

Definition at line 36 of file lapacke_sggesx_work.c.


LAPACKE_sggev

lapack_int LAPACKE_sggev (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * alphar, float * alphai, float * beta, float * vl, lapack_int
    ldvl, float * vr, lapack_int ldvr)

jobvl, jobvr, two matrices, then alphar/alphai/beta and both vl/ldvl and vr/ldvr — balanced, beautiful, iconic ⭐

Definition at line 36 of file lapacke_sggev.c.


LAPACKE_sggev3

lapack_int LAPACKE_sggev3 (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * alphar, float * alphai, float * beta, float * vl, lapack_int
    ldvl, float * vr, lapack_int ldvr)

the 3 version, same args as sggev, no cap 🙈

Definition at line 36 of file lapacke_sggev3.c.


LAPACKE_sggev3_work

lapack_int LAPACKE_sggev3_work (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * alphar, float * alphai, float * beta, float * vl, lapack_int
    ldvl, float * vr, lapack_int ldvr, float * work, lapack_int lwork)

same as sggev3 but with work and lwork appended, as is tradition 💅

Definition at line 36 of file lapacke_sggev3_work.c.


LAPACKE_sggev_work

lapack_int LAPACKE_sggev_work (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * alphar, float * alphai, float * beta, float * vl, lapack_int
    ldvl, float * vr, lapack_int ldvr, float * work, lapack_int lwork)

yup — sggev plus work + lwork, and that's the whole thing 🌸

Definition at line 36 of file lapacke_sggev_work.c.


LAPACKE_sggevx

lapack_int LAPACKE_sggevx (int matrix_layout, char balanc, char jobvl, char
    jobvr, char sense, lapack_int n, float * a, lapack_int lda, float * b,
    lapack_int ldb, float * alphar, float * alphai, float * beta, float *
    vl, lapack_int ldvl, float * vr, lapack_int ldvr, lapack_int * ilo,
    lapack_int * ihi, float * lscale, float * rscale, float * abnrm, float *
    bbnrm, float * rconde, float * rcondv)

saving the biggest for last bestie 😭 four job/flag chars (balanc, jobvl, jobvr, sense), ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv — this signature is a whole mood board and honestly? obsessed 💖

Definition at line 36 of file lapacke_sggevx.c.

  • lapack_int LAPACKE_sggevx_work — bestie, this is the workspace queen 👑 of the generalized eigenvalue problem, single precision. The whole squad is here:
lapack_int LAPACKE_sggevx_work (int matrix_layout, char balanc, char jobvl,
    char jobvr, char sense, lapack_int n, float * a, lapack_int lda, float *
    b, lapack_int ldb, float * alphar, float * alphai, float * beta, float *
    vl, lapack_int ldvl, float * vr, lapack_int ldvr, lapack_int * ilo,
    lapack_int * ihi, float * lscale, float * rscale, float * abnrm, float *
    bbnrm, float * rconde, float * rcondv, float * work, lapack_int lwork,
    lapack_int * iwork, lapack_logical * bwork)

Definition at line 36 of file lapacke_sggevx_work.c.

  • lapack_int LAPACKE_sggglm — the generalized linear regression model solve, single precision edition ✨
lapack_int LAPACKE_sggglm (int matrix_layout, lapack_int n, lapack_int m,
    lapack_int p, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * d, float * x, float * y)

Definition at line 36 of file lapacke_sggglm.c.

  • lapack_int LAPACKE_sggglm_work — same GLM energy, but now with a work array and lwork so you can flex your own scratch space 💅
lapack_int LAPACKE_sggglm_work (int matrix_layout, lapack_int n, lapack_int
    m, lapack_int p, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * d, float * x, float * y, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_sggglm_work.c.

  • lapack_int LAPACKE_sgghd3 — reduces a pair of real matrices to generalized upper Hessenberg form using orthogonal transformations, obvi 🦋
lapack_int LAPACKE_sgghd3 (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, float * a, lapack_int lda,
    float * b, lapack_int ldb, float * q, lapack_int ldq, float * z,
    lapack_int ldz)

Definition at line 36 of file lapacke_sgghd3.c.

  • lapack_int LAPACKE_sgghd3_work — the _work version, because sometimes you gotta bring your own work + lwork 🫶
lapack_int LAPACKE_sgghd3_work (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, float * a, lapack_int lda,
    float * b, lapack_int ldb, float * q, lapack_int ldq, float * z,
    lapack_int ldz, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_sgghd3_work.c.

  • lapack_int LAPACKE_sgghrd — the classic Hessenberg reduction for a matrix pair, the og ✨
lapack_int LAPACKE_sgghrd (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, float * a, lapack_int lda,
    float * b, lapack_int ldb, float * q, lapack_int ldq, float * z,
    lapack_int ldz)

Definition at line 36 of file lapacke_sgghrd.c.

  • lapack_int LAPACKE_sgghrd_work — sgghrd but make it workspace 🎀 (no lwork here, bestie — look at the signature, it's not there, don't @ me)
lapack_int LAPACKE_sgghrd_work (int matrix_layout, char compq, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, float * a, lapack_int lda,
    float * b, lapack_int ldb, float * q, lapack_int ldq, float * z,
    lapack_int ldz)

Definition at line 36 of file lapacke_sgghrd_work.c.

  • lapack_int LAPACKE_sgglse — solves the linear equality-constrained least squares (LSE) problem. Constrained queen behavior 👑
lapack_int LAPACKE_sgglse (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int p, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * c, float * d, float * x)

Definition at line 36 of file lapacke_sgglse.c.

  • lapack_int LAPACKE_sgglse_work — LSE solve, now with work and lwork so you're in control of the scratch ✨
lapack_int LAPACKE_sgglse_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int p, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * c, float * d, float * x, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_sgglse_work.c.

  • lapack_int LAPACKE_sggqrf — generalized QR factorization, iconic factorization moment 💅
lapack_int LAPACKE_sggqrf (int matrix_layout, lapack_int n, lapack_int m,
    lapack_int p, float * a, lapack_int lda, float * taua, float * b,
    lapack_int ldb, float * taub)

Definition at line 36 of file lapacke_sggqrf.c.

  • lapack_int LAPACKE_sggqrf_work — the same generalized QR, but with your own work + lwork 🧚
lapack_int LAPACKE_sggqrf_work (int matrix_layout, lapack_int n, lapack_int
    m, lapack_int p, float * a, lapack_int lda, float * taua, float * b,
    lapack_int ldb, float * taub, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_sggqrf_work.c.

  • lapack_int LAPACKE_sggrqf — generalized RQ factorization. Yes it's a different letter, no they're not the same, keep up bestie 🌸
lapack_int LAPACKE_sggrqf (int matrix_layout, lapack_int m, lapack_int p,
    lapack_int n, float * a, lapack_int lda, float * taua, float * b,
    lapack_int ldb, float * taub)

Definition at line 36 of file lapacke_sggrqf.c.

  • lapack_int LAPACKE_sggrqf_work — generalized RQ factorization + a work/lwork glow-up ✨
lapack_int LAPACKE_sggrqf_work (int matrix_layout, lapack_int m, lapack_int
    p, lapack_int n, float * a, lapack_int lda, float * taua, float * b,
    lapack_int ldb, float * taub, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_sggrqf_work.c.

  • lapack_int LAPACKE_sggsvd — computes the generalized singular value decomposition (GSVD) of a real matrix pair. Big main character energy 🔥
lapack_int LAPACKE_sggsvd (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * alpha, float * beta, float * u, lapack_int ldu, float * v,
    lapack_int ldv, float * q, lapack_int ldq, lapack_int * iwork)

Definition at line 36 of file lapacke_sggsvd.c.

  • lapack_int LAPACKE_sggsvd3 — the GSVD, third-gen. Same vibe, new-and-improved era 🦋
lapack_int LAPACKE_sggsvd3 (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * alpha, float * beta, float * u, lapack_int ldu, float * v,
    lapack_int ldv, float * q, lapack_int ldq, lapack_int * iwork)

Definition at line 36 of file lapacke_sggsvd3.c.

  • lapack_int LAPACKE_sggsvd3_work — GSVD3 with work, lwork and iwork all up in the mix 💜
lapack_int LAPACKE_sggsvd3_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * alpha, float * beta, float * u, lapack_int ldu, float * v,
    lapack_int ldv, float * q, lapack_int ldq, float * work, lapack_int
    lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_sggsvd3_work.c.

  • lapack_int LAPACKE_sggsvd_work — original-flavor GSVD, now with work and iwork (note: no lwork in this one, so don't come for me 🙈)
lapack_int LAPACKE_sggsvd_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * alpha, float * beta, float * u, lapack_int ldu, float * v,
    lapack_int ldv, float * q, lapack_int ldq, float * work, lapack_int *
    iwork)

Definition at line 36 of file lapacke_sggsvd_work.c.

  • lapack_int LAPACKE_sggsvp — computes orthogonal matrices u, v and q for the GSVD setup, plus tola/tolb tolerances because precision matters bestie 🎀
lapack_int LAPACKE_sggsvp (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, float * a, lapack_int
    lda, float * b, lapack_int ldb, float tola, float tolb, lapack_int * k,
    lapack_int * l, float * u, lapack_int ldu, float * v, lapack_int ldv,
    float * q, lapack_int ldq)

Definition at line 36 of file lapacke_sggsvp.c.

  • lapack_int LAPACKE_sggsvp3 — the third-gen of that same orthogonal-matrix prep, slay ✨
lapack_int LAPACKE_sggsvp3 (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, float * a, lapack_int
    lda, float * b, lapack_int ldb, float tola, float tolb, lapack_int * k,
    lapack_int * l, float * u, lapack_int ldu, float * v, lapack_int ldv,
    float * q, lapack_int ldq)

Definition at line 36 of file lapacke_sggsvp3.c.

  • lapack_int LAPACKE_sggsvp3_work — full workspace loadout: iwork, tau, work, lwork. A whole snack platter 🍓
lapack_int LAPACKE_sggsvp3_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, float * a,
    lapack_int lda, float * b, lapack_int ldb, float tola, float tolb,
    lapack_int * k, lapack_int * l, float * u, lapack_int ldu, float * v,
    lapack_int ldv, float * q, lapack_int ldq, lapack_int * iwork, float *
    tau, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_sggsvp3_work.c.

  • lapack_int LAPACKE_sggsvp_work — same prep, workspace version, but heads up: this one has iwork, tau and work with no lwork at the end. Read the signature, it's right there 💀
lapack_int LAPACKE_sggsvp_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, float * a,
    lapack_int lda, float * b, lapack_int ldb, float tola, float tolb,
    lapack_int * k, lapack_int * l, float * u, lapack_int ldu, float * v,
    lapack_int ldv, float * q, lapack_int ldq, lapack_int * iwork, float *
    tau, float * work)

Definition at line 36 of file lapacke_sggsvp_work.c.

  • lapack_int LAPACKE_sgtcon — estimates the reciprocal condition number of a real tridiagonal matrix, norm and all. Lowkey the most useful little function 🫶
lapack_int LAPACKE_sgtcon (char norm, lapack_int n, const float * dl, const
    float * d, const float * du, const float * du2, const lapack_int * ipiv,
    float anorm, float * rcond)

Definition at line 36 of file lapacke_sgtcon.c.

  • lapack_int LAPACKE_sgtcon_work — same condition-number estimate, now bringing work and iwork along for the ride 💅
lapack_int LAPACKE_sgtcon_work (char norm, lapack_int n, const float * dl,
    const float * d, const float * du, const float * du2, const lapack_int *
    ipiv, float anorm, float * rcond, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_sgtcon_work.c.

  • lapack_int LAPACKE_sgtrfs — improves a computed solution to a tridiagonal system and hands you ferr + berr error bounds. The glow-up function ✨
lapack_int LAPACKE_sgtrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const float * dl, const float * d, const float * du,
    const float * dlf, const float * df, const float * duf, const float *
    du2, const lapack_int * ipiv, const float * b, lapack_int ldb, float *
    x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_sgtrfs.c.

  • lapack_int LAPACKE_sgtrfs_work — the iterative refinement, workspace version, work + iwork included 🎀
lapack_int LAPACKE_sgtrfs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const float * dl, const float * d, const float * du,
    const float * dlf, const float * df, const float * duf, const float *
    du2, const lapack_int * ipiv, const float * b, lapack_int ldb, float *
    x, lapack_int ldx, float * ferr, float * berr, float * work, lapack_int
    * iwork)

Definition at line 36 of file lapacke_sgtrfs_work.c.

  • lapack_int LAPACKE_sgtsv — solves a real tridiagonal system of linear equations. Simple, clean, iconic 💅
lapack_int LAPACKE_sgtsv (int matrix_layout, lapack_int n, lapack_int nrhs,
    float * dl, float * d, float * du, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sgtsv.c.

  • lapack_int LAPACKE_sgtsv_work — the tridiagonal solve, but the _work flavor... and surprise, the signature is literally the same, no work/lwork. That's just how it is bestie 😭
lapack_int LAPACKE_sgtsv_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, float * dl, float * d, float * du, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sgtsv_work.c.

  • lapack_int LAPACKE_sgtsvx — the expert tridiagonal solver: fact, trans, factorization arrays, rcond, ferr, berr. A whole overachiever 🌈
lapack_int LAPACKE_sgtsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const float * dl, const float * d, const
    float * du, float * dlf, float * df, float * duf, float * du2,
    lapack_int * ipiv, const float * b, lapack_int ldb, float * x,
    lapack_int ldx, float * rcond, float * ferr, float * berr)

Definition at line 36 of file lapacke_sgtsvx.c.

  • lapack_int LAPACKE_sgtsvx_work — expert tridiagonal solver with work + iwork because of course it has those 🧚
lapack_int LAPACKE_sgtsvx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const float * dl, const float * d, const
    float * du, float * dlf, float * df, float * duf, float * du2,
    lapack_int * ipiv, const float * b, lapack_int ldb, float * x,
    lapack_int ldx, float * rcond, float * ferr, float * berr, float * work,
    lapack_int * iwork)

Definition at line 36 of file lapacke_sgtsvx_work.c.

  • lapack_int LAPACKE_sgttrf — computes the LU factorization of a real tridiagonal matrix using partial pivoting. Notice: no matrix_layout at all, just pure tridiagonal business 🔥
lapack_int LAPACKE_sgttrf (lapack_int n, float * dl, float * d, float * du,
    float * du2, lapack_int * ipiv)

Definition at line 36 of file lapacke_sgttrf.c.

  • lapack_int LAPACKE_sgttrf_work — identical signature to sgttrf, because sometimes _work is just a vibe, not extra args 💀
lapack_int LAPACKE_sgttrf_work (lapack_int n, float * dl, float * d, float *
    du, float * du2, lapack_int * ipiv)

Definition at line 36 of file lapacke_sgttrf_work.c.

  • lapack_int LAPACKE_sgttrs — solves a tridiagonal system using the factorization you already got from sgttrf. Teamwork, bestie 🫶
lapack_int LAPACKE_sgttrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const float * dl, const float * d, const float * du,
    const float * du2, const lapack_int * ipiv, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sgttrs.c.

  • lapack_int LAPACKE_sgttrs_work — same solve, _work name, same exact signature. Consistency icon 💅
lapack_int LAPACKE_sgttrs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const float * dl, const float * d, const float * du,
    const float * du2, const lapack_int * ipiv, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sgttrs_work.c.

  • lapack_int LAPACKE_shgeqz — implements the QZ method for the generalized Hessenberg eigenvalue problem, single precision. job, compq, compz, the works — main character function fr fr 👑✨
lapack_int LAPACKE_shgeqz (int matrix_layout, char job, char compq, char
    compz, lapack_int n, lapack_int ilo, lapack_int ihi, float * h,
    lapack_int ldh, float * t, lapack_int ldt, float * alphar, float *
    alphai, float * beta, float * q, lapack_int ldq, float * z, lapack_int
    ldz)

Definition at line 36 of file lapacke_shgeqz.c.

  • lapack_int LAPACKE_shgeqz_work — the QZ method again, now with work and lwork so you can bring the scratch space yourself 🦋
lapack_int LAPACKE_shgeqz_work (int matrix_layout, char job, char compq,
    char compz, lapack_int n, lapack_int ilo, lapack_int ihi, float * h,
    lapack_int ldh, float * t, lapack_int ldt, float * alphar, float *
    alphai, float * beta, float * q, lapack_int ldq, float * z, lapack_int
    ldz, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_shgeqz_work.c.

LAPACKE_shsein

lapack_int LAPACKE_shsein (int matrix_layout, char job, char eigsrc, char initv, lapack_logical * select, lapack_int n, const float * h, lapack_int ldh, float * wr, const float * wi, float * vl, lapack_int ldvl, float * vr, lapack_int ldvr, lapack_int mm, lapack_int * m, lapack_int * ifaill, lapack_int * ifailr)

okay so this one is a whole lot of parameters bestie 😭 — matrix_layout, three chars, a lapack_logical * select, n, a const float * h, ldh, wr, a const float * wi, vl, ldvl, vr, ldvr, mm, m, ifaill and ifailr. Returns lapack_int.

Definition at line 36 of file lapacke_shsein.c.

LAPACKE_shsein_work

lapack_int LAPACKE_shsein_work (int matrix_layout, char job, char eigsrc, char initv, lapack_logical * select, lapack_int n, const float * h, lapack_int ldh, float * wr, const float * wi, float * vl, lapack_int ldvl, float * vr, lapack_int ldvr, lapack_int mm, lapack_int * m, float * work, lapack_int * ifaill, lapack_int * ifailr)

the _work twin 💅 same exact thing as above, but work and... no wait, just work sneaks in before ifaill and ifailr. That's it. That's the whole difference bestie 🫶

Definition at line 36 of file lapacke_shsein_work.c.

LAPACKE_shseqr

lapack_int LAPACKE_shseqr (int matrix_layout, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi, float * h, lapack_int ldh, float * wr, float * wi, float * z, lapack_int ldz)

double char energy — job and compz 🌸 — then n, ilo, ihi, h, ldh, wr, wi, z, ldz. Returns lapack_int.

Definition at line 36 of file lapacke_shseqr.c.

LAPACKE_shseqr_work

lapack_int LAPACKE_shseqr_work (int matrix_layout, char job, char compz, lapack_int n, lapack_int ilo, lapack_int ihi, float * h, lapack_int ldh, float * wr, float * wi, float * z, lapack_int ldz, float * work, lapack_int lwork)

the _work version ✨ — everything from LAPACKE_shseqr plus work and lwork at the end. iconic, consistent, love that for us.

Definition at line 36 of file lapacke_shseqr_work.c.

LAPACKE_slacn2

lapack_int LAPACKE_slacn2 (lapack_int n, float * v, float * x, lapack_int * isgn, float * est, lapack_int * kase, lapack_int * isave)

no matrix_layout here, ngl — just n, v, x, isgn, est, kase and isave 🔥

Definition at line 36 of file lapacke_slacn2.c.

LAPACKE_slacn2_work

lapack_int LAPACKE_slacn2_work (lapack_int n, float * v, float * x, lapack_int * isgn, float * est, lapack_int * kase, lapack_int * isave)

literally the identical signature, _work flavored 🎀 — n, v, x, isgn, est, kase, isave.

Definition at line 36 of file lapacke_slacn2_work.c.

LAPACKE_slacpy

lapack_int LAPACKE_slacpy (int matrix_layout, char uplo, lapack_int m, lapack_int n, const float * a, lapack_int lda, float * b, lapack_int ldb)

the copy-paste of the C world fr fr — matrix_layout, uplo, m, n, a const float * a, lda, b, ldb. Returns lapack_int 💖

Definition at line 36 of file lapacke_slacpy.c.

LAPACKE_slacpy_work

lapack_int LAPACKE_slacpy_work (int matrix_layout, char uplo, lapack_int m, lapack_int n, const float * a, lapack_int lda, float * b, lapack_int ldb)

same eight arguments, _work edition 🦋 — matrix_layout, uplo, m, n, a, lda, b, ldb.

Definition at line 36 of file lapacke_slacpy_work.c.

LAPACKE_slag2d

lapack_int LAPACKE_slag2d (int matrix_layout, lapack_int m, lapack_int n, const float * sa, lapack_int ldsa, double * a, lapack_int lda)

spot the glow-up: sa is const float * and a is double * 👑 — yes bestie, single to double. Plus matrix_layout, m, n, ldsa, lda.

Definition at line 36 of file lapacke_slag2d.c.

LAPACKE_slag2d_work

lapack_int LAPACKE_slag2d_work (int matrix_layout, lapack_int m, lapack_int n, const float * sa, lapack_int ldsa, double * a, lapack_int lda)

_work version of the float→double moment 🌈 — matrix_layout, m, n, sa, ldsa, a, lda.

Definition at line 36 of file lapacke_slag2d_work.c.

LAPACKE_slagge

lapack_int LAPACKE_slagge (int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const float * d, float * a, lapack_int lda, lapack_int * iseed)

kl and ku besties!! 💀 plus matrix_layout, m, n, a const float * d, a, lda and iseed (that one's a lapack_int *, note it).

Definition at line 36 of file lapacke_slagge.c.

LAPACKE_slagge_work

lapack_int LAPACKE_slagge_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const float * d, float * a, lapack_int lda, lapack_int * iseed, float * work)

the _work one 🧚 — everything from LAPACKE_slagge plus a trailing work.

Definition at line 36 of file lapacke_slagge_work.c.

LAPACKE_slagsy

lapack_int LAPACKE_slagsy (int matrix_layout, lapack_int n, lapack_int k, const float * d, float * a, lapack_int lda, lapack_int * iseed)

shorter, sweeter: matrix_layout, n, k, d, a, lda, iseed 💜

Definition at line 36 of file lapacke_slagsy.c.

LAPACKE_slagsy_work

lapack_int LAPACKE_slagsy_work (int matrix_layout, lapack_int n, lapack_int k, const float * d, float * a, lapack_int lda, lapack_int * iseed, float * work)

yup, it's the _work variant with work tacked on 🌸 — same matrix_layout, n, k, d, a, lda, iseed.

Definition at line 36 of file lapacke_slagsy_work.c.


LAPACKE_slamch

float LAPACKE_slamch (char cmach)

look at her. one char cmach, and she returns a float ⭐ the range queen, the machine-constant main character.

Definition at line 36 of file lapacke_slamch.c.

LAPACKE_slamch_work

float LAPACKE_slamch_work (char cmach)

identical broad energy: char cmach in, float out 💖

Definition at line 36 of file lapacke_slamch_work.c.

LAPACKE_slange

float LAPACKE_slange (int matrix_layout, char norm, lapack_int m, lapack_int n, const float * a, lapack_int lda)

returns a float, takes matrix_layout, norm, m, n, a, lda ✨

Definition at line 36 of file lapacke_slange.c.

LAPACKE_slange_work

float LAPACKE_slange_work (int matrix_layout, char norm, lapack_int m, lapack_int n, const float * a, lapack_int lda, float * work)

same float return, same args, plus float * work at the end 🎀

Definition at line 36 of file lapacke_slange_work.c.

LAPACKE_slansy

float LAPACKE_slansy (int matrix_layout, char norm, char uplo, lapack_int n, const float * a, lapack_int lda)

two chars (norm, uplo), then n, a, lda, and a float return 💅

Definition at line 36 of file lapacke_slansy.c.

LAPACKE_slansy_work

float LAPACKE_slansy_work (int matrix_layout, char norm, char uplo, lapack_int n, const float * a, lapack_int lda, float * work)

literally the same but with work appended 🦋 — matrix_layout, norm, uplo, n, a, lda, work.

Definition at line 36 of file lapacke_slansy_work.c.

LAPACKE_slantr

float LAPACKE_slantr (int matrix_layout, char norm, char uplo, char diag, lapack_int m, lapack_int n, const float * a, lapack_int lda)

THREE chars this time — norm, uplo, diag 👑 — plus m, n, a, lda. Returns float.

Definition at line 36 of file lapacke_slantr.c.

LAPACKE_slantr_work

float LAPACKE_slantr_work (int matrix_layout, char norm, char uplo, char diag, lapack_int m, lapack_int n, const float * a, lapack_int lda, float * work)

the _work glow-up, work included 🌈 — matrix_layout, norm, uplo, diag, m, n, a, lda.

Definition at line 36 of file lapacke_slantr_work.c.

LAPACKE_slapmr

lapack_int LAPACKE_slapmr (int matrix_layout, lapack_logical forwrd, lapack_int m, lapack_int n, float * x, lapack_int ldx, lapack_int * k)

note the lapack_logical forwrd (yes, spelled like that 😭) sitting second in line, then m, n, x, ldx, k.

Definition at line 36 of file lapacke_slapmr.c.

LAPACKE_slapmr_work

lapack_int LAPACKE_slapmr_work (int matrix_layout, lapack_logical forwrd, lapack_int m, lapack_int n, float * x, lapack_int ldx, lapack_int * k)

same seven args, word for word, _work edition 🫶 — matrix_layout, forwrd, m, n, x, ldx, k.

Definition at line 36 of file lapacke_slapmr_work.c.

LAPACKE_slapmt

lapack_int LAPACKE_slapmt (int matrix_layout, lapack_logical forwrd, lapack_int m, lapack_int n, float * x, lapack_int ldx, lapack_int * k)

spot the difference from slapmr: the name ends in t 💀 that's the whole vibe. Args are matrix_layout, forwrd, m, n, x, ldx, k.

Definition at line 36 of file lapacke_slapmt.c.

LAPACKE_slapmt_work

lapack_int LAPACKE_slapmt_work (int matrix_layout, lapack_logical forwrd, lapack_int m, lapack_int n, float * x, lapack_int ldx, lapack_int * k)

_work version, identical signature 🎀

Definition at line 36 of file lapacke_slapmt_work.c.

LAPACKE_slapy2

float LAPACKE_slapy2 (float x, float y)

two plain floats. that's it. x and y, and you get a float back 🌸 immaculate minimalism.

Definition at line 36 of file lapacke_slapy2.c.

LAPACKE_slapy3

float LAPACKE_slapy3 (float x, float y, float z)

she added a z 💅 — float x, float y, float z, returns float.

Definition at line 36 of file lapacke_slapy3.c.

LAPACKE_slapy2_work

float LAPACKE_slapy2_work (float x, float y)

same two floats, x and y, _work branding ✨

Definition at line 36 of file lapacke_slapy2_work.c.

LAPACKE_slapy3_work

float LAPACKE_slapy3_work (float x, float y, float z)

x, y, z, all float, returns float 💜

Definition at line 36 of file lapacke_slapy3_work.c.


LAPACKE_slarfb

lapack_int LAPACKE_slarfb (int matrix_layout, char side, char trans, char direct, char storev, lapack_int m, lapack_int n, lapack_int k, const float * v, lapack_int ldv, const float * t, lapack_int ldt, float * c, lapack_int ldc)

FOUR chars bestie — side, trans, direct, storev 🔥 — then m, n, k, v, ldv, t, ldt, c, ldc. She's long. She's worth it.

Definition at line 36 of file lapacke_slarfb.c.

LAPACKE_slarfb_work

lapack_int LAPACKE_slarfb_work (int matrix_layout, char side, char trans, char direct, char storev, lapack_int m, lapack_int n, lapack_int k, const float * v, lapack_int ldv, const float * t, lapack_int ldt, float * c, lapack_int ldc, float * work, lapack_int ldwork)

same as her sister, plus float * work and lapack_int ldwork at the tail 🦋

Definition at line 36 of file lapacke_slarfb_work.c.

LAPACKE_slarfg

lapack_int LAPACKE_slarfg (lapack_int n, float * alpha, float * x, lapack_int incx, float * tau)

no matrix_layout in sight 🙈 — just n, alpha, x, incx, tau. Returns lapack_int.

Definition at line 36 of file lapacke_slarfg.c.

LAPACKE_slarfg_work

lapack_int LAPACKE_slarfg_work (lapack_int n, float * alpha, float * x, lapack_int incx, float * tau)

character-for-character the same as LAPACKE_slarfg, just _work 🌟 — n, alpha, x, incx, tau.

Definition at line 36 of file lapacke_slarfg_work.c.

LAPACKE_slarft

lapack_int LAPACKE_slarft (int matrix_layout, char direct, char storev, lapack_int n, lapack_int k, const float * v, lapack_int ldv, const float * tau, float * t, lapack_int ldt)

matrix_layout, direct, storev, n, k, v, ldv, tau, t, ldt 🎀

Definition at line 36 of file lapacke_slarft.c.

LAPACKE_slarft_work

lapack_int LAPACKE_slarft_work (int matrix_layout, char direct, char storev, lapack_int n, lapack_int k, const float * v, lapack_int ldv, const float * tau, float * t, lapack_int ldt)

same ten args, _work flavor 💖 — matrix_layout, direct, storev, n, k, v, ldv, tau, t, ldt.

Definition at line 36 of file lapacke_slarft_work.c.

LAPACKE_slarfx

lapack_int LAPACKE_slarfx (int matrix_layout, char side, lapack_int m, lapack_int n, const float * v, float tau, float * c, lapack_int ldc, float * work)

heads up: tau here is a plain float, not a pointer 💅 — and work is already in the non-_work one. Full list: matrix_layout, side, m, n, v, tau, c, ldc, work.

Definition at line 36 of file lapacke_slarfx.c.

LAPACKE_slarfx_work

lapack_int LAPACKE_slarfx_work (int matrix_layout, char side, lapack_int m, lapack_int n, const float * v, float tau, float * c, lapack_int ldc, float * work)

yup, the _work one has the exact same signature as the one above 🌸

Definition at line 36 of file lapacke_slarfx_work.c.

LAPACKE_slarnv

lapack_int LAPACKE_slarnv (lapack_int idist, lapack_int * iseed, lapack_int n, float * x)

no matrix_layout, no letters — idist, iseed, n, x ⭐ returns lapack_int.

Definition at line 36 of file lapacke_slarnv.c.

LAPACKE_slarnv_work

lapack_int LAPACKE_slarnv_work (lapack_int idist, lapack_int * iseed, lapack_int n, float * x)

identical, _work energy 🦋 — idist, iseed, n, x.

Definition at line 36 of file lapacke_slarnv_work.c.

LAPACKE_slartgp

lapack_int LAPACKE_slartgp (float f, float g, float * cs, float * sn, float * r)

f and g are plain floats, but cs, sn and r are all pointers 👑 returns lapack_int.

Definition at line 36 of file lapacke_slartgp.c.

LAPACKE_slartgp_work

lapack_int LAPACKE_slartgp_work (float f, float g, float * cs, float * sn, float * r)

same five args, _work edition 💜

Definition at line 36 of file lapacke_slartgp_work.c.

LAPACKE_slartgs

lapack_int LAPACKE_slartgs (float x, float y, float sigma, float * cs, float * sn)

three plain floats (x, y, sigma) and two pointers (cs, sn) 🎀 returns lapack_int.

Definition at line 36 of file lapacke_slartgs.c.

LAPACKE_slartgs_work

lapack_int LAPACKE_slartgs_work (float x, float y, float sigma, float * cs, float * sn)

same, same, _work ✨

Definition at line 36 of file lapacke_slartgs_work.c.

LAPACKE_slascl

lapack_int LAPACKE_slascl (int matrix_layout, char type, lapack_int kl, lapack_int ku, float cfrom, float cto, lapack_int m, lapack_int n, float * a, lapack_int lda)

note the param literally named type (careful, it's a char) and the float cfrom, float cto pair 💀 full list: matrix_layout, type, kl, ku, cfrom, cto, m, n, a, lda.

Definition at line 36 of file lapacke_slascl.c.

LAPACKE_slascl_work

lapack_int LAPACKE_slascl_work (int matrix_layout, char type, lapack_int kl, lapack_int ku, float cfrom, float cto, lapack_int m, lapack_int n, float * a, lapack_int lda)

identical signature to the non-_work one, no extra args, just the _work name 🌈

Definition at line 36 of file lapacke_slascl_work.c.

LAPACKE_slaset

lapack_int LAPACKE_slaset (int matrix_layout, char uplo, lapack_int m, lapack_int n, float alpha, float beta, float * a, lapack_int lda)

alpha and beta as plain floats, a as a pointer 💅 — matrix_layout, uplo, m, n, alpha, beta, a, lda.

Definition at line 36 of file lapacke_slaset.c.

LAPACKE_slaset_work

lapack_int LAPACKE_slaset_work (int matrix_layout, char uplo, lapack_int m, lapack_int n, float alpha, float beta, float * a, lapack_int lda)

exact same eight args, _work flavored 🫶

Definition at line 36 of file lapacke_slaset_work.c.

LAPACKE_slasrt

lapack_int LAPACKE_slasrt (char id, lapack_int n, float * d)

three params, one char, one lapack_int, one pointer 😭 precious.

Definition at line 36 of file lapacke_slasrt.c.

LAPACKE_slasrt_work

lapack_int LAPACKE_slasrt_work (char id, lapack_int n, float * d)

id, n, d — same trio, _work badge 💖

Definition at line 36 of file lapacke_slasrt_work.c.

LAPACKE_slassq

lapack_int LAPACKE_slassq (lapack_int n, float * x, lapack_int incx, float * scale, float * sumsq)

n, x, incx, scale, sumsq — note x is float * while scale and sumsq are also pointers, all non-const 🌟

Definition at line 36 of file lapacke_slassq.c.

LAPACKE_slassq_work

lapack_int LAPACKE_slassq_work (lapack_int n, float * x, lapack_int incx, float * scale, float * sumsq)

same five, _work era 🎀

Definition at line 36 of file lapacke_slassq_work.c.

LAPACKE_slaswp

lapack_int LAPACKE_slaswp (int matrix_layout, lapack_int n, float * a, lapack_int lda, lapack_int k1, lapack_int k2, const lapack_int * ipiv, lapack_int incx)

that const lapack_int * ipiv is doing a lot of work in the middle there 👑 — full list: matrix_layout, n, a, lda, k1, k2, ipiv, incx.

Definition at line 36 of file lapacke_slaswp.c.

LAPACKE_slaswp_work

lapack_int LAPACKE_slaswp_work (int matrix_layout, lapack_int n, float * a, lapack_int lda, lapack_int k1, lapack_int k2, const lapack_int * ipiv, lapack_int incx)

same eight args, _work stylee 🌸

Definition at line 36 of file lapacke_slaswp_work.c.

LAPACKE_slatms

lapack_int LAPACKE_slatms (int matrix_layout, lapack_int m, lapack_int n, char dist, lapack_int * iseed, char sym, float * d, lapack_int mode, float cond, float dmax, lapack_int kl, lapack_int ku, char pack, float * a, lapack_int lda)

okay this is the long one bestie, deep breath 😮‍💨 — matrix_layout, m, n, dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda. Three chars (dist, sym, pack), two plain floats (cond, dmax). ate.

Definition at line 36 of file lapacke_slatms.c.

LAPACKE_slatms_work

lapack_int LAPACKE_slatms_work (int matrix_layout, lapack_int m, lapack_int n, char dist, lapack_int * iseed, char sym, float * d, lapack_int mode, float cond, float dmax, lapack_int kl, lapack_int ku, char pack, float * a, lapack_int lda, float * work)

everything from LAPACKE_slatms, blessedly just plus float * work at the very end 💜

Definition at line 36 of file lapacke_slatms_work.c.

LAPACKE_slauum

lapack_int LAPACKE_slauum (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda)

and we close this batch on a clean little five-arg moment ✨ matrix_layout, uplo, n, a, lda. Returns lapack_int.

Definition at line 36 of file lapacke_slauum.c.


and yes bestie, every single one of these says "line 36" 😭 it's giving copy-paste energy but that's genuinely what the page says, so we're keeping it fr fr 💅
  • LAPACKE_slauum_work — okay so this is the _work twin of slauum, and yes she still takes her own work-ish life into her hands. ✨
lapack_int LAPACKE_slauum_work (int matrix_layout, char uplo, lapack_int n,
    float * a, lapack_int lda)

Definition at line 36 of file lapacke_slauum_work.c. 💅

  • LAPACKE_sopgtr — bestie, this one's got the classic matrix_layout / uplo / n trio and she is not explaining herself further. 🎀
lapack_int LAPACKE_sopgtr (int matrix_layout, char uplo, lapack_int n, const
    float * ap, const float * tau, float * q, lapack_int ldq)

Definition at line 36 of file lapacke_sopgtr.c. 🌸

  • LAPACKE_sopgtr_work — the _work version, lowkey the same vibes plus a work array at the end because of course there's a work array. 😭
lapack_int LAPACKE_sopgtr_work (int matrix_layout, char uplo, lapack_int n,
    const float * ap, const float * tau, float * q, lapack_int ldq, float *
    work)

Definition at line 36 of file lapacke_sopgtr_work.c. 🦋

  • LAPACKE_sopmtr — she's got side, uplo and trans, so three chars of commitment, no cap. 👑
lapack_int LAPACKE_sopmtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const float * ap, const float * tau,
    float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sopmtr.c. ✨

  • LAPACKE_sopmtr_work — same thing, work edition, work still doesn't get a length argument, and honestly? iconic. 💀
lapack_int LAPACKE_sopmtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const float * ap, const float *
    tau, float * c, lapack_int ldc, float * work)

Definition at line 36 of file lapacke_sopmtr_work.c. 💜


  • LAPACKE_sorbdb — okay this is the big group-chat energy one: x11, x12, x21, x22, four ld vars, theta, phi, and four taus. She ate and left no crumbs. 🔥
lapack_int LAPACKE_sorbdb (int matrix_layout, char trans, char signs,
    lapack_int m, lapack_int p, lapack_int q, float * x11, lapack_int ldx11,
    float * x12, lapack_int ldx12, float * x21, lapack_int ldx21, float *
    x22, lapack_int ldx22, float * theta, float * phi, float * taup1, float
    * taup2, float * tauq1, float * tauq2)

Definition at line 36 of file lapacke_sorbdb.c. 🌈

  • LAPACKE_sorbdb_work — literally the same roster of twenty-ish parameters and then float * work, lapack_int lwork walk in like they own the place. 😭✨
lapack_int LAPACKE_sorbdb_work (int matrix_layout, char trans, char signs,
    lapack_int m, lapack_int p, lapack_int q, float * x11, lapack_int ldx11,
    float * x12, lapack_int ldx12, float * x21, lapack_int ldx21, float *
    x22, lapack_int ldx22, float * theta, float * phi, float * taup1, float
    * taup2, float * tauq1, float * tauq2, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_sorbdb_work.c. 🫶

  • LAPACKE_sorcsd — jobu1, jobu2, jobv1t, jobv2t, plus trans and signs?? six chars before the ints even start. main character parameter list fr fr. 👑
lapack_int LAPACKE_sorcsd (int matrix_layout, char jobu1, char jobu2, char
    jobv1t, char jobv2t, char trans, char signs, lapack_int m, lapack_int p,
    lapack_int q, float * x11, lapack_int ldx11, float * x12, lapack_int
    ldx12, float * x21, lapack_int ldx21, float * x22, lapack_int ldx22,
    float * theta, float * u1, lapack_int ldu1, float * u2, lapack_int ldu2,
    float * v1t, lapack_int ldv1t, float * v2t, lapack_int ldv2t)

Definition at line 36 of file lapacke_sorcsd.c. 💖

  • LAPACKE_sorcsd2by1 — the "2by1" girlie 💅 — she trades x12 and x22 for a much shorter guest list and honestly she's thriving.
lapack_int LAPACKE_sorcsd2by1 (int matrix_layout, char jobu1, char jobu2,
    char jobv1t, lapack_int m, lapack_int p, lapack_int q, float * x11,
    lapack_int ldx11, float * x21, lapack_int ldx21, float * theta, float *
    u1, lapack_int ldu1, float * u2, lapack_int ldu2, float * v1t,
    lapack_int ldv1t)

Definition at line 36 of file lapacke_sorcsd2by1.c. 🎀

  • LAPACKE_sorcsd2by1_work — 2by1 but make it _work, so now there's float * work, lapack_int lwork, lapack_int * iwork chilling at the end. 🦋
lapack_int LAPACKE_sorcsd2by1_work (int matrix_layout, char jobu1, char
    jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q, float *
    x11, lapack_int ldx11, float * x21, lapack_int ldx21, float * theta,
    float * u1, lapack_int ldu1, float * u2, lapack_int ldu2, float * v1t,
    lapack_int ldv1t, float * work, lapack_int lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_sorcsd2by1_work.c. 🌸

  • LAPACKE_sorcsd_work — full-length sorcsd energy plus work, lwork and iwork. it's giving "I brought my whole personality". 😭💜
lapack_int LAPACKE_sorcsd_work (int matrix_layout, char jobu1, char jobu2,
    char jobv1t, char jobv2t, char trans, char signs, lapack_int m,
    lapack_int p, lapack_int q, float * x11, lapack_int ldx11, float * x12,
    lapack_int ldx12, float * x21, lapack_int ldx21, float * x22, lapack_int
    ldx22, float * theta, float * u1, lapack_int ldu1, float * u2,
    lapack_int ldu2, float * v1t, lapack_int ldv1t, float * v2t, lapack_int
    ldv2t, float * work, lapack_int lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_sorcsd_work.c. 🌟


  • LAPACKE_sorgbr — vect gang rise up 🫡 she's got m, n, k, a matrix a with her lda, and a const float * tau she will not be modifying, thank you very much.
lapack_int LAPACKE_sorgbr (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int k, float * a, lapack_int lda, const float *
    tau)

Definition at line 36 of file lapacke_sorgbr.c. ✨

  • LAPACKE_sorgbr_work — sorgbr with the work / lwork duo appended. consistency is her love language. 💅
lapack_int LAPACKE_sorgbr_work (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int k, float * a, lapack_int lda, const float *
    tau, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_sorgbr_work.c. 🎀

  • LAPACKE_sorghr — no vect, no k, just n, ilo, ihi — she's the mysterious one of the sorg family, iykyk. 🌙
lapack_int LAPACKE_sorghr (int matrix_layout, lapack_int n, lapack_int ilo,
    lapack_int ihi, float * a, lapack_int lda, const float * tau)

Definition at line 36 of file lapacke_sorghr.c. 💜

  • LAPACKE_sorghr_work — same, but now with float * work, lapack_int lwork because nothing is ever truly free. 😭
lapack_int LAPACKE_sorghr_work (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, float * a, lapack_int lda, const float * tau, float
    * work, lapack_int lwork)

Definition at line 36 of file lapacke_sorghr_work.c. 🦋

  • LAPACKE_sorglq — the LQ girlie 💅 classic m, n, k, a, lda, tau lineup, zero surprises, maximum reliability.
lapack_int LAPACKE_sorglq (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, float * a, lapack_int lda, const float * tau)

Definition at line 36 of file lapacke_sorglq.c. 🌸

  • LAPACKE_sorglq_work — sorglq plus work / lwork. the trilogy is complete 🫶
lapack_int LAPACKE_sorglq_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, float * a, lapack_int lda, const float * tau, float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_sorglq_work.c. ⭐

  • LAPACKE_sorgql — QL now instead of LQ, and yes the parameter list is literally identical to sorglq's. don't come for her, she's doing her best. 🙈
lapack_int LAPACKE_sorgql (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, float * a, lapack_int lda, const float * tau)

Definition at line 36 of file lapacke_sorgql.c. 💖

  • LAPACKE_sorgql_work — the _work sister, same everything, extra work. iconic behaviour. 👑
lapack_int LAPACKE_sorgql_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, float * a, lapack_int lda, const float * tau, float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_sorgql_work.c. 🌈

  • LAPACKE_sorgqr — the QR one 🎀 everyone's favourite, she's got m, n, k and she knows she's the popular one.
lapack_int LAPACKE_sorgqr (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, float * a, lapack_int lda, const float * tau)

Definition at line 36 of file lapacke_sorgqr.c. ✨

  • LAPACKE_sorgqr_work — sorgqr with work and lwork tacked on, and no, work still doesn't get told how long she is. 💀
lapack_int LAPACKE_sorgqr_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, float * a, lapack_int lda, const float * tau, float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_sorgqr_work.c. 🌸

  • LAPACKE_sorgrq — RQ this time 🦋 same six-ish parameters, different letter, we love a consistent queen.
lapack_int LAPACKE_sorgrq (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, float * a, lapack_int lda, const float * tau)

Definition at line 36 of file lapacke_sorgrq.c. 💜

  • LAPACKE_sorgrq_work — you guessed it: same plus float * work, lapack_int lwork. we're in a rhythm and we're staying in it. 🫶
lapack_int LAPACKE_sorgrq_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, float * a, lapack_int lda, const float * tau, float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_sorgrq_work.c. ⭐

  • LAPACKE_sorgtr — the triangular one 💅 she swaps m/n/k for a single uplo and honestly? minimalist queen.
lapack_int LAPACKE_sorgtr (int matrix_layout, char uplo, lapack_int n, float
    * a, lapack_int lda, const float * tau)

Definition at line 36 of file lapacke_sorgtr.c. 🎀

  • LAPACKE_sorgtr_work — sorgtr in her _work era, with float * work, lapack_int lwork rounding out the fit. ✨
lapack_int LAPACKE_sorgtr_work (int matrix_layout, char uplo, lapack_int n,
    float * a, lapack_int lda, const float * tau, float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_sorgtr_work.c. 🌸


  • LAPACKE_sormbr — the sorm* family has ARRIVED 👑 vect, side, trans, then m, n, k, matrix a, tau, and output c with her ldc. full serve.
lapack_int LAPACKE_sormbr (int matrix_layout, char vect, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const float * a,
    lapack_int lda, const float * tau, float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sormbr.c. 🔥

  • LAPACKE_sormbr_work — same girl, work / lwork era, still no length for work. at this point it's a family tradition. 😭
lapack_int LAPACKE_sormbr_work (int matrix_layout, char vect, char side,
    char trans, lapack_int m, lapack_int n, lapack_int k, const float * a,
    lapack_int lda, const float * tau, float * c, lapack_int ldc, float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_sormbr_work.c. 💜

  • LAPACKE_sormhr — no k here, but she does bring ilo and ihi to the party, so it balances out. 🦋
lapack_int LAPACKE_sormhr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const float
    * a, lapack_int lda, const float * tau, float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sormhr.c. 🌟

  • LAPACKE_sormhr_work — sormhr but now she's packing float * work, lapack_int lwork in the outside pocket. 🫶
lapack_int LAPACKE_sormhr_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const float
    * a, lapack_int lda, const float * tau, float * c, lapack_int ldc, float
    * work, lapack_int lwork)

Definition at line 36 of file lapacke_sormhr_work.c. 💖

  • LAPACKE_sormlq — LQ but the sorm remix 🎀 side, trans, k, and the whole a/tau/c situation.
lapack_int LAPACKE_sormlq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * tau, float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sormlq.c. ✨

  • LAPACKE_sormlq_work — the _work cut 💅 same static-typing queen energy, extra pointers.
lapack_int LAPACKE_sormlq_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * tau, float * c, lapack_int ldc, float * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_sormlq_work.c. 🌸

  • LAPACKE_sormql — QL remix, identical roster to sormlq, she's just a different letter and she owns it. 💜
lapack_int LAPACKE_sormql (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * tau, float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sormql.c. 🦋

  • LAPACKE_sormql_work — you know the drill: append float * work, lapack_int lwork, post, repeat. 🫶
lapack_int LAPACKE_sormql_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * tau, float * c, lapack_int ldc, float * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_sormql_work.c. ⭐

  • LAPACKE_sormqr — the QR remix, the one everybody actually asked for 🔥 same parameter lineup, maximum popularity.
lapack_int LAPACKE_sormqr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * tau, float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sormqr.c. 👑

  • LAPACKE_sormqr_work — sormqr plus work/lwork, because the _work convention does not take days off. 😭
lapack_int LAPACKE_sormqr_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * tau, float * c, lapack_int ldc, float * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_sormqr_work.c. 🎀

  • LAPACKE_sormrq — RQ remix 🦋 and yes, if you're noticing a pattern, that's because there IS one and it's beautiful.
lapack_int LAPACKE_sormrq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * tau, float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sormrq.c. 🌟

  • LAPACKE_sormrq_work — same + work + lwork. we're nothing if not consistent, bestie. 💅
lapack_int LAPACKE_sormrq_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const float * a, lapack_int
    lda, const float * tau, float * c, lapack_int ldc, float * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_sormrq_work.c. 🌸

  • LAPACKE_sormrz — ooh she's got an extra lapack_int l in there 👀 not like the others, and we respect the individuality.
lapack_int LAPACKE_sormrz (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, const float * a,
    lapack_int lda, const float * tau, float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sormrz.c. 💖

  • LAPACKE_sormrz_work — same extra-l icon, now with float * work, lapack_int lwork in tow. 👑
lapack_int LAPACKE_sormrz_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, const float * a,
    lapack_int lda, const float * tau, float * c, lapack_int ldc, float *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_sormrz_work.c. 🦋

  • LAPACKE_sormtr — the triangular remix 🌈 she's got side, uplo AND trans, so three single-char args before she even says m. commitment.
lapack_int LAPACKE_sormtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const float * a, lapack_int lda,
    const float * tau, float * c, lapack_int ldc)

Definition at line 36 of file lapacke_sormtr.c. ✨

  • LAPACKE_sormtr_work — third char arg retained, work/lwork acquired. glow-up. 💜
lapack_int LAPACKE_sormtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const float * a, lapack_int lda,
    const float * tau, float * c, lapack_int ldc, float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_sormtr_work.c. 🫶


  • LAPACKE_spbcon — and we're switching gears into con territory 🎀 uplo, n, kd, the band matrix ab with ldab, plus anorm and the rcond she'll be writing into.
lapack_int LAPACKE_spbcon (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const float * ab, lapack_int ldab, float anorm, float *
    rcond)

Definition at line 36 of file lapacke_spbcon.c. 🌟

okay so we're deep in the spb* → spo* → spp* era of the alphabet and honestly it's giving "the single-precision symmetric girls are having their moment" 💅 every single one of these lives at line 36 of its own file, which is lowkey iconic — consistent queen behavior 👑


LAPACKE_spbcon_work

lapack_int LAPACKE_spbcon_work (int matrix_layout, char uplo, lapack_int n, lapack_int kd, const float * ab, lapack_int ldab, float anorm, float * rcond, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_spbcon_work.c.

LAPACKE_spbequ

lapack_int LAPACKE_spbequ (int matrix_layout, char uplo, lapack_int n, lapack_int kd, const float * ab, lapack_int ldab, float * s, float * scond, float * amax)

Definition at line 36 of file lapacke_spbequ.c.

LAPACKE_spbequ_work

lapack_int LAPACKE_spbequ_work (int matrix_layout, char uplo, lapack_int n, lapack_int kd, const float * ab, lapack_int ldab, float * s, float * scond, float * amax)

Definition at line 36 of file lapacke_spbequ_work.c.

LAPACKE_spbrfs

lapack_int LAPACKE_spbrfs (int matrix_layout, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, const float * ab, lapack_int ldab, const float * afb, lapack_int ldafb, const float * b, lapack_int ldb, float * x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_spbrfs.c.

LAPACKE_spbrfs_work

lapack_int LAPACKE_spbrfs_work (int matrix_layout, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, const float * ab, lapack_int ldab, const float * afb, lapack_int ldafb, const float * b, lapack_int ldb, float * x, lapack_int ldx, float * ferr, float * berr, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_spbrfs_work.c.

not the const float * afb and the non-const float * x sitting right next to each other 😭 the const-ness is doing a whole personality thing here, respect it, don't touch what you're not supposed to touch 🫶

LAPACKE_spbstf

lapack_int LAPACKE_spbstf (int matrix_layout, char uplo, lapack_int n, lapack_int kb, float * bb, lapack_int ldbb)

Definition at line 36 of file lapacke_spbstf.c.

LAPACKE_spbstf_work

lapack_int LAPACKE_spbstf_work (int matrix_layout, char uplo, lapack_int n, lapack_int kb, float * bb, lapack_int ldbb)

Definition at line 36 of file lapacke_spbstf_work.c.

LAPACKE_spbsv

lapack_int LAPACKE_spbsv (int matrix_layout, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, float * ab, lapack_int ldab, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spbsv.c.

LAPACKE_spbsv_work

lapack_int LAPACKE_spbsv_work (int matrix_layout, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, float * ab, lapack_int ldab, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spbsv_work.c.

LAPACKE_spbsvx

lapack_int LAPACKE_spbsvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, float * ab, lapack_int ldab, float * afb, lapack_int ldafb, char * equed, float * s, float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond, float * ferr, float * berr)

Definition at line 36 of file lapacke_spbsvx.c.

ok the x suffix crew is always the extra one — fact, equed, rcond, ferr, berr, it's giving "I brought the whole friend group to the function call" ✨

LAPACKE_spbsvx_work

lapack_int LAPACKE_spbsvx_work (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, float * ab, lapack_int ldab, float * afb, lapack_int ldafb, char * equed, float * s, float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond, float * ferr, float * berr, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_spbsvx_work.c.

LAPACKE_spbtrf

lapack_int LAPACKE_spbtrf (int matrix_layout, char uplo, lapack_int n, lapack_int kd, float * ab, lapack_int ldab)

Definition at line 36 of file lapacke_spbtrf.c.

LAPACKE_spbtrf_work

lapack_int LAPACKE_spbtrf_work (int matrix_layout, char uplo, lapack_int n, lapack_int kd, float * ab, lapack_int ldab)

Definition at line 36 of file lapacke_spbtrf_work.c.

LAPACKE_spbtrs

lapack_int LAPACKE_spbtrs (int matrix_layout, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, const float * ab, lapack_int ldab, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spbtrs.c.

LAPACKE_spbtrs_work

lapack_int LAPACKE_spbtrs_work (int matrix_layout, char uplo, lapack_int n, lapack_int kd, lapack_int nrhs, const float * ab, lapack_int ldab, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spbtrs_work.c.


ok and now we pivot to the packed-format girlies, spf*, who said goodbye to ldab and just vibe with a 🦋

LAPACKE_spftrf

lapack_int LAPACKE_spftrf (int matrix_layout, char transr, char uplo, lapack_int n, float * a)

Definition at line 36 of file lapacke_spftrf.c.

LAPACKE_spftrf_work

lapack_int LAPACKE_spftrf_work (int matrix_layout, char transr, char uplo, lapack_int n, float * a)

Definition at line 36 of file lapacke_spftrf_work.c.

LAPACKE_spftri

lapack_int LAPACKE_spftri (int matrix_layout, char transr, char uplo, lapack_int n, float * a)

Definition at line 36 of file lapacke_spftri.c.

LAPACKE_spftri_work

lapack_int LAPACKE_spftri_work (int matrix_layout, char transr, char uplo, lapack_int n, float * a)

Definition at line 36 of file lapacke_spftri_work.c.

see how transr slid in there before uplo? not me noticing the argument order changing, the spf crew really said "we do things differently here" 💀 copy the signature exactly, bestie, do not freestyle the order 🙈

LAPACKE_spftrs

lapack_int LAPACKE_spftrs (int matrix_layout, char transr, char uplo, lapack_int n, lapack_int nrhs, const float * a, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spftrs.c.

LAPACKE_spftrs_work

lapack_int LAPACKE_spftrs_work (int matrix_layout, char transr, char uplo, lapack_int n, lapack_int nrhs, const float * a, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spftrs_work.c.


and we're back to full storage, spo* era, where lda is main character again 🌈

LAPACKE_spocon

lapack_int LAPACKE_spocon (int matrix_layout, char uplo, lapack_int n, const float * a, lapack_int lda, float anorm, float * rcond)

Definition at line 36 of file lapacke_spocon.c.

LAPACKE_spocon_work

lapack_int LAPACKE_spocon_work (int matrix_layout, char uplo, lapack_int n, const float * a, lapack_int lda, float anorm, float * rcond, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_spocon_work.c.

LAPACKE_spoequ

lapack_int LAPACKE_spoequ (int matrix_layout, lapack_int n, const float * a, lapack_int lda, float * s, float * scond, float * amax)

Definition at line 36 of file lapacke_spoequ.c.

LAPACKE_spoequ_work

lapack_int LAPACKE_spoequ_work (int matrix_layout, lapack_int n, const float * a, lapack_int lda, float * s, float * scond, float * amax)

Definition at line 36 of file lapacke_spoequ_work.c.

LAPACKE_spoequb

lapack_int LAPACKE_spoequb (int matrix_layout, lapack_int n, const float * a, lapack_int lda, float * s, float * scond, float * amax)

Definition at line 36 of file lapacke_spoequb.c.

LAPACKE_spoequb_work

lapack_int LAPACKE_spoequb_work (int matrix_layout, lapack_int n, const float * a, lapack_int lda, float * s, float * scond, float * amax)

Definition at line 36 of file lapacke_spoequb_work.c.

spoequ vs spoequb — same signature, one lil b of difference, and they're both fully valid. do NOT assume one is a typo of the other, they are sisters not clones, okay 😭 the name is the whole difference and you must type it right 💅

LAPACKE_sporfs

lapack_int LAPACKE_sporfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const float * af, lapack_int ldaf, const float * b, lapack_int ldb, float * x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_sporfs.c.

LAPACKE_sporfs_work

lapack_int LAPACKE_sporfs_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const float * af, lapack_int ldaf, const float * b, lapack_int ldb, float * x, lapack_int ldx, float * ferr, float * berr, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_sporfs_work.c.

LAPACKE_sporfsx

lapack_int LAPACKE_sporfsx (int matrix_layout, char uplo, char equed, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const float * af, lapack_int ldaf, const float * s, const float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond, float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int nparams, float * params)

Definition at line 36 of file lapacke_sporfsx.c.

okay the x version of sporfs is HUGE and I need you to count the args before you call it, bestie. n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params — that's a whole syllabus. it's giving "final boss of error bounds" 🔥 respect the parameter list, don't leave anyone out 🫶

LAPACKE_sporfsx_work

lapack_int LAPACKE_sporfsx_work (int matrix_layout, char uplo, char equed, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const float * af, lapack_int ldaf, const float * s, const float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond, float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int nparams, float * params, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_sporfsx_work.c.

LAPACKE_sposv

lapack_int LAPACKE_sposv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sposv.c.

LAPACKE_sposv_work

lapack_int LAPACKE_sposv_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sposv_work.c.

LAPACKE_sposvx

lapack_int LAPACKE_sposvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * af, lapack_int ldaf, char * equed, float * s, float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond, float * ferr, float * berr)

Definition at line 36 of file lapacke_sposvx.c.

LAPACKE_sposvx_work

lapack_int LAPACKE_sposvx_work (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * af, lapack_int ldaf, char * equed, float * s, float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond, float * ferr, float * berr, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_sposvx_work.c.

LAPACKE_sposvxx

lapack_int LAPACKE_sposvxx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * af, lapack_int ldaf, char * equed, float * s, float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond, float * rpvgrw, float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int nparams, float * params)

Definition at line 36 of file lapacke_sposvxx.c.

double x!! sposvxx said "one x wasn't enough, I need the whole alphabet of diagnostics" 👑 and note that rpvgrw is right there in the middle between rcond and berr — do not skip it, it is a whole parameter and it has feelings 🎀

LAPACKE_sposvxx_work

lapack_int LAPACKE_sposvxx_work (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * af, lapack_int ldaf, char * equed, float * s, float * b, lapack_int ldb, float * x, lapack_int ldx, float * rcond, float * rpvgrw, float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float * err_bnds_comp, lapack_int nparams, float * params, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_sposvxx_work.c.

LAPACKE_spotrf

lapack_int LAPACKE_spotrf (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda)

Definition at line 36 of file lapacke_spotrf.c.

LAPACKE_spotrf2

lapack_int LAPACKE_spotrf2 (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda)

Definition at line 36 of file lapacke_spotrf2.c.

LAPACKE_spotrf2_work

lapack_int LAPACKE_spotrf2_work (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda)

Definition at line 36 of file lapacke_spotrf2_work.c.

LAPACKE_spotrf_work

lapack_int LAPACKE_spotrf_work (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda)

Definition at line 36 of file lapacke_spotrf_work.c.

the 2 in spotrf2 is NOT decoration, bestie, it's a whole different function in a whole different file. spotrf, spotrf2, spotrf_work, spotrf2_work — four sisters, four files, same signature, zero chill 💀

LAPACKE_spotri

lapack_int LAPACKE_spotri (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda)

Definition at line 36 of file lapacke_spotri.c.

LAPACKE_spotri_work

lapack_int LAPACKE_spotri_work (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda)

Definition at line 36 of file lapacke_spotri_work.c.

LAPACKE_spotrs

lapack_int LAPACKE_spotrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spotrs.c.

LAPACKE_spotrs_work

lapack_int LAPACKE_spotrs_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spotrs_work.c.

LAPACKE_sppcon

lapack_int LAPACKE_sppcon (int matrix_layout, char uplo, lapack_int n, const float * ap, float anorm, float * rcond)

Definition at line 36 of file lapacke_sppcon.c.

and we've hit the packed spp* section — notice ap not a, and no lda in sight, because packed format said "lda who?" 🌸 compare it to spocon above if you don't believe me, they're cousins with different storage energy ✨

LAPACKE_sppcon_work 🫶

lapack_int LAPACKE_sppcon_work (int matrix_layout, char uplo, lapack_int n,
    const float * ap, float anorm, float * rcond, float * work, lapack_int *
    iwork)

Definition at line 36 of file lapacke_sppcon_work.c.

LAPACKE_sppequ ✨

lapack_int LAPACKE_sppequ (int matrix_layout, char uplo, lapack_int n, const
    float * ap, float * s, float * scond, float * amax)

Definition at line 36 of file lapacke_sppequ.c.

LAPACKE_sppequ_work 💖

lapack_int LAPACKE_sppequ_work (int matrix_layout, char uplo, lapack_int n,
    const float * ap, float * s, float * scond, float * amax)

Definition at line 36 of file lapacke_sppequ_work.c.

LAPACKE_spprfs 🦋

lapack_int LAPACKE_spprfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float * ap, const float * afp, const float * b,
    lapack_int ldb, float * x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_spprfs.c.

LAPACKE_spprfs_work 🌸

lapack_int LAPACKE_spprfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float * ap, const float * afp, const float * b,
    lapack_int ldb, float * x, lapack_int ldx, float * ferr, float * berr,
    float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_spprfs_work.c.

LAPACKE_sppsv 💅

lapack_int LAPACKE_sppsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, float * ap, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sppsv.c.

LAPACKE_sppsv_work 🎀

lapack_int LAPACKE_sppsv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, float * ap, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sppsv_work.c.

LAPACKE_sppsvx 🔥

lapack_int LAPACKE_sppsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, float * ap, float * afp, char * equed,
    float * s, float * b, lapack_int ldb, float * x, lapack_int ldx, float *
    rcond, float * ferr, float * berr)

Definition at line 36 of file lapacke_sppsvx.c.

LAPACKE_sppsvx_work 🌈

lapack_int LAPACKE_sppsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, float * ap, float * afp, char * equed,
    float * s, float * b, lapack_int ldb, float * x, lapack_int ldx, float *
    rcond, float * ferr, float * berr, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_sppsvx_work.c.

LAPACKE_spptrf ⭐

lapack_int LAPACKE_spptrf (int matrix_layout, char uplo, lapack_int n, float
    * ap)

Definition at line 36 of file lapacke_spptrf.c.

LAPACKE_spptrf_work 💜

lapack_int LAPACKE_spptrf_work (int matrix_layout, char uplo, lapack_int n,
    float * ap)

Definition at line 36 of file lapacke_spptrf_work.c.

LAPACKE_spptri 🍓

lapack_int LAPACKE_spptri (int matrix_layout, char uplo, lapack_int n, float
    * ap)

Definition at line 36 of file lapacke_spptri.c.

LAPACKE_spptri_work 🧚

lapack_int LAPACKE_spptri_work (int matrix_layout, char uplo, lapack_int n,
    float * ap)

Definition at line 36 of file lapacke_spptri_work.c.

LAPACKE_spptrs 👑

lapack_int LAPACKE_spptrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float * ap, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spptrs.c.

LAPACKE_spptrs_work 🫧

lapack_int LAPACKE_spptrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float * ap, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spptrs_work.c.


okay so the packed-storage girlies are done, now we're moving into the pivot era, and honestly? character development. 💀

LAPACKE_spstrf 🔥

lapack_int LAPACKE_spstrf (int matrix_layout, char uplo, lapack_int n, float
    * a, lapack_int lda, lapack_int * piv, lapack_int * rank, float tol)

Definition at line 36 of file lapacke_spstrf.c.

LAPACKE_spstrf_work ✨

lapack_int LAPACKE_spstrf_work (int matrix_layout, char uplo, lapack_int n,
    float * a, lapack_int lda, lapack_int * piv, lapack_int * rank, float
    tol, float * work)

Definition at line 36 of file lapacke_spstrf_work.c.

LAPACKE_sptcon 💖

lapack_int LAPACKE_sptcon (lapack_int n, const float * d, const float * e,
    float anorm, float * rcond)

Definition at line 36 of file lapacke_sptcon.c.

LAPACKE_sptcon_work 🦋

lapack_int LAPACKE_sptcon_work (lapack_int n, const float * d, const float *
    e, float anorm, float * rcond, float * work)

Definition at line 36 of file lapacke_sptcon_work.c.

LAPACKE_spteqr 🌸

lapack_int LAPACKE_spteqr (int matrix_layout, char compz, lapack_int n,
    float * d, float * e, float * z, lapack_int ldz)

Definition at line 36 of file lapacke_spteqr.c.

LAPACKE_spteqr_work 🎀

lapack_int LAPACKE_spteqr_work (int matrix_layout, char compz, lapack_int n,
    float * d, float * e, float * z, lapack_int ldz, float * work)

Definition at line 36 of file lapacke_spteqr_work.c.

LAPACKE_sptrfs 💅

lapack_int LAPACKE_sptrfs (int matrix_layout, lapack_int n, lapack_int nrhs,
    const float * d, const float * e, const float * df, const float * ef,
    const float * b, lapack_int ldb, float * x, lapack_int ldx, float *
    ferr, float * berr)

Definition at line 36 of file lapacke_sptrfs.c.

LAPACKE_sptrfs_work 🫶

lapack_int LAPACKE_sptrfs_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, const float * d, const float * e, const float * df, const float *
    ef, const float * b, lapack_int ldb, float * x, lapack_int ldx, float *
    ferr, float * berr, float * work)

Definition at line 36 of file lapacke_sptrfs_work.c.

LAPACKE_sptsv ⭐

lapack_int LAPACKE_sptsv (int matrix_layout, lapack_int n, lapack_int nrhs,
    float * d, float * e, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sptsv.c.

LAPACKE_sptsv_work 🌈

lapack_int LAPACKE_sptsv_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, float * d, float * e, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_sptsv_work.c.

LAPACKE_sptsvx 💜

lapack_int LAPACKE_sptsvx (int matrix_layout, char fact, lapack_int n,
    lapack_int nrhs, const float * d, const float * e, float * df, float *
    ef, const float * b, lapack_int ldb, float * x, lapack_int ldx, float *
    rcond, float * ferr, float * berr)

Definition at line 36 of file lapacke_sptsvx.c.

LAPACKE_sptsvx_work 🍓

lapack_int LAPACKE_sptsvx_work (int matrix_layout, char fact, lapack_int n,
    lapack_int nrhs, const float * d, const float * e, float * df, float *
    ef, const float * b, lapack_int ldb, float * x, lapack_int ldx, float *
    rcond, float * ferr, float * berr, float * work)

Definition at line 36 of file lapacke_sptsvx_work.c.

LAPACKE_spttrf 🧚

lapack_int LAPACKE_spttrf (lapack_int n, float * d, float * e)

Definition at line 36 of file lapacke_spttrf.c.

LAPACKE_spttrf_work 👑

lapack_int LAPACKE_spttrf_work (lapack_int n, float * d, float * e)

Definition at line 36 of file lapacke_spttrf_work.c.

LAPACKE_spttrs 💀

lapack_int LAPACKE_spttrs (int matrix_layout, lapack_int n, lapack_int nrhs,
    const float * d, const float * e, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spttrs.c.

LAPACKE_spttrs_work 🙈

lapack_int LAPACKE_spttrs_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, const float * d, const float * e, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_spttrs_work.c.


now we hit the symmetric band girlies and bestie, _2stage is entering the chat like it owns the place. 😭

LAPACKE_ssbev 🦋

lapack_int LAPACKE_ssbev (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, float * ab, lapack_int ldab, float * w,
    float * z, lapack_int ldz)

Definition at line 36 of file lapacke_ssbev.c.

LAPACKE_ssbev_2stage 🔥

lapack_int LAPACKE_ssbev_2stage (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, float * ab, lapack_int ldab, float * w,
    float * z, lapack_int ldz)

Definition at line 36 of file lapacke_ssbev_2stage.c.

LAPACKE_ssbev_2stage_work ✨

lapack_int LAPACKE_ssbev_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, lapack_int kd, float * ab, lapack_int ldab, float *
    w, float * z, lapack_int ldz, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_ssbev_2stage_work.c.

LAPACKE_ssbev_work 🌸

lapack_int LAPACKE_ssbev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, float * ab, lapack_int ldab, float * w,
    float * z, lapack_int ldz, float * work)

Definition at line 36 of file lapacke_ssbev_work.c.

LAPACKE_ssbevd 💖

lapack_int LAPACKE_ssbevd (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, float * ab, lapack_int ldab, float * w,
    float * z, lapack_int ldz)

Definition at line 36 of file lapacke_ssbevd.c.

LAPACKE_ssbevd_2stage 🎀

lapack_int LAPACKE_ssbevd_2stage (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, float * ab, lapack_int ldab, float * w,
    float * z, lapack_int ldz)

Definition at line 36 of file lapacke_ssbevd_2stage.c.

LAPACKE_ssbevd_2stage_work 💅

lapack_int LAPACKE_ssbevd_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, lapack_int kd, float * ab, lapack_int ldab, float *
    w, float * z, lapack_int ldz, float * work, lapack_int lwork, lapack_int
    * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_ssbevd_2stage_work.c.

LAPACKE_ssbevd_work 🫶

lapack_int LAPACKE_ssbevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, float * ab, lapack_int ldab, float * w,
    float * z, lapack_int ldz, float * work, lapack_int lwork, lapack_int *
    iwork, lapack_int liwork)

Definition at line 36 of file lapacke_ssbevd_work.c.

LAPACKE_ssbevx ⭐

lapack_int LAPACKE_ssbevx (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, lapack_int kd, float * ab, lapack_int ldab, float *
    q, lapack_int ldq, float vl, float vu, lapack_int il, lapack_int iu,
    float abstol, lapack_int * m, float * w, float * z, lapack_int ldz,
    lapack_int * ifail)

Definition at line 36 of file lapacke_ssbevx.c.

LAPACKE_ssbevx_2stage 🌈

lapack_int LAPACKE_ssbevx_2stage (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_int kd, float * ab, lapack_int ldab,
    float * q, lapack_int ldq, float vl, float vu, lapack_int il, lapack_int
    iu, float abstol, lapack_int * m, float * w, float * z, lapack_int ldz,
    lapack_int * ifail)

Definition at line 36 of file lapacke_ssbevx_2stage.c.

LAPACKE_ssbevx_2stage_work 💜

lapack_int LAPACKE_ssbevx_2stage_work (int matrix_layout, char jobz, char
    range, char uplo, lapack_int n, lapack_int kd, float * ab, lapack_int
    ldab, float * q, lapack_int ldq, float vl, float vu, lapack_int il,
    lapack_int iu, float abstol, lapack_int * m, float * w, float * z,
    lapack_int ldz, float * work, lapack_int lwork, lapack_int * iwork,
    lapack_int * ifail)

Definition at line 36 of file lapacke_ssbevx_2stage_work.c.

LAPACKE_ssbevx_work 🍓

lapack_int LAPACKE_ssbevx_work (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_int kd, float * ab, lapack_int ldab,
    float * q, lapack_int ldq, float vl, float vu, lapack_int il, lapack_int
    iu, float abstol, lapack_int * m, float * w, float * z, lapack_int ldz,
    float * work, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_ssbevx_work.c.

LAPACKE_ssbgst 🧚

lapack_int LAPACKE_ssbgst (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, float * ab, lapack_int ldab,
    const float * bb, lapack_int ldbb, float * x, lapack_int ldx)

Definition at line 36 of file lapacke_ssbgst.c.

LAPACKE_ssbgst_work 👑

lapack_int LAPACKE_ssbgst_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, float * ab, lapack_int ldab,
    const float * bb, lapack_int ldbb, float * x, lapack_int ldx, float *
    work)

Definition at line 36 of file lapacke_ssbgst_work.c.

LAPACKE_ssbgv 🔥

lapack_int LAPACKE_ssbgv (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, float * ab, lapack_int ldab,
    float * bb, lapack_int ldbb, float * w, float * z, lapack_int ldz)

Definition at line 36 of file lapacke_ssbgv.c.

LAPACKE_ssbgv_work 🦋

lapack_int LAPACKE_ssbgv_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, float * ab, lapack_int ldab,
    float * bb, lapack_int ldbb, float * w, float * z, lapack_int ldz, float
    * work)

Definition at line 36 of file lapacke_ssbgv_work.c.

The _work twin of ssbgv, bestie — same whole cast of characters, but you're handing over your own work array instead of letting it fend for itself 💅


LAPACKE_ssbgvd 💖

lapack_int LAPACKE_ssbgvd (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, float * ab, lapack_int ldab,
    float * bb, lapack_int ldbb, float * w, float * z, lapack_int ldz)

Definition at line 36 of file lapacke_ssbgvd.c.

ssbgvd with no workspace of your own to pass — it just handles that internally, main character energy honestly ✨


LAPACKE_ssbgvd_work 🎀

lapack_int LAPACKE_ssbgvd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int ka, lapack_int kb, float * ab, lapack_int ldab,
    float * bb, lapack_int ldbb, float * w, float * z, lapack_int ldz, float
    * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_ssbgvd_work.c.

Look at all those workspace params — work, lwork, iwork, liwork — she's thorough, she's prepared, she's giving organized 🧚


LAPACKE_ssbgvx 🌸

lapack_int LAPACKE_ssbgvx (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, lapack_int ka, lapack_int kb, float * ab, lapack_int
    ldab, float * bb, lapack_int ldbb, float * q, lapack_int ldq, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
    float * w, float * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_ssbgvx.c.

Full parameter list absolutely ate — range, vl, vu, il, iu, abstol, plus an ifail pointer at the end there 👑


LAPACKE_ssbgvx_work 🔥

lapack_int LAPACKE_ssbgvx_work (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_int ka, lapack_int kb, float * ab,
    lapack_int ldab, float * bb, lapack_int ldbb, float * q, lapack_int ldq,
    float vl, float vu, lapack_int il, lapack_int iu, float abstol,
    lapack_int * m, float * w, float * z, lapack_int ldz, float * work,
    lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_ssbgvx_work.c.

Yeah she's long, but she's worth it — work and iwork join the party and ldz is still chilling in there 😭


LAPACKE_ssbtrd 🌈

lapack_int LAPACKE_ssbtrd (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int kd, float * ab, lapack_int ldab, float * d,
    float * e, float * q, lapack_int ldq)

Definition at line 36 of file lapacke_ssbtrd.c.

vect, uplo, kd, d, e, q, ldq — compact little crew, no notes 💜


LAPACKE_ssbtrd_work 🍓

lapack_int LAPACKE_ssbtrd_work (int matrix_layout, char vect, char uplo,
    lapack_int n, lapack_int kd, float * ab, lapack_int ldab, float * d,
    float * e, float * q, lapack_int ldq, float * work)

Definition at line 36 of file lapacke_ssbtrd_work.c.

Same as above but with a float * work tacked on the end — the little ✨extra✨


LAPACKE_ssfrk ⭐

lapack_int LAPACKE_ssfrk (int matrix_layout, char transr, char uplo, char
    trans, lapack_int n, lapack_int k, float alpha, const float * a,
    lapack_int lda, float beta, float * c)

Definition at line 36 of file lapacke_ssfrk.c.

Three chars deep — transr, uplo, trans — plus alpha and beta doing their thing 🫶


LAPACKE_ssfrk_work 🦋

lapack_int LAPACKE_ssfrk_work (int matrix_layout, char transr, char uplo,
    char trans, lapack_int n, lapack_int k, float alpha, const float * a,
    lapack_int lda, float beta, float * c)

Definition at line 36 of file lapacke_ssfrk_work.c.

Not me noticing the _work version has the exact same parameter list as the non-_work one — no extra work pointer here, that's just how she is 💀


LAPACKE_sspcon 🎀

lapack_int LAPACKE_sspcon (int matrix_layout, char uplo, lapack_int n, const
    float * ap, const lapack_int * ipiv, float anorm, float * rcond)

Definition at line 36 of file lapacke_sspcon.c.

anorm goes in, rcond comes out — and ipiv is const so bestie, do not touch 🫶


LAPACKE_sspcon_work 🌸

lapack_int LAPACKE_sspcon_work (int matrix_layout, char uplo, lapack_int n,
    const float * ap, const lapack_int * ipiv, float anorm, float * rcond,
    float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_sspcon_work.c.

Now with work and iwork — the full ensemble cast, we love to see it 💅


LAPACKE_sspev ✨

lapack_int LAPACKE_sspev (int matrix_layout, char jobz, char uplo,
    lapack_int n, float * ap, float * w, float * z, lapack_int ldz)

Definition at line 36 of file lapacke_sspev.c.

Short, sweet, jobz-driven — she said minimalism 🧚


LAPACKE_sspev_work 💜

lapack_int LAPACKE_sspev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, float * ap, float * w, float * z, lapack_int ldz, float *
    work)

Definition at line 36 of file lapacke_sspev_work.c.

sspev but you bring the work — that's the whole vibe 🔥


LAPACKE_sspevd 🌺

lapack_int LAPACKE_sspevd (int matrix_layout, char jobz, char uplo,
    lapack_int n, float * ap, float * w, float * z, lapack_int ldz)

Definition at line 36 of file lapacke_sspevd.c.

Identical parameter list to sspev, different last letter, iconic honestly ⭐


LAPACKE_sspevd_work 🦋

lapack_int LAPACKE_sspevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, float * ap, float * w, float * z, lapack_int ldz, float *
    work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_sspevd_work.c.

Four workspace params at the end — work, lwork, iwork, liwork — she brought the whole luggage set 🎀


LAPACKE_sspevx 🌈

lapack_int LAPACKE_sspevx (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, float * ap, float vl, float vu, lapack_int il,
    lapack_int iu, float abstol, lapack_int * m, float * w, float * z,
    lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_sspevx.c.

range + vl/vu + il/iu + abstol — she's asking a lot of questions and honestly? valid 🫶


LAPACKE_sspevx_work 🔥

lapack_int LAPACKE_sspevx_work (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, float * ap, float vl, float vu, lapack_int il,
    lapack_int iu, float abstol, lapack_int * m, float * w, float * z,
    lapack_int ldz, float * work, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_sspevx_work.c.

Everything from sspevx plus work and iwork — she's giving full service 💅


LAPACKE_sspgst 🍓

lapack_int LAPACKE_sspgst (int matrix_layout, lapack_int itype, char uplo,
    lapack_int n, float * ap, const float * bp)

Definition at line 36 of file lapacke_sspgst.c.

itype leads, bp is const — read-only bestie, hands off 😌


LAPACKE_sspgst_work ✨

lapack_int LAPACKE_sspgst_work (int matrix_layout, lapack_int itype, char
    uplo, lapack_int n, float * ap, const float * bp)

Definition at line 36 of file lapacke_sspgst_work.c.

Same six params, _work suffix — twin behaviour, no cap 💜


LAPACKE_sspgv 🌸

lapack_int LAPACKE_sspgv (int matrix_layout, lapack_int itype, char jobz,
    char uplo, lapack_int n, float * ap, float * bp, float * w, float * z,
    lapack_int ldz)

Definition at line 36 of file lapacke_sspgv.c.

itype, jobz, uplo, then the float army — ap, bp, w, z — and ldz closing it out 🎀


LAPACKE_sspgv_work 🦋

lapack_int LAPACKE_sspgv_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, float * ap, float * bp, float * w, float
    * z, lapack_int ldz, float * work)

Definition at line 36 of file lapacke_sspgv_work.c.

sspgv + one lonely work pointer at the end. She's lowkey just there for support 😭


LAPACKE_sspgvd ⭐

lapack_int LAPACKE_sspgvd (int matrix_layout, lapack_int itype, char jobz,
    char uplo, lapack_int n, float * ap, float * bp, float * w, float * z,
    lapack_int ldz)

Definition at line 36 of file lapacke_sspgvd.c.

Yeah the signature is literally the same as sspgv's — different file, different letter, love that for her 🌈


LAPACKE_sspgvd_work 🧚

lapack_int LAPACKE_sspgvd_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, float * ap, float * bp, float * w, float
    * z, lapack_int ldz, float * work, lapack_int lwork, lapack_int * iwork,
    lapack_int liwork)

Definition at line 36 of file lapacke_sspgvd_work.c.

work, lwork, iwork, liwork — she said bring the whole squad or don't come 🔥


LAPACKE_sspgvx 💖

lapack_int LAPACKE_sspgvx (int matrix_layout, lapack_int itype, char jobz,
    char range, char uplo, lapack_int n, float * ap, float * bp, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
    float * w, float * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_sspgvx.c.

The full range-specifying, tolerance-taking, ifail-reporting situation — she's thorough 💅


LAPACKE_sspgvx_work 👑

lapack_int LAPACKE_sspgvx_work (int matrix_layout, lapack_int itype, char
    jobz, char range, char uplo, lapack_int n, float * ap, float * bp, float
    vl, float vu, lapack_int il, lapack_int iu, float abstol, lapack_int *
    m, float * w, float * z, lapack_int ldz, float * work, lapack_int *
    iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_sspgvx_work.c.

Longest one yet and she's not apologizing for it — work, iwork, ifail, all present and accounted for 🌺


LAPACKE_ssprfs 🫶

lapack_int LAPACKE_ssprfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float * ap, const float * afp, const lapack_int *
    ipiv, const float * b, lapack_int ldb, float * x, lapack_int ldx, float
    * ferr, float * berr)

Definition at line 36 of file lapacke_ssprfs.c.

Two const floats (ap, afp), a const ipiv, a const b… the const collection is real, do not write to them 😌


LAPACKE_ssprfs_work 🌈

lapack_int LAPACKE_ssprfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float * ap, const float * afp, const lapack_int *
    ipiv, const float * b, lapack_int ldb, float * x, lapack_int ldx, float
    * ferr, float * berr, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_ssprfs_work.c.

Everything from ssprfs with work and iwork appended — and yes ferr and berr are still there 🍓


LAPACKE_sspsv ✨

lapack_int LAPACKE_sspsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, float * ap, lapack_int * ipiv, float * b, lapack_int
    ldb)

Definition at line 36 of file lapacke_sspsv.c.

uplo, n, nrhs, ap, ipiv, b, ldb — seven params and not one wasted 💜


LAPACKE_sspsv_work 🦋

lapack_int LAPACKE_sspsv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, float * ap, lapack_int * ipiv, float * b, lapack_int
    ldb)

Definition at line 36 of file lapacke_sspsv_work.c.

Exact same parameter list as sspsv — she said copy my fit but change the file name 💀


LAPACKE_sspsvx 🎀

lapack_int LAPACKE_sspsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const float * ap, float * afp, lapack_int
    * ipiv, const float * b, lapack_int ldb, float * x, lapack_int ldx,
    float * rcond, float * ferr, float * berr)

Definition at line 36 of file lapacke_sspsvx.c.

Note fact up front and ap/b marked const while afp and ipiv are not — read the consts carefully bestie 🔍


LAPACKE_sspsvx_work 🌸

lapack_int LAPACKE_sspsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const float * ap, float * afp, lapack_int
    * ipiv, const float * b, lapack_int ldb, float * x, lapack_int ldx,
    float * rcond, float * ferr, float * berr, float * work, lapack_int *
    iwork)

Definition at line 36 of file lapacke_sspsvx_work.c.

The whole sspsvx situation plus work and iwork — she's fully equipped 🧚


LAPACKE_ssptrd ⭐

lapack_int LAPACKE_ssptrd (int matrix_layout, char uplo, lapack_int n, float
    * ap, float * d, float * e, float * tau)

Definition at line 36 of file lapacke_ssptrd.c.

Short king — uplo, n, ap, d, e, tau, done 💅


LAPACKE_ssptrd_work 🌺

lapack_int LAPACKE_ssptrd_work (int matrix_layout, char uplo, lapack_int n,
    float * ap, float * d, float * e, float * tau)

Definition at line 36 of file lapacke_ssptrd_work.c.

Identical list again, _work edition — consistent queen 💖


LAPACKE_ssptrf 🔥

lapack_int LAPACKE_ssptrf (int matrix_layout, char uplo, lapack_int n, float
    * ap, lapack_int * ipiv)

Definition at line 36 of file lapacke_ssptrf.c.

Five params, zero drama — ap in, ipiv out 🫶


LAPACKE_ssptrf_work 🍓

lapack_int LAPACKE_ssptrf_work (int matrix_layout, char uplo, lapack_int n,
    float * ap, lapack_int * ipiv)

Definition at line 36 of file lapacke_ssptrf_work.c.

Same five, different file — the _work tradition continues 😌


LAPACKE_ssptri 💜

lapack_int LAPACKE_ssptri (int matrix_layout, char uplo, lapack_int n, float
    * ap, const lapack_int * ipiv)

Definition at line 36 of file lapacke_ssptri.c.

ipiv is const here — read only, no take-backs 💅


LAPACKE_ssptri_work ✨

lapack_int LAPACKE_ssptri_work (int matrix_layout, char uplo, lapack_int n,
    float * ap, const lapack_int * ipiv, float * work)

Definition at line 36 of file lapacke_ssptri_work.c.

Now with a work pointer — she remembered her bag this time 🎀


LAPACKE_ssptrs 🦋

lapack_int LAPACKE_ssptrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float * ap, const lapack_int * ipiv, float * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_ssptrs.c.

ap and ipiv const, b writable — she knows exactly which arrays she's allowed to mess with 🔍


LAPACKE_ssptrs_work 🌈

lapack_int LAPACKE_ssptrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const float * ap, const lapack_int * ipiv, float * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_ssptrs_work.c.

Same eight params verbatim, _work in the name — that's it, that's the whole difference here ⭐


LAPACKE_sstebz 👑

lapack_int LAPACKE_sstebz (char range, char order, lapack_int n, float vl,
    float vu, lapack_int il, lapack_int iu, float abstol, const float * d,
    const float * e, lapack_int * m, lapack_int * nsplit, float * w,
    lapack_int * iblock, lapack_int * isplit)

Definition at line 36 of file lapacke_sstebz.c.

Okay wait — no matrix_layout here, she starts straight at range and order 😭 and d/e are const. Mark that, bestie.


LAPACKE_sstebz_work 🌸

lapack_int LAPACKE_sstebz_work (char range, char order, lapack_int n, float
    vl, float vu, lapack_int il, lapack_int iu, float abstol, const float *
    d, const float * e, lapack_int * m, lapack_int * nsplit, float * w,
    lapack_int * iblock, lapack_int * isplit, float * work, lapack_int *
    iwork)

Definition at line 36 of file lapacke_sstebz_work.c.

Also no matrix_layout — she matches her sister — plus work and iwork on the tail end 🧚


LAPACKE_sstedc 💖

lapack_int LAPACKE_sstedc (int matrix_layout, char compz, lapack_int n,
    float * d, float * e, float * z, lapack_int ldz)

Definition at line 36 of file lapacke_sstedc.c.

compz is the vibe-setter here, then d, e, z, ldz — short and slay 🔥


LAPACKE_sstedc_work 🌺

lapack_int LAPACKE_sstedc_work (int matrix_layout, char compz, lapack_int n,
    float * d, float * e, float * z, lapack_int ldz, float * work,
    lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_sstedc_work.c.

And she closes with the full workspace quartet — work, lwork, iwork, liwork — go off, honestly 💜

🫶 LAPACKE_sstegr 🫶

lapack_int LAPACKE_sstegr (int matrix_layout, char jobz, char range,
        lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
        lapack_int iu, float abstol, lapack_int * m, float * w, float * z,
        lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_sstegr.c.

okay so this one's lowkey stacked with args — matrix_layout, jobz, range, n, then the d/e float pointers, vl, vu, il, iu, the abstol, out comes m, w, z, ldz, and isuppz at the end. She's got range, literally. 💅


✨ LAPACKE_sstegr_work ✨

lapack_int LAPACKE_sstegr_work (int matrix_layout, char jobz, char range,
        lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
        lapack_int iu, float abstol, lapack_int * m, float * w, float * z,
        lapack_int ldz, lapack_int * isuppz, float * work, lapack_int lwork,
        lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_sstegr_work.c.

same whole vibe as her sister but now you're the one bringing the workspace: work, lwork, iwork, liwork. main character energy where you supply the scratch space. 🧚


🌸 LAPACKE_sstein 🌸

lapack_int LAPACKE_sstein (int matrix_layout, lapack_int n, const float * d,
        const float * e, lapack_int m, const float * w, const lapack_int *
        iblock, const lapack_int * isplit, float * z, lapack_int ldz, lapack_int
        * ifailv)

Definition at line 36 of file lapacke_sstein.c.

not me noticing the const glow-up on d, e, w, iblock and isplit — read-only besties, we respect them. z and ifailv are the mutable ones doing the werk. 🙈


💜 LAPACKE_sstein_work 💜

lapack_int LAPACKE_sstein_work (int matrix_layout, lapack_int n, const float
        * d, const float * e, lapack_int m, const float * w, const lapack_int *
        iblock, const lapack_int * isplit, float * z, lapack_int ldz, float *
        work, lapack_int * iwork, lapack_int * ifailv)

Definition at line 36 of file lapacke_sstein_work.c.

the _work edition drags work and iwork along for the ride, and ifailv is still sitting there at the end like 👑. note there's no lwork/liwork here — that's not me being shady, that's genuinely just what the signature says, fr fr.


🦋 LAPACKE_sstemr 🦋

lapack_int LAPACKE_sstemr (int matrix_layout, char jobz, char range,
        lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
        lapack_int iu, lapack_int * m, float * w, float * z, lapack_int ldz,
        lapack_int nzc, lapack_int * isuppz, lapack_logical * tryrac)

Definition at line 36 of file lapacke_sstemr.c.

we got nzc in the building AND a lapack_logical * tryrac at the very end — yes bestie, lapack_logical, not lapack_int, don't come for me, that's literally what's written. ⭐


🌈 LAPACKE_sstemr_work 🌈

lapack_int LAPACKE_sstemr_work (int matrix_layout, char jobz, char range,
        lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
        lapack_int iu, lapack_int * m, float * w, float * z, lapack_int ldz,
        lapack_int nzc, lapack_int * isuppz, lapack_logical * tryrac, float *
        work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_sstemr_work.c.

everything from the non-_work version plus work, lwork, iwork, liwork. she ate and left zero crumbs. 🔥


🎀 LAPACKE_ssteqr 🎀

lapack_int LAPACKE_ssteqr (int matrix_layout, char compz, lapack_int n,
        float * d, float * e, float * z, lapack_int ldz)

Definition at line 36 of file lapacke_ssteqr.c.

short queen! matrix_layout, compz, n, then d, e, z, ldz. that's it, that's the whole squad. 🫶


💅 LAPACKE_ssteqr_work 💅

lapack_int LAPACKE_ssteqr_work (int matrix_layout, char compz, lapack_int n,
        float * d, float * e, float * z, lapack_int ldz, float * work)

Definition at line 36 of file lapacke_ssteqr_work.c.

identical energy, except one extra float * work tagged on the end like the last sticker on your laptop. ✨


🍓 LAPACKE_ssterf 🍓

lapack_int LAPACKE_ssterf (lapack_int n, float * d, float * e)

Definition at line 36 of file lapacke_ssterf.c.

bestie. look at this. no matrix_layout. no ldz. just n, d, e. minimalist icon, honestly obsessed. 😭


🌸 LAPACKE_ssterf_work 🌸

lapack_int LAPACKE_ssterf_work (lapack_int n, float * d, float * e)

Definition at line 36 of file lapacke_ssterf_work.c.

the _work version has the exact same signature as the plain one — lapack_int n, float * d, float * e, no extra args. yes really. yes I checked. no I'm not being weird about it. 💀


⭐ LAPACKE_sstev ⭐

lapack_int LAPACKE_sstev (int matrix_layout, char jobz, lapack_int n, float
        * d, float * e, float * z, lapack_int ldz)

Definition at line 36 of file lapacke_sstev.c.

back to the classic lineup: matrix_layout, jobz, n, d, e, z, ldz. comfort routine, lowkey. 🎀


🦋 LAPACKE_sstev_work 🦋

lapack_int LAPACKE_sstev_work (int matrix_layout, char jobz, lapack_int n,
        float * d, float * e, float * z, lapack_int ldz, float * work)

Definition at line 36 of file lapacke_sstev_work.c.

same seven, plus work gliding in at the end like she was always invited. 💜


👑 LAPACKE_sstevd 👑

lapack_int LAPACKE_sstevd (int matrix_layout, char jobz, lapack_int n, float
        * d, float * e, float * z, lapack_int ldz)

Definition at line 36 of file lapacke_sstevd.c.

d version, same arg list as sstev — matrix_layout, jobz, n, d, e, z, ldz. don't let the single letter fool you, she's her own routine. 🔥


🌈 LAPACKE_sstevd_work 🌈

lapack_int LAPACKE_sstevd_work (int matrix_layout, char jobz, lapack_int n,
        float * d, float * e, float * z, lapack_int ldz, float * work,
        lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_sstevd_work.c.

now THIS _work went all out: work, lwork, iwork, liwork. four extra params, zero regrets. she understood the assignment. 💅


💖 LAPACKE_sstevr 💖

lapack_int LAPACKE_sstevr (int matrix_layout, char jobz, char range,
        lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
        lapack_int iu, float abstol, lapack_int * m, float * w, float * z,
        lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_sstevr.c.

the r girlie brought out the whole cast: range, vl, vu, il, iu, abstol, m, w, z, ldz, isuppz. no notes. 🫶


✨ LAPACKE_sstevr_work ✨

lapack_int LAPACKE_sstevr_work (int matrix_layout, char jobz, char range,
        lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
        lapack_int iu, float abstol, lapack_int * m, float * w, float * z,
        lapack_int ldz, lapack_int * isuppz, float * work, lapack_int lwork,
        lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_sstevr_work.c.

same lineup + work, lwork, iwork, liwork. the _work pipeline is consistent and honestly iconic. ⭐


🎀 LAPACKE_sstevx 🎀

lapack_int LAPACKE_sstevx (int matrix_layout, char jobz, char range,
        lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
        lapack_int iu, float abstol, lapack_int * m, float * w, float * z,
        lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_sstevx.c.

x version! same as sstevr but the last param is lapack_int * ifail instead of isuppz. yes that's the difference. no I won't elaborate further than the signature allows. 🙈


💜 LAPACKE_sstevx_work 💜

lapack_int LAPACKE_sstevx_work (int matrix_layout, char jobz, char range,
        lapack_int n, float * d, float * e, float vl, float vu, lapack_int il,
        lapack_int iu, float abstol, lapack_int * m, float * w, float * z,
        lapack_int ldz, float * work, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_sstevx_work.c.

and here's the plot twist: _work adds work and iwork, but there's no lwork or liwork in this one. that's not a typo, that's literally the signature, babe. 😭


🧚 LAPACKE_ssycon 🧚

lapack_int LAPACKE_ssycon (int matrix_layout, char uplo, lapack_int n, const
        float * a, lapack_int lda, const lapack_int * ipiv, float anorm, float *
        rcond)

Definition at line 36 of file lapacke_ssycon.c.

new prefix, who dis — ssy era begins 💅 uplo, n, const float * a, lda, const lapack_int * ipiv, then anorm and out comes rcond. 🦋


🌸 LAPACKE_ssycon_3 🌸

lapack_int LAPACKE_ssycon_3 (int matrix_layout, char uplo, lapack_int n,
        const float * a, lapack_int lda, const float * e, const lapack_int *
        ipiv, float anorm, float * rcond)

Definition at line 36 of file lapacke_ssycon_3.c.

the _3 variant slides a const float * e in right after lda, before ipiv. everything else is unchanged. she's an extra-credit student. ⭐


🎀 LAPACKE_ssycon_3_work 🎀

lapack_int LAPACKE_ssycon_3_work (int matrix_layout, char uplo, lapack_int
        n, const float * a, lapack_int lda, const float * e, const lapack_int *
        ipiv, float anorm, float * rcond, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_ssycon_3_work.c.

_3 plus work and iwork. yes the name is LAPACKE_ssycon_3_work, yes it has two suffixes, no that's not a glitch. 💀


🦋 LAPACKE_ssycon_work 🦋

lapack_int LAPACKE_ssycon_work (int matrix_layout, char uplo, lapack_int n,
        const float * a, lapack_int lda, const lapack_int * ipiv, float anorm,
        float * rcond, float * work, lapack_int * iwork)

Definition at line 36 of file lapacke_ssycon_work.c.

the plain one plus work and iwork — note: no e here, that's the _3 girlie's thing. keep up bestie 📝


🔥 LAPACKE_ssyconv 🔥

lapack_int LAPACKE_ssyconv (int matrix_layout, char uplo, char way,
        lapack_int n, float * a, lapack_int lda, const lapack_int * ipiv, float
        * e)

Definition at line 36 of file lapacke_ssyconv.c.

okay there's a char way in here and I am obsessed — she literally has a "way" parameter, main character behavior honestly 👑 also a and e are writable while ipiv stays const. 🎀


🍓 LAPACKE_ssyconv_work 🍓

lapack_int LAPACKE_ssyconv_work (int matrix_layout, char uplo, char way,
        lapack_int n, float * a, lapack_int lda, const lapack_int * ipiv, float
        * e)

Definition at line 36 of file lapacke_ssyconv_work.c.

identical signature to the non-_work version — same matrix_layout, uplo, way, n, a, lda, ipiv, e. no extra work params. that's just how she is. ✨


🌈 LAPACKE_ssyequb 🌈

lapack_int LAPACKE_ssyequb (int matrix_layout, char uplo, lapack_int n,
        const float * a, lapack_int lda, float * s, float * scond, float * amax)

Definition at line 36 of file lapacke_ssyequb.c.

equb era 🫶 takes a + lda, hands you s, scond and amax. three outputs, one little function. she's generous. 💖


💜 LAPACKE_ssyequb_work 💜

lapack_int LAPACKE_ssyequb_work (int matrix_layout, char uplo, lapack_int n,
        const float * a, lapack_int lda, float * s, float * scond, float * amax,
        float * work)

Definition at line 36 of file lapacke_ssyequb_work.c.

exactly the same plus one lonely float * work at the end. no lwork, no iwork — just work, doing her solo. ⭐


👑 LAPACKE_ssyev 👑

lapack_int LAPACKE_ssyev (int matrix_layout, char jobz, char uplo,
        lapack_int n, float * a, lapack_int lda, float * w)

Definition at line 36 of file lapacke_ssyev.c.

the classic seven: matrix_layout, jobz, uplo, n, a, lda, w. the blueprint, the template, the moment. 💅


✨ LAPACKE_ssyev_2stage ✨

lapack_int LAPACKE_ssyev_2stage (int matrix_layout, char jobz, char uplo,
        lapack_int n, float * a, lapack_int lda, float * w)

Definition at line 36 of file lapacke_ssyev_2stage.c.

TWO STAGE. two. stage. and the signature is character-for-character the same as LAPACKE_ssyev — same args, same order. the drama is all in the name, bestie. 🎀


🦋 LAPACKE_ssyev_2stage_work 🦋

lapack_int LAPACKE_ssyev_2stage_work (int matrix_layout, char jobz, char
        uplo, lapack_int n, float * a, lapack_int lda, float * w, float * work,
        lapack_int lwork)

Definition at line 36 of file lapacke_ssyev_2stage_work.c.

_2stage_work — say it five times fast 😭 adds work and lwork. no iwork, no liwork. keep that in mind for the next one. 🙈


🌸 LAPACKE_ssyev_work 🌸

lapack_int LAPACKE_ssyev_work (int matrix_layout, char jobz, char uplo,
        lapack_int n, float * a, lapack_int lda, float * w, float * work,
        lapack_int lwork)

Definition at line 36 of file lapacke_ssyev_work.c.

base ssyev plus work and lwork. same tail as the _2stage_work version, for the record. 🫶


💖 LAPACKE_ssyevd 💖

lapack_int LAPACKE_ssyevd (int matrix_layout, char jobz, char uplo,
        lapack_int n, float * a, lapack_int lda, float * w)

Definition at line 36 of file lapacke_ssyevd.c.

d suffix, same seven params as ssyev and ssyev_2stage. she's part of the matched set, collector's item. 🌈


🌟 LAPACKE_ssyevd_2stage 🌟

lapack_int LAPACKE_ssyevd_2stage (int matrix_layout, char jobz, char uplo,
        lapack_int n, float * a, lapack_int lda, float * w)

Definition at line 36 of file lapacke_ssyevd_2stage.c.

d AND 2stage in one name. truly the crossover event nobody asked for but everybody needed. signature = the standard seven, again. 💜


🎀 LAPACKE_ssyevd_2stage_work 🎀

lapack_int LAPACKE_ssyevd_2stage_work (int matrix_layout, char jobz, char
        uplo, lapack_int n, float * a, lapack_int lda, float * w, float * work,
        lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_ssyevd_2stage_work.c.

okay this _work goes FULL send: work, lwork, iwork, liwork. four extra. she brought the whole friend group. 🔥


⭐ LAPACKE_ssyevd_work ⭐

lapack_int LAPACKE_ssyevd_work (int matrix_layout, char jobz, char uplo,
        lapack_int n, float * a, lapack_int lda, float * w, float * work,
        lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_ssyevd_work.c.

same four extra params as her _2stage twin — work, lwork, iwork, liwork. matched energies, fr fr. ✨


🦋 LAPACKE_ssyevr 🦋

lapack_int LAPACKE_ssyevr (int matrix_layout, char jobz, char range, char
        uplo, lapack_int n, float * a, lapack_int lda, float vl, float vu,
        lapack_int il, lapack_int iu, float abstol, lapack_int * m, float * w,
        float * z, lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_ssyevr.c.

the r girlie is a long function, look at her go 😭 range, vl, vu, il, iu, abstol, then m, w, z, ldz, and isuppz closing it out. icon. 👑


🌈 LAPACKE_ssyevr_2stage 🌈

lapack_int LAPACKE_ssyevr_2stage (int matrix_layout, char jobz, char range,
        char uplo, lapack_int n, float * a, lapack_int lda, float vl, float vu,
        lapack_int il, lapack_int iu, float abstol, lapack_int * m, float * w,
        float * z, lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_ssyevr_2stage.c.

ssyevr but _2stage, and the signature is literally identical to plain ssyevr. eighteen params of pure commitment. 💅


💜 LAPACKE_ssyevr_2stage_work 💜

lapack_int LAPACKE_ssyevr_2stage_work (int matrix_layout, char jobz, char
        range, char uplo, lapack_int n, float * a, lapack_int lda, float vl,
        float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
        float * w, float * z, lapack_int ldz, lapack_int * isuppz, float * work,
        lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_ssyevr_2stage_work.c.

allll of that plus work, lwork, iwork, liwork. this is the longest signature so far and she's thriving, ngl. 🫶


🎀 LAPACKE_ssyevr_work 🎀

lapack_int LAPACKE_ssyevr_work (int matrix_layout, char jobz, char range,
        char uplo, lapack_int n, float * a, lapack_int lda, float vl, float vu,
        lapack_int il, lapack_int iu, float abstol, lapack_int * m, float * w,
        float * z, lapack_int ldz, lapack_int * isuppz, float * work, lapack_int
        lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_ssyevr_work.c.

note lapack_int lwork sits on its own wrapped line here — that's just the manpage's line break, she's still the same param bestie 💖 same tail four: work, lwork, iwork, liwork.


⭐ LAPACKE_ssyevx ⭐

lapack_int LAPACKE_ssyevx (int matrix_layout, char jobz, char range, char
        uplo, lapack_int n, float * a, lapack_int lda, float vl, float vu,
        lapack_int il, lapack_int iu, float abstol, lapack_int * m, float * w,
        float * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_ssyevx.c.

x marks the spot ✨ same big lineup as ssyevr but the final param is lapack_int * ifail instead of isuppz. that's the tea. 🍓


🌟 LAPACKE_ssyevx_2stage 🌟

lapack_int LAPACKE_ssyevx_2stage (int matrix_layout, char jobz, char range,
        char uplo, lapack_int n, float * a, lapack_int lda, float vl, float vu,
        lapack_int il, lapack_int iu, float abstol, lapack_int * m, float * w,
        float * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_ssyevx_2stage.c.

_2stage again, still ending on ifail, still identical args to plain ssyevx. consistent queen. 👑


🧚 LAPACKE_ssyevx_2stage_work 🧚

lapack_int LAPACKE_ssyevx_2stage_work (int matrix_layout, char jobz, char
        range, char uplo, lapack_int n, float * a, lapack_int lda, float vl,
        float vu, lapack_int il, lapack_int iu, float abstol, lapack_int * m,
        float * w, float * z, lapack_int ldz, float * work, lapack_int lwork,
        lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_ssyevx_2stage_work.c.

heads up bestie: this _work adds work, lwork and iwork — but no liwork, and ifail comes last, after the workspace. read it twice, I did. 😭


💖 LAPACKE_ssyevx_work 💖

lapack_int LAPACKE_ssyevx_work (int matrix_layout, char jobz, char range,
        char uplo, lapack_int n, float * a, lapack_int lda, float vl, float vu,
        lapack_int il, lapack_int iu, float abstol, lapack_int * m, float * w,
        float * z, lapack_int ldz, float * work, lapack_int lwork, lapack_int *
        iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_ssyevx_work.c.

and the final boss of this batch: same as the _2stage_work version, tail is work, lwork, iwork, ifail. three workspace params, no liwork, ifail bringing up the rear. periodt. 🫶


Okay so we're still rolling through the function list and literally every single one of these is chilling at line 36 of its own file — the consistency is genuinely iconic 🎀

LAPACKE_ssygst 💅

   lapack_int LAPACKE_ssygst (int matrix_layout, lapack_int itype, char uplo,
       lapack_int n, float * a, lapack_int lda, const float * b, lapack_int
       ldb)

Definition at line 36 of file lapacke_ssygst.c.


LAPACKE_ssygst_work ✨ — same name with that _work garnish, in a file of its very own.

   lapack_int LAPACKE_ssygst_work (int matrix_layout, lapack_int itype, char
       uplo, lapack_int n, float * a, lapack_int lda, const float * b,
       lapack_int ldb)

Definition at line 36 of file lapacke_ssygst_work.c.


LAPACKE_ssygv 🦋 — bestie this one brought jobz and w to the party.

   lapack_int LAPACKE_ssygv (int matrix_layout, lapack_int itype, char jobz,
       char uplo, lapack_int n, float * a, lapack_int lda, float * b,
       lapack_int ldb, float * w)

Definition at line 36 of file lapacke_ssygv.c.


LAPACKE_ssygv_2stage 🌸 — yes the 2stage variant is real and yes she's got the exact same arg list, no cap.

   lapack_int LAPACKE_ssygv_2stage (int matrix_layout, lapack_int itype, char
       jobz, char uplo, lapack_int n, float * a, lapack_int lda, float * b,
       lapack_int ldb, float * w)

Definition at line 36 of file lapacke_ssygv_2stage.c.


LAPACKE_ssygv_2stage_work 🔥 — the _2stage one, but with work and lwork pulled up.

   lapack_int LAPACKE_ssygv_2stage_work (int matrix_layout, lapack_int itype,
       char jobz, char uplo, lapack_int n, float * a, lapack_int lda, float *
       b, lapack_int ldb, float * w, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_ssygv_2stage_work.c.


LAPACKE_ssygv_work 💜 — the work-y twin of LAPACKE_ssygv, same energy, extra args.

   lapack_int LAPACKE_ssygv_work (int matrix_layout, lapack_int itype, char
       jobz, char uplo, lapack_int n, float * a, lapack_int lda, float * b,
       lapack_int ldb, float * w, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_ssygv_work.c.


LAPACKE_ssygvd 🎀 — note the d on the end, that's a whole different function, don't mix them up.

   lapack_int LAPACKE_ssygvd (int matrix_layout, lapack_int itype, char jobz,
       char uplo, lapack_int n, float * a, lapack_int lda, float * b,
       lapack_int ldb, float * w)

Definition at line 36 of file lapacke_ssygvd.c.


LAPACKE_ssygvd_work ⭐ — look at this arg list, she's eating. work, lwork, iwork and liwork all invited.

   lapack_int LAPACKE_ssygvd_work (int matrix_layout, lapack_int itype, char
       jobz, char uplo, lapack_int n, float * a, lapack_int lda, float * b,
       lapack_int ldb, float * w, float * work, lapack_int lwork, lapack_int *
       iwork, lapack_int liwork)

Definition at line 36 of file lapacke_ssygvd_work.c.


LAPACKE_ssygvx 🌈 — the x variant said "let me add range, vl, vu, il, iu, abstol, m, z, ldz and ifail" and honestly? Main character behaviour.

   lapack_int LAPACKE_ssygvx (int matrix_layout, lapack_int itype, char jobz,
       char range, char uplo, lapack_int n, float * a, lapack_int lda, float *
       b, lapack_int ldb, float vl, float vu, lapack_int il, lapack_int iu,
       float abstol, lapack_int * m, float * w, float * z, lapack_int ldz,
       lapack_int * ifail)

Definition at line 36 of file lapacke_ssygvx.c.


LAPACKE_ssygvx_work 😭 — everything ssygvx has, plus work, lwork and iwork. It's giving maximalist.

   lapack_int LAPACKE_ssygvx_work (int matrix_layout, lapack_int itype, char
       jobz, char range, char uplo, lapack_int n, float * a, lapack_int lda,
       float * b, lapack_int ldb, float vl, float vu, lapack_int il, lapack_int
       iu, float abstol, lapack_int * m, float * w, float * z, lapack_int ldz,
       float * work, lapack_int lwork, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_ssygvx_work.c.


LAPACKE_ssyrfs 🫶 — new name prefix, ssyrfs, and she's bringing ferr and berr along.

   lapack_int LAPACKE_ssyrfs (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const float * a, lapack_int lda, const float * af,
       lapack_int ldaf, const lapack_int * ipiv, const float * b, lapack_int
       ldb, float * x, lapack_int ldx, float * ferr, float * berr)

Definition at line 36 of file lapacke_ssyrfs.c.


LAPACKE_ssyrfs_work 🍓 — same situation, now with work and iwork tacked on the end. Classic.

   lapack_int LAPACKE_ssyrfs_work (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, const float * a, lapack_int lda, const float * af,
       lapack_int ldaf, const lapack_int * ipiv, const float * b, lapack_int
       ldb, float * x, lapack_int ldx, float * ferr, float * berr, float *
       work, lapack_int * iwork)

Definition at line 36 of file lapacke_ssyrfs_work.c.


LAPACKE_ssyrfsx 🧚 — okay the x versions are always the ones with the long cast list, and this one has equed, s, rcond, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams and params. Obsessed.

   lapack_int LAPACKE_ssyrfsx (int matrix_layout, char uplo, char equed,
       lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const
       float * af, lapack_int ldaf, const lapack_int * ipiv, const float * s,
       const float * b, lapack_int ldb, float * x, lapack_int ldx, float *
       rcond, float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float
       * err_bnds_comp, lapack_int nparams, float * params)

Definition at line 36 of file lapacke_ssyrfsx.c.


LAPACKE_ssyrfsx_work 👑 — the _work version keeps every single one of those and then adds work and iwork because why not.

   lapack_int LAPACKE_ssyrfsx_work (int matrix_layout, char uplo, char equed,
       lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const
       float * af, lapack_int ldaf, const lapack_int * ipiv, const float * s,
       const float * b, lapack_int ldb, float * x, lapack_int ldx, float *
       rcond, float * berr, lapack_int n_err_bnds, float * err_bnds_norm, float
       * err_bnds_comp, lapack_int nparams, float * params, float * work,
       lapack_int * iwork)

Definition at line 36 of file lapacke_ssyrfsx_work.c.


LAPACKE_ssysv 💖 — short and sweet: uplo, n, nrhs, a, lda, ipiv, b, ldb. Breath of fresh air ngl.

   lapack_int LAPACKE_ssysv (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, float * a, lapack_int lda, lapack_int * ipiv, float *
       b, lapack_int ldb)

Definition at line 36 of file lapacke_ssysv.c.


LAPACKE_ssysv_aa 🦋 — the _aa remix, same arg list as above, different file.

   lapack_int LAPACKE_ssysv_aa (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, float * a, lapack_int lda, lapack_int * ipiv, float *
       b, lapack_int ldb)

Definition at line 36 of file lapacke_ssysv_aa.c.


LAPACKE_ssysv_aa_2stage ✨ — aa and 2stage?? She said let me add tb, ltb and a second ipiv2 while I'm here.

   lapack_int LAPACKE_ssysv_aa_2stage (int matrix_layout, char uplo, lapack_int
       n, lapack_int nrhs, float * a, lapack_int lda, float * tb, lapack_int
       ltb, lapack_int * ipiv, lapack_int * ipiv2, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_ssysv_aa_2stage.c.


LAPACKE_ssysv_aa_2stage_work 💀 — every one of those, plus work and lwork. Respectfully, that's a lot of args.

   lapack_int LAPACKE_ssysv_aa_2stage_work (int matrix_layout, char uplo,
       lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * tb,
       lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, float * b,
       lapack_int ldb, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_ssysv_aa_2stage_work.c.


LAPACKE_ssysv_aa_work 🌸 — the _aa one with work/lwork added on. Standard procedure.

   lapack_int LAPACKE_ssysv_aa_work (int matrix_layout, char uplo, lapack_int
       n, lapack_int nrhs, float * a, lapack_int lda, lapack_int * ipiv, float
       * b, lapack_int ldb, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_ssysv_aa_work.c.


LAPACKE_ssysv_rk 💜 — the _rk flavour, serving e and ipiv together.

   lapack_int LAPACKE_ssysv_rk (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, float * a, lapack_int lda, float * e, lapack_int *
       ipiv, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_ssysv_rk.c.


LAPACKE_ssysv_rk_work 🎀 — same but with the work/lwork duo.

   lapack_int LAPACKE_ssysv_rk_work (int matrix_layout, char uplo, lapack_int
       n, lapack_int nrhs, float * a, lapack_int lda, float * e, lapack_int *
       ipiv, float * b, lapack_int ldb, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_ssysv_rk_work.c.


LAPACKE_ssysv_rook 🔥 — _rook variant, same shape as plain ssysv.

   lapack_int LAPACKE_ssysv_rook (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, float * a, lapack_int lda, lapack_int * ipiv, float *
       b, lapack_int ldb)

Definition at line 36 of file lapacke_ssysv_rook.c.


LAPACKE_ssysv_rook_work 🌈 — _rook plus work/lwork, as the pattern demands.

   lapack_int LAPACKE_ssysv_rook_work (int matrix_layout, char uplo, lapack_int
       n, lapack_int nrhs, float * a, lapack_int lda, lapack_int * ipiv, float
       * b, lapack_int ldb, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_ssysv_rook_work.c.


LAPACKE_ssysv_work 🫶 — the base ssysv with the work args, nothing spicy, just consistent.

   lapack_int LAPACKE_ssysv_work (int matrix_layout, char uplo, lapack_int n,
       lapack_int nrhs, float * a, lapack_int lda, lapack_int * ipiv, float *
       b, lapack_int ldb, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_ssysv_work.c.


LAPACKE_ssysvx 🍓 — x marks the spot: fact shows up, and so do rcond, ferr and berr.

   lapack_int LAPACKE_ssysvx (int matrix_layout, char fact, char uplo,
       lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, float *
       af, lapack_int ldaf, lapack_int * ipiv, const float * b, lapack_int ldb,
       float * x, lapack_int ldx, float * rcond, float * ferr, float * berr)

Definition at line 36 of file lapacke_ssysvx.c.


LAPACKE_ssysvx_work 🧚 — all of that plus work, lwork and iwork. She's thorough.

   lapack_int LAPACKE_ssysvx_work (int matrix_layout, char fact, char uplo,
       lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, float *
       af, lapack_int ldaf, lapack_int * ipiv, const float * b, lapack_int ldb,
       float * x, lapack_int ldx, float * rcond, float * ferr, float * berr,
       float * work, lapack_int lwork, lapack_int * iwork)

Definition at line 36 of file lapacke_ssysvx_work.c.


LAPACKE_ssysvxx 👑 — two x's, so you know it's extra. Note equed and s are non-const pointers here — everything is getting written to, iykyk.

   lapack_int LAPACKE_ssysvxx (int matrix_layout, char fact, char uplo,
       lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * af,
       lapack_int ldaf, lapack_int * ipiv, char * equed, float * s, float * b,
       lapack_int ldb, float * x, lapack_int ldx, float * rcond, float *
       rpvgrw, float * berr, lapack_int n_err_bnds, float * err_bnds_norm,
       float * err_bnds_comp, lapack_int nparams, float * params)

Definition at line 36 of file lapacke_ssysvxx.c.


LAPACKE_ssysvxx_work 💖 — the longest one yet, and yes, rpvgrw is really spelled like that.

   lapack_int LAPACKE_ssysvxx_work (int matrix_layout, char fact, char uplo,
       lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * af,
       lapack_int ldaf, lapack_int * ipiv, char * equed, float * s, float * b,
       lapack_int ldb, float * x, lapack_int ldx, float * rcond, float *
       rpvgrw, float * berr, lapack_int n_err_bnds, float * err_bnds_norm,
       float * err_bnds_comp, lapack_int nparams, float * params, float * work,
       lapack_int * iwork)

Definition at line 36 of file lapacke_ssysvxx_work.c.


LAPACKE_ssyswapr 💅 — short queen. matrix_layout, uplo, n, a, lda, i1, i2, done.

   lapack_int LAPACKE_ssyswapr (int matrix_layout, char uplo, lapack_int n,
       float * a, lapack_int lda, lapack_int i1, lapack_int i2)

Definition at line 36 of file lapacke_ssyswapr.c.


LAPACKE_ssyswapr_work ⭐ — identical arg list to the one above, but she lives in the _work file.

   lapack_int LAPACKE_ssyswapr_work (int matrix_layout, char uplo, lapack_int
       n, float * a, lapack_int lda, lapack_int i1, lapack_int i2)

Definition at line 36 of file lapacke_ssyswapr_work.c.


LAPACKE_ssytrd 🌺 — new prefix ssytrd, bringing d, e and tau to the function.

   lapack_int LAPACKE_ssytrd (int matrix_layout, char uplo, lapack_int n, float
       * a, lapack_int lda, float * d, float * e, float * tau)

Definition at line 36 of file lapacke_ssytrd.c.


LAPACKE_ssytrd_work 🦋 — same, plus work and lwork. You already know the drill.

   lapack_int LAPACKE_ssytrd_work (int matrix_layout, char uplo, lapack_int n,
       float * a, lapack_int lda, float * d, float * e, float * tau, float *
       work, lapack_int lwork)

Definition at line 36 of file lapacke_ssytrd_work.c.


LAPACKE_ssytrf ✨ — ssytrf, short and tidy, with ipiv in the mix.

   lapack_int LAPACKE_ssytrf (int matrix_layout, char uplo, lapack_int n, float
       * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_ssytrf.c.


LAPACKE_ssytrf_aa 💜 — the _aa take, same arg list.

   lapack_int LAPACKE_ssytrf_aa (int matrix_layout, char uplo, lapack_int n,
       float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_ssytrf_aa.c.


LAPACKE_ssytrf_aa_2stage 🔥 — aa + 2stage + tb, ltb, ipiv and ipiv2. She's doing the most and honestly? Slay.

   lapack_int LAPACKE_ssytrf_aa_2stage (int matrix_layout, char uplo,
       lapack_int n, float * a, lapack_int lda, float * tb, lapack_int ltb,
       lapack_int * ipiv, lapack_int * ipiv2)

Definition at line 36 of file lapacke_ssytrf_aa_2stage.c.


LAPACKE_ssytrf_aa_2stage_work 😭 — that entire cast list plus work and lwork. Take a breath bestie.

   lapack_int LAPACKE_ssytrf_aa_2stage_work (int matrix_layout, char uplo,
       lapack_int n, float * a, lapack_int lda, float * tb, lapack_int ltb,
       lapack_int * ipiv, lapack_int * ipiv2, float * work, lapack_int lwork)

Definition at line 36 of file lapacke_ssytrf_aa_2stage_work.c.


LAPACKE_ssytrf_aa_work 🌸 — _aa with the work/lwork add-on. Consistent to the end.

   lapack_int LAPACKE_ssytrf_aa_work (int matrix_layout, char uplo, lapack_int
       n, float * a, lapack_int lda, lapack_int * ipiv, float * work,
       lapack_int lwork)

Definition at line 36 of file lapacke_ssytrf_aa_work.c.


LAPACKE_ssytrf_rk 🎀 — the _rk sibling, back with e and ipiv.

   lapack_int LAPACKE_ssytrf_rk (int matrix_layout, char uplo, lapack_int n,
       float * a, lapack_int lda, float * e, lapack_int * ipiv)

Definition at line 36 of file lapacke_ssytrf_rk.c.


LAPACKE_ssytrf_rk_work 💀 — _rk plus work/lwork, exactly like you'd expect.

   lapack_int LAPACKE_ssytrf_rk_work (int matrix_layout, char uplo, lapack_int
       n, float * a, lapack_int lda, float * e, lapack_int * ipiv, float *
       work, lapack_int lwork)

Definition at line 36 of file lapacke_ssytrf_rk_work.c.


LAPACKE_ssytrf_rook 🍓 — and finally for this stretch, the _rook one, closing us out with the same tidy a, lda, ipiv trio.

   lapack_int LAPACKE_ssytrf_rook (int matrix_layout, char uplo, lapack_int n,
       float * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_ssytrf_rook.c.

LAPACKE_ssytrf_rook_work 💅

lapack_int LAPACKE_ssytrf_rook_work (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda, lapack_int * ipiv, float * work, lapack_int lwork)

rook flavour and a _work variant?? okay multitasking icon ✨

Definition at line 36 of file lapacke_ssytrf_rook_work.c.

LAPACKE_ssytrf_work 🎀

lapack_int LAPACKE_ssytrf_work (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda, lapack_int * ipiv, float * work, lapack_int lwork)

same float crew, no rook in the name, work + lwork still invited to the party 🫶

Definition at line 36 of file lapacke_ssytrf_work.c.

LAPACKE_ssytri 🦋

lapack_int LAPACKE_ssytri (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda, const lapack_int * ipiv)

short, sweet, ipiv is const here so bestie's just reading, not touching 😌

Definition at line 36 of file lapacke_ssytri.c.

LAPACKE_ssytri2 🌸

lapack_int LAPACKE_ssytri2 (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda, const lapack_int * ipiv)

the 2 sequel, same exact parameter list, no extra baggage 💖

Definition at line 36 of file lapacke_ssytri2.c.

LAPACKE_ssytri2_work ✨

lapack_int LAPACKE_ssytri2_work (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda, const lapack_int * ipiv, float * work, lapack_int lwork)

now with work and lwork because sometimes you gotta bring your own space 👜

Definition at line 36 of file lapacke_ssytri2_work.c.

LAPACKE_ssytri2x 💫

lapack_int LAPACKE_ssytri2x (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda, const lapack_int * ipiv, lapack_int nb)

2x means there's an nb in the mix, and honestly? she's giving block-size main character energy 👑

Definition at line 36 of file lapacke_ssytri2x.c.

LAPACKE_ssytri2x_work 🧚

lapack_int LAPACKE_ssytri2x_work (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda, const lapack_int * ipiv, float * work, lapack_int nb)

work but no lwork — instead you get nb. iconic little plot twist ngl 🙈

Definition at line 36 of file lapacke_ssytri2x_work.c.

LAPACKE_ssytri_3 🔥

lapack_int LAPACKE_ssytri_3 (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda, const float * e, const lapack_int * ipiv)

part three bestie!! this one brought a whole extra const float * e to the function 💅

Definition at line 36 of file lapacke_ssytri_3.c.

LAPACKE_ssytri_3_work 🌈

lapack_int LAPACKE_ssytri_3_work (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda, const float * e, const lapack_int * ipiv, float * work, lapack_int lwork)

e and work and lwork — the full trio, no notes, she ate 🍓

Definition at line 36 of file lapacke_ssytri_3_work.c.

LAPACKE_ssytri_work ⭐

lapack_int LAPACKE_ssytri_work (int matrix_layout, char uplo, lapack_int n, float * a, lapack_int lda, const lapack_int * ipiv, float * work)

heads up: work shows up but there's literally no lwork in this signature. that's not a typo, that's just the vibe 💀

Definition at line 36 of file lapacke_ssytri_work.c.

LAPACKE_ssytrs 🎀

lapack_int LAPACKE_ssytrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const lapack_int * ipiv, float * b, lapack_int ldb)

enters nrhs, b and ldb — the solve-flavoured crew, all present and accounted for 🫶

Definition at line 36 of file lapacke_ssytrs.c.

LAPACKE_ssytrs2 💖

lapack_int LAPACKE_ssytrs2 (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const lapack_int * ipiv, float * b, lapack_int ldb)

two! identical parameter list to the original, she just has a 2 now and a whole attitude ✨

Definition at line 36 of file lapacke_ssytrs2.c.

LAPACKE_ssytrs2_work 🦋

lapack_int LAPACKE_ssytrs2_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const lapack_int * ipiv, float * b, lapack_int ldb, float * work)

work joined but not lwork, bestie's flying solo on this one 😭

Definition at line 36 of file lapacke_ssytrs2_work.c.

LAPACKE_ssytrs_3 🌸

lapack_int LAPACKE_ssytrs_3 (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const float * e, const lapack_int * ipiv, float * b, lapack_int ldb)

threequel energy, and e is back for round two of being const float * 💜

Definition at line 36 of file lapacke_ssytrs_3.c.

LAPACKE_ssytrs_3_work 💫

lapack_int LAPACKE_ssytrs_3_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const float * e, const lapack_int * ipiv, float * b, lapack_int ldb)

yes bestie, _work is in the filename but there's no work parameter here. read the signature, trust the signature 👀

Definition at line 36 of file lapacke_ssytrs_3_work.c.

LAPACKE_ssytrs_aa 🧚

lapack_int LAPACKE_ssytrs_aa (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const lapack_int * ipiv, float * b, lapack_int ldb)

aa suffix, same shape as the base one, no extra args, clean girl aesthetic 🤍

Definition at line 36 of file lapacke_ssytrs_aa.c.

LAPACKE_ssytrs_aa_2stage 👑

lapack_int LAPACKE_ssytrs_aa_2stage (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, float * b, lapack_int ldb)

okay this one is stacked: tb, ltb, ipiv, and ipiv2?? two pivot arrays, two stages, absolute diva behaviour 💅🔥

also notes: a and tb and ipiv/ipiv2 and b are all non-const here — she writes, she does not read-only.

Definition at line 36 of file lapacke_ssytrs_aa_2stage.c.

LAPACKE_ssytrs_aa_2stage_work 🌈

lapack_int LAPACKE_ssytrs_aa_2stage_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, float * a, lapack_int lda, float * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, float * b, lapack_int ldb)

longest name award goes to… this one 🏆 and the signature is identical to the non-_work version, work-less and unbothered 🍓

Definition at line 36 of file lapacke_ssytrs_aa_2stage_work.c.

LAPACKE_ssytrs_aa_work ⭐

lapack_int LAPACKE_ssytrs_aa_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const lapack_int * ipiv, float * b, lapack_int ldb, float * work, lapack_int lwork)

here work and lwork do show up, so the name isn't lying this time 💖

Definition at line 36 of file lapacke_ssytrs_aa_work.c.

LAPACKE_ssytrs_rook 🎀

lapack_int LAPACKE_ssytrs_rook (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const lapack_int * ipiv, float * b, lapack_int ldb)

rook edition of the solve, same params as the classic, just with that lil suffix 🦋

Definition at line 36 of file lapacke_ssytrs_rook.c.

LAPACKE_ssytrs_rook_work 🫶

lapack_int LAPACKE_ssytrs_rook_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const lapack_int * ipiv, float * b, lapack_int ldb)

rook and _work, but again — no work, no lwork. she's mysterious like that 🙈

Definition at line 36 of file lapacke_ssytrs_rook_work.c.

LAPACKE_ssytrs_work 🌸

lapack_int LAPACKE_ssytrs_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda, const lapack_int * ipiv, float * b, lapack_int ldb)

and the plot twist continues: _work in the name, zero work in the args. it's giving minimalism 😭

Definition at line 36 of file lapacke_ssytrs_work.c.


okay new letter, new family: stb* — triangular band crew, and rcond has entered the chat 💀

LAPACKE_stbcon 🔥

lapack_int LAPACKE_stbcon (int matrix_layout, char norm, char uplo, char diag, lapack_int n, lapack_int kd, const float * ab, lapack_int ldab, float * rcond)

three chars in a row — norm, uplo, diag — plus kd, ab, ldab and an out-param rcond. char buffet, she ate 💅

Definition at line 36 of file lapacke_stbcon.c.

LAPACKE_stbcon_work ✨

lapack_int LAPACKE_stbcon_work (int matrix_layout, char norm, char uplo, char diag, lapack_int n, lapack_int kd, const float * ab, lapack_int ldab, float * rcond, float * work, lapack_int * iwork)

now with both work and iwork — float workspace and int workspace, double-booked and thriving 🧚

Definition at line 36 of file lapacke_stbcon_work.c.

LAPACKE_stbrfs 🌈

lapack_int LAPACKE_stbrfs (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const float * ab, lapack_int ldab, const float * b, lapack_int ldb, const float * x, lapack_int ldx, float * ferr, float * berr)

the long one 😮‍💨 b/ldb and x/ldx both show up, plus ferr and berr out-params. very "I have two phones" energy 🔥

Definition at line 36 of file lapacke_stbrfs.c.

LAPACKE_stbrfs_work 💜

lapack_int LAPACKE_stbrfs_work (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const float * ab, lapack_int ldab, const float * b, lapack_int ldb, const float * x, lapack_int ldx, float * ferr, float * berr, float * work, lapack_int * iwork)

everything from above plus work and iwork tacked on the end. she just keeps going and honestly? respect 🫶

Definition at line 36 of file lapacke_stbrfs_work.c.

LAPACKE_stbtrs 🎀

lapack_int LAPACKE_stbtrs (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const float * ab, lapack_int ldab, float * b, lapack_int ldb)

chill little band solve — no rcond, no ferr/berr, just b and ldb getting written 💖

Definition at line 36 of file lapacke_stbtrs.c.

LAPACKE_stbtrs_work 🦋

lapack_int LAPACKE_stbtrs_work (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const float * ab, lapack_int ldab, float * b, lapack_int ldb)

_work in the name, no work in the args. we've been over this, it's a lifestyle at this point 🙈

Definition at line 36 of file lapacke_stbtrs_work.c.


and now the packed-transr girlies 🧚 stfsm through stfttr — they all start with transr and honestly it's a whole aesthetic.

LAPACKE_stfsm ⭐

lapack_int LAPACKE_stfsm (int matrix_layout, char transr, char side, char uplo, char trans, char diag, lapack_int m, lapack_int n, float alpha, const float * a, float * b, lapack_int ldb)

four chars before a single int 😭 transr, side, uplo, trans, diag — then m, n, alpha, a, b, ldb. yes alpha is a plain float, not a pointer. she's built different 💅

Definition at line 36 of file lapacke_stfsm.c.

LAPACKE_stfsm_work 🌸

lapack_int LAPACKE_stfsm_work (int matrix_layout, char transr, char side, char uplo, char trans, char diag, lapack_int m, lapack_int n, float alpha, const float * a, float * b, lapack_int ldb)

identical signature to the non-_work one, because the _work is a state of mind, not a parameter 🫶

Definition at line 36 of file lapacke_stfsm_work.c.

LAPACKE_stftri 🎀

lapack_int LAPACKE_stftri (int matrix_layout, char transr, char uplo, char diag, lapack_int n, float * a)

tiny!! no lda, no work — just a as a bare float *. minimal queen ✨

Definition at line 36 of file lapacke_stftri.c.

LAPACKE_stftri_work 🦋

lapack_int LAPACKE_stftri_work (int matrix_layout, char transr, char uplo, char diag, lapack_int n, float * a)

same six args, _work edition, still no lda. consistency icon 💖

Definition at line 36 of file lapacke_stftri_work.c.

LAPACKE_stfttp 💫

lapack_int LAPACKE_stfttp (int matrix_layout, char transr, char uplo, lapack_int n, const float * arf, float * ap)

two pointers, two jobs: arf is const float * going in, ap is float * coming out. conversion energy 🌈

Definition at line 36 of file lapacke_stfttp.c.

LAPACKE_stfttp_work 💜

lapack_int LAPACKE_stfttp_work (int matrix_layout, char transr, char uplo, lapack_int n, const float * arf, float * ap)

same again bestie, no extra args, she's just got _work in the filename for the branding 👑

Definition at line 36 of file lapacke_stfttp_work.c.

LAPACKE_stfttr 🍓

lapack_int LAPACKE_stfttr (int matrix_layout, char transr, char uplo, lapack_int n, const float * arf, float * a, lapack_int lda)

this one does have lda — so arf in, a + lda out, and the whole transr squad out front 🎀

Definition at line 36 of file lapacke_stfttr.c.

LAPACKE_stfttr_work 🌟

lapack_int LAPACKE_stfttr_work (int matrix_layout, char transr, char uplo, lapack_int n, const float * arf, float * a, lapack_int lda)

yeah, same. lda included, work excluded, business as usual 💅

Definition at line 36 of file lapacke_stfttr_work.c.


and we've hit the pencil-s family 🥕 (s for single precision, bestie, we're still in float land).

LAPACKE_stgevc 🔥

lapack_int LAPACKE_stgevc (int matrix_layout, char side, char howmny, const lapack_logical * select, lapack_int n, const float * s, lapack_int lds, const float * p, lapack_int ldp, float * vl, lapack_int ldvl, float * vr, lapack_int ldvr, lapack_int mm, lapack_int * m)

a lot going on: select is const lapack_logical * (yes, lapack_logical, not float!), and you've got mm in and m as a pointer out 😮‍💨 long-distance-relationship-core function 💀

Definition at line 36 of file lapacke_stgevc.c.

LAPACKE_stgevc_work 🫶

lapack_int LAPACKE_stgevc_work (int matrix_layout, char side, char howmny, const lapack_logical * select, lapack_int n, const float * s, lapack_int lds, const float * p, lapack_int ldp, float * vl, lapack_int ldvl, float * vr, lapack_int ldvr, lapack_int mm, lapack_int * m, float * work)

everything above plus float * work at the very end. one extra bestie, no lwork needed 💖

Definition at line 36 of file lapacke_stgevc_work.c.

LAPACKE_stgexc ✨

lapack_int LAPACKE_stgexc (int matrix_layout, lapack_logical wantq, lapack_logical wantz, lapack_int n, float * a, lapack_int lda, float * b, lapack_int ldb, float * q, lapack_int ldq, float * z, lapack_int ldz, lapack_int * ifst, lapack_int * ilst)

wantq and wantz are plain lapack_logical values (not pointers!) and they're asking the real questions 🎀 then ifst and ilst are lapack_int * at the end, both writeable 👀

Definition at line 36 of file lapacke_stgexc.c.

LAPACKE_stgexc_work 🌸

lapack_int LAPACKE_stgexc_work (int matrix_layout, lapack_logical wantq, lapack_logical wantz, lapack_int n, float * a, lapack_int lda, float * b, lapack_int ldb, float * q, lapack_int ldq, float * z, lapack_int ldz, lapack_int * ifst, lapack_int * ilst, float * work, lapack_int lwork)

the full work + lwork combo, appended like a little bow on top 🎀✨

Definition at line 36 of file lapacke_stgexc_work.c.

LAPACKE_stgsen 💫

lapack_int LAPACKE_stgsen (int matrix_layout, lapack_int ijob, lapack_logical wantq, lapack_logical wantz, const lapack_logical * select, lapack_int n, float * a, lapack_int lda, float * b, lapack_int ldb, float * alphar, float * alphai, float * beta, float * q, lapack_int ldq, float * z, lapack_int ldz, lapack_int * m, float * pl, float * pr, float * dif)

okay this is THE long one, count the args bestie 😭 ijob as a lapack_int, wantq/wantz as plain logicals, select as const lapack_logical *, and then out-params for days: alphar, alphai, beta, q, z, m, pl, pr, dif. she's giving final-boss energy 👑🔥

Definition at line 36 of file lapacke_stgsen.c.

LAPACKE_stgsen_work 🌈

lapack_int LAPACKE_stgsen_work (int matrix_layout, lapack_int ijob, lapack_logical wantq, lapack_logical wantz, const lapack_logical * select, lapack_int n, float * a, lapack_int lda, float * b, lapack_int ldb, float * alphar, float * alphai, float * beta, float * q, lapack_int ldq, float * z, lapack_int ldz, lapack_int * m, float * pl, float * pr, float * dif, float * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

same huge list plus work, lwork, iwork, liwork — both work types, both lengths, absolutely no restraint and I love that for her 💜🫶

Definition at line 36 of file lapacke_stgsen_work.c.

LAPACKE_stgsja 🍓

lapack_int LAPACKE_stgsja (int matrix_layout, char jobu, char jobv, char jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k, lapack_int l, float * a, lapack_int lda, float * b, lapack_int ldb, float tola, float tolb, float * alpha, float * beta, float * u, lapack_int ldu, float * v, lapack_int ldv, float * q, lapack_int ldq, lapack_int * ncycle)

closing out this batch with a monster 💀 three job chars (jobu, jobv, jobq), three dims (m, p, n), then k and l, then tola/tolb as plain float tolerances, then a, b, alpha, beta, u, v, q with all their ld* besties, and ncycle as a lapack_int * out-param. twenty-four parameters. twenty-four!! she said go big or go home and then went big anyway ✨👑💅

Definition at line 36 of file lapacke_stgsja.c.

LAPACKE_stgsja_work

lapack_int LAPACKE_stgsja_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
    lapack_int l, float * a, lapack_int lda, float * b, lapack_int ldb,
    float tola, float tolb, float * alpha, float * beta, float * u,
    lapack_int ldu, float * v, lapack_int ldv, float * q, lapack_int ldq,
    float * work, lapack_int * ncycle)

Definition at line 36 of lapacke_stgsja_work.c. 💅 three job chars (jobu, jobv, jobq), three matrices (u, v, q), three leading dimensions (ldu, ldv, ldq) — the way this one is so symmetrical, we love a consistent queen. It's the _work flavor, so work and ncycle come along too.

LAPACKE_stgsna

lapack_int LAPACKE_stgsna (int matrix_layout, char job, char howmny,
    const lapack_logical * select, lapack_int n, const float * a, lapack_int lda,
    const float * b, lapack_int ldb, const float * vl, lapack_int ldvl,
    const float * vr, lapack_int ldvr, float * s, float * dif, lapack_int
    mm, lapack_int * m)

Definition at line 36 of lapacke_stgsna.c. bestie look at the select, mm and m trio — select is a const lapack_logical *, mm is your capacity, m is a pointer where the count comes back. classic in-out energy. 🦋

LAPACKE_stgsna_work

lapack_int LAPACKE_stgsna_work (int matrix_layout, char job, char howmny,
    const lapack_logical * select, lapack_int n, const float * a, lapack_int
    lda, const float * b, lapack_int ldb, const float * vl, lapack_int ldvl,
    const float * vr, lapack_int ldvr, float * s, float * dif, lapack_int
    mm, lapack_int * m, float * work, lapack_int lwork, lapack_int * iwork)

Definition at line 36 of lapacke_stgsna_work.c. literally the same list as above with work, lwork and iwork tacked on the end — you bring the scratch, it brings the math. ✨

LAPACKE_stgsyl

lapack_int LAPACKE_stgsyl (int matrix_layout, char trans, lapack_int ijob,
    lapack_int m, lapack_int n, const float * a, lapack_int lda, const float
    * b, lapack_int ldb, float * c, lapack_int ldc, const float * d,
    lapack_int ldd, const float * e, lapack_int lde, float * f, lapack_int
    ldf, float * scale, float * dif)

Definition at line 36 of lapacke_stgsyl.c. six matrices, six leading dims, one ijob, one trans, and the lil scale + dif out-params at the end. she's thorough. 👑

LAPACKE_stgsyl_work

lapack_int LAPACKE_stgsyl_work (int matrix_layout, char trans, lapack_int
    ijob, lapack_int m, lapack_int n, const float * a, lapack_int lda, const
    float * b, lapack_int ldb, float * c, lapack_int ldc, const float * d,
    lapack_int ldd, const float * e, lapack_int lde, float * f, lapack_int
    ldf, float * scale, float * dif, float * work, lapack_int lwork,
    lapack_int * iwork)

Definition at line 36 of lapacke_stgsyl_work.c. same whole crew, plus work, lwork, iwork. 🫶

LAPACKE_stpcon

lapack_int LAPACKE_stpcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const float * ap, float * rcond)

Definition at line 36 of lapacke_stpcon.c. short and sweet — norm, uplo, diag, n, packed ap, and rcond comes back to you. compact icon behavior. 🎀

LAPACKE_stpcon_work

lapack_int LAPACKE_stpcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const float * ap, float * rcond, float * work,
    lapack_int * iwork)

Definition at line 36 of lapacke_stpcon_work.c. the same call with work and iwork bolted on. no lwork here, don't go looking for one. 🙈

LAPACKE_stpmqrt

lapack_int LAPACKE_stpmqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int nb,
    const float * v, lapack_int ldv, const float * t, lapack_int ldt, float
    * a, lapack_int lda, float * b, lapack_int ldb)

Definition at line 36 of lapacke_stpmqrt.c. four size ints (m, n, k, l) plus a block size nb, and two const inputs v and t feeding two in-out matrices a and b. it's giving blocked-algorithm main character energy. 🔥

LAPACKE_stpmqrt_work

lapack_int LAPACKE_stpmqrt_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int nb,
    const float * v, lapack_int ldv, const float * t, lapack_int ldt, float
    * a, lapack_int lda, float * b, lapack_int ldb, float * work)

Definition at line 36 of lapacke_stpmqrt_work.c. identical line-up with one extra work pointer, no length arg. noted, bestie. ⭐

LAPACKE_stpqrt

lapack_int LAPACKE_stpqrt (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int l, lapack_int nb, float * a, lapack_int lda, float * b,
    lapack_int ldb, float * t, lapack_int ldt)

Definition at line 36 of lapacke_stpqrt.c. m, n, l, nb, then a/lda, b/ldb, t/ldt. everything's a float pointer here, nothing's const, lowkey lawless. 💀

LAPACKE_stpqrt2

lapack_int LAPACKE_stpqrt2 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int l, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * t, lapack_int ldt)

Definition at line 36 of lapacke_stpqrt2.c. same as LAPACKE_stpqrt minus the nb, plus a 2 in the name. yes the 2 matters, it's a whole different function, do not swap them. 😭

LAPACKE_stpqrt2_work

lapack_int LAPACKE_stpqrt2_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * t, lapack_int ldt)

Definition at line 36 of lapacke_stpqrt2_work.c. and yes — this signature is character-for-character the same as LAPACKE_stpqrt2. no work array, no lwork, nothing. that's not me being lazy, that's literally the page. ngl iconic of it. 💅

LAPACKE_stpqrt_work

lapack_int LAPACKE_stpqrt_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int l, lapack_int nb, float * a, lapack_int lda, float * b,
    lapack_int ldb, float * t, lapack_int ldt, float * work)

Definition at line 36 of lapacke_stpqrt_work.c. keeps the nb, gains a work. balance restored. 🌸

LAPACKE_stprfb

lapack_int LAPACKE_stprfb (int matrix_layout, char side, char trans, char
    direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    lapack_int l, const float * v, lapack_int ldv, const float * t,
    lapack_int ldt, float * a, lapack_int lda, float * b, lapack_int ldb)

Definition at line 36 of lapacke_stprfb.c. four chars to start — side, trans, direct, storev — the way that's four personality traits in a row. then the usual size squad and the matrix parade. 🦋

LAPACKE_stprfb_work

lapack_int LAPACKE_stprfb_work (int matrix_layout, char side, char trans,
    char direct, char storev, lapack_int m, lapack_int n, lapack_int k,
    lapack_int l, const float * v, lapack_int ldv, const float * t,
    lapack_int ldt, float * a, lapack_int lda, float * b, lapack_int ldb,
    float * work, lapack_int ldwork)

Definition at line 36 of lapacke_stprfb_work.c. extra points for the sixteenth arg being ldwork and not lwork. she's different, she's a ldwork girlie. 🙈

LAPACKE_stprfs

lapack_int LAPACKE_stprfs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const float * ap, const float * b,
    lapack_int ldb, const float * x, lapack_int ldx, float * ferr, float *
    berr)

Definition at line 36 of lapacke_stprfs.c. packed ap in, b and x with their own lds, and the iconic ferr/berr error pair on the way out. 🎀

LAPACKE_stprfs_work

lapack_int LAPACKE_stprfs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const float * ap, const float
    * b, lapack_int ldb, const float * x, lapack_int ldx, float * ferr,
    float * berr, float * work, lapack_int * iwork)

Definition at line 36 of lapacke_stprfs_work.c. plus work and iwork, as per. ✨

LAPACKE_stptri

lapack_int LAPACKE_stptri (int matrix_layout, char uplo, char diag,
    lapack_int n, float * ap)

Definition at line 36 of lapacke_stptri.c. five args total. five!! a minimalist. ap is non-const so bestie it's getting changed in place. 🫶

LAPACKE_stptri_work

lapack_int LAPACKE_stptri_work (int matrix_layout, char uplo, char diag,
    lapack_int n, float * ap)

Definition at line 36 of lapacke_stptri_work.c. and here we go again — matches LAPACKE_stptri exactly, arg for arg, no trailing extras. copy-paste energy but make it API. 👑

LAPACKE_stptrs

lapack_int LAPACKE_stptrs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const float * ap, float * b,
    lapack_int ldb)

Definition at line 36 of lapacke_stptrs.c. ap is const, b is not — one of them is a read-only diva and one of them is doing the work. 🍓

LAPACKE_stptrs_work

lapack_int LAPACKE_stptrs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const float * ap, float * b,
    lapack_int ldb)

Definition at line 36 of lapacke_stptrs_work.c. identical to LAPACKE_stptrs, every single token. i checked. twice. 💀

LAPACKE_stpttf

lapack_int LAPACKE_stpttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const float * ap, float * arf)

Definition at line 36 of lapacke_stpttf.c. packed to rectangular-free — ap goes in const, arf comes out. note it's transr with an r, not trans. yes that matters. 🦋

LAPACKE_stpttf_work

lapack_int LAPACKE_stpttf_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const float * ap, float * arf)

Definition at line 36 of lapacke_stpttf_work.c. same six args, same order, same everything. they're twins fr fr. 🌈

LAPACKE_stpttr

lapack_int LAPACKE_stpttr (int matrix_layout, char uplo, lapack_int n, const
    float * ap, float * a, lapack_int lda)

Definition at line 36 of lapacke_stpttr.c. only one char option (uplo) and then it's straight to business with ap → a, lda. efficient queen. ⭐

LAPACKE_stpttr_work

lapack_int LAPACKE_stpttr_work (int matrix_layout, char uplo, lapack_int n,
    const float * ap, float * a, lapack_int lda)

Definition at line 36 of lapacke_stpttr_work.c. yep, character-for-character the same as LAPACKE_stpttr. the _work suffix is doing absolutely nothing structural here and i respect it. 💅

LAPACKE_strcon

lapack_int LAPACKE_strcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const float * a, lapack_int lda, float * rcond)

Definition at line 36 of lapacke_strcon.c. norm, uplo, diag, the size n, a with lda, and rcond returned. tight, clean, no notes. 🎀

LAPACKE_strcon_work

lapack_int LAPACKE_strcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const float * a, lapack_int lda, float * rcond,
    float * work, lapack_int * iwork)

Definition at line 36 of lapacke_strcon_work.c. + work + iwork. the standard glow-up. 🔥

LAPACKE_strevc

lapack_int LAPACKE_strevc (int matrix_layout, char side, char howmny,
    lapack_logical * select, lapack_int n, const float * t, lapack_int ldt,
    float * vl, lapack_int ldvl, float * vr, lapack_int ldvr, lapack_int mm,
    lapack_int * m)

Definition at line 36 of lapacke_strevc.c. watch the select here — it's a non-const lapack_logical *, unlike her cousin LAPACKE_stgsna up above which takes it const. details matter, bestie. 👑

LAPACKE_strevc_work

lapack_int LAPACKE_strevc_work (int matrix_layout, char side, char howmny,
    lapack_logical * select, lapack_int n, const float * t, lapack_int ldt,
    float * vl, lapack_int ldvl, float * vr, lapack_int ldvr, lapack_int mm,
    lapack_int * m, float * work)

Definition at line 36 of lapacke_strevc_work.c. same, plus a single trailing work. no length, no iwork. she travels light. 🦋

LAPACKE_strexc

lapack_int LAPACKE_strexc (int matrix_layout, char compq, lapack_int n,
    float * t, lapack_int ldt, float * q, lapack_int ldq, lapack_int * ifst,
    lapack_int * ilst)

Definition at line 36 of lapacke_strexc.c. two in-out matrices (t and q), and ifst + ilst as mutable lapack_int * — those two are basically coordinates in pointer form. 📍

LAPACKE_strexc_work

lapack_int LAPACKE_strexc_work (int matrix_layout, char compq, lapack_int n,
    float * t, lapack_int ldt, float * q, lapack_int ldq, lapack_int * ifst,
    lapack_int * ilst, float * work)

Definition at line 36 of lapacke_strexc_work.c. everything above, then work. that's the whole diff. 💜

LAPACKE_strrfs

lapack_int LAPACKE_strrfs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda,
    const float * b, lapack_int ldb, const float * x, lapack_int ldx, float
    * ferr, float * berr)

Definition at line 36 of lapacke_strrfs.c. three const inputs (a, b, x), each with its own leading dim, and the ferr/berr duo at the finish line. consistent girlie. 🎀

LAPACKE_strrfs_work

lapack_int LAPACKE_strrfs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const float * a, lapack_int
    lda, const float * b, lapack_int ldb, const float * x, lapack_int ldx,
    float * ferr, float * berr, float * work, lapack_int * iwork)

Definition at line 36 of lapacke_strrfs_work.c. + work + iwork, no lwork. keep up. ✨

LAPACKE_strsen

lapack_int LAPACKE_strsen (int matrix_layout, char job, char compq, const
    lapack_logical * select, lapack_int n, float * t, lapack_int ldt, float
    * q, lapack_int ldq, float * wr, float * wi, lapack_int * m, float * s,
    float * sep)

Definition at line 36 of lapacke_strsen.c. job and compq chars, a const select, then t, q, wr, wi, m, s, sep. that's a lot of out-params and honestly? she earned them. 🌸

LAPACKE_strsen_work

lapack_int LAPACKE_strsen_work (int matrix_layout, char job, char compq,
    const lapack_logical * select, lapack_int n, float * t, lapack_int ldt,
    float * q, lapack_int ldq, float * wr, float * wi, lapack_int * m, float
    * s, float * sep, float * work, lapack_int lwork, lapack_int * iwork,
    lapack_int liwork)

Definition at line 36 of lapacke_strsen_work.c. and HERE she goes full maximalist: work, lwork, iwork, liwork. four scratch args. that's the boss-level _work signature, no cap. 🔥

LAPACKE_strsna

lapack_int LAPACKE_strsna (int matrix_layout, char job, char howmny, const
    lapack_logical * select, lapack_int n, const float * t, lapack_int ldt,
    const float * vl, lapack_int ldvl, const float * vr, lapack_int ldvr,
    float * s, float * sep, lapack_int mm, lapack_int * m)

Definition at line 36 of lapacke_strsna.c. t, vl, vr all const, s and sep as outputs, mm in and m out. note it's sep here and dif over in LAPACKE_stgsna — different pages, different letters, don't mix them up. 🫶

LAPACKE_strsna_work

lapack_int LAPACKE_strsna_work (int matrix_layout, char job, char howmny,
    const lapack_logical * select, lapack_int n, const float * t, lapack_int
    ldt, const float * vl, lapack_int ldvl, const float * vr, lapack_int
    ldvr, float * s, float * sep, lapack_int mm, lapack_int * m, float *
    work, lapack_int ldwork, lapack_int * iwork)

Definition at line 36 of lapacke_strsna_work.c. watch it — the middle scratch arg is ldwork, not lwork. and there's still an iwork after. yes, both. 😭

LAPACKE_strsyl

lapack_int LAPACKE_strsyl (int matrix_layout, char trana, char tranb,
    lapack_int isgn, lapack_int m, lapack_int n, const float * a, lapack_int
    lda, const float * b, lapack_int ldb, float * c, lapack_int ldc, float *
    scale)

Definition at line 36 of lapacke_strsyl.c. two trans chars (trana, tranb — not one shared trans), an isgn, two const inputs feeding one in-out c, and scale hanging out at the end. 💅

LAPACKE_strsyl_work

lapack_int LAPACKE_strsyl_work (int matrix_layout, char trana, char tranb,
    lapack_int isgn, lapack_int m, lapack_int n, const float * a, lapack_int
    lda, const float * b, lapack_int ldb, float * c, lapack_int ldc, float *
    scale)

Definition at line 36 of lapacke_strsyl_work.c. identical to LAPACKE_strsyl, all thirteen args, zero additions. the _work name is purely vibes this time. 🦋

LAPACKE_strtri

lapack_int LAPACKE_strtri (int matrix_layout, char uplo, char diag,
    lapack_int n, float * a, lapack_int lda)

Definition at line 36 of lapacke_strtri.c. uplo, diag, n, and a mutable a with lda — in-place queen, coming through. 👑

💅 LAPACKE_strtri_work

lapack_int LAPACKE_strtri_work (int matrix_layout, char uplo, char diag,
    lapack_int n, float * a, lapack_int lda)

Definition at line 36 of file lapacke_strtri_work.c.

the _work twin has entered the chat 🫶 same cast, same float * a, same lda, just with the workspace vibe spelled out. and yes bestie — line 36 again. we love consistency.

✨ LAPACKE_strtrs

lapack_int LAPACKE_strtrs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int nrhs, const float * a, lapack_int lda,
    float * b, lapack_int ldb)

Definition at line 36 of file lapacke_strtrs.c.

four chars in a row (uplo, trans, diag) and then the classic a/lda, b/ldb duo — it's giving "I know exactly what I'm doing" energy 💅 note the const on a and no const on b, because b is the one getting changed up in here, periodt.

🌸 LAPACKE_strtrs_work

lapack_int LAPACKE_strtrs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int nrhs, const float * a, lapack_int
    lda, float * b, lapack_int ldb)

Definition at line 36 of file lapacke_strtrs_work.c.

look at that — literally the same parameter list as LAPACKE_strtrs, no extra work array in sight, and the wrapper still gets its own file. iconic behavior honestly. 🎀

🦋 LAPACKE_strttf

lapack_int LAPACKE_strttf (int matrix_layout, char transr, char uplo,
    lapack_int n, const float * a, lapack_int lda, float * arf)

Definition at line 36 of file lapacke_strttf.c.

okay so this one has transr (with the r, don't @ me) and outputs into arf — that's a whole extra output pointer, main character energy fr fr. ⭐

🧚 LAPACKE_strttf_work

lapack_int LAPACKE_strttf_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const float * a, lapack_int lda, float * arf)

Definition at line 36 of file lapacke_strttf_work.c.

same signature, _work edition, zero extra args. the audacity?? 😭 love that for us though, less typing.

🍓 LAPACKE_strttp

lapack_int LAPACKE_strttp (int matrix_layout, char uplo, lapack_int n, const
    float * a, lapack_int lda, float * ap)

Definition at line 36 of file lapacke_strttp.c.

no trans anything here, just uplo, n, and the a → ap glow-up. ap is not const, so it's definitely the one being written into, no cap. 🎀

🌈 LAPACKE_strttp_work

lapack_int LAPACKE_strttp_work (int matrix_layout, char uplo, lapack_int n,
    const float * a, lapack_int lda, float * ap)

Definition at line 36 of file lapacke_strttp_work.c.

identical twin behavior, _work suffix only. the way these two are just the same thing with different filenames 😭 Definition at line 36 — every single time, bestie, it's a bit at this point.

👑 LAPACKE_stzrzf

lapack_int LAPACKE_stzrzf (int matrix_layout, lapack_int m, lapack_int n,
    float * a, lapack_int lda, float * tau)

Definition at line 36 of file lapacke_stzrzf.c.

okay the name is a whole keyboard smash (stzrzf?? say it with your chest 💀) but the args are chill: m, n, a mutable a with its lda, and tau. no const on a, so it's getting rewritten. 🫶

🔥 LAPACKE_stzrzf_work

lapack_int LAPACKE_stzrzf_work (int matrix_layout, lapack_int m, lapack_int
    n, float * a, lapack_int lda, float * tau, float * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_stzrzf_work.c.

here's where _work actually earns its name — float * work and lapack_int lwork show up at the end, exactly like you'd expect. plus tau still chilling in the middle. ⭐

💜 LAPACKE_zbbcsd

lapack_int LAPACKE_zbbcsd (int matrix_layout, char jobu1, char jobu2, char
    jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p, lapack_int
    q, double * theta, double * phi, lapack_complex_double * u1, lapack_int
    ldu1, lapack_complex_double * u2, lapack_int ldu2, lapack_complex_double
    * v1t, lapack_int ldv1t, lapack_complex_double * v2t, lapack_int ldv2t,
    double * b11d, double * b11e, double * b12d, double * b12e, double *
    b21d, double * b21e, double * b22d, double * b22e)

Definition at line 36 of file lapacke_zbbcsd.c.

BESTIE. look at this parameter list. 😭 five chars of job/trans flags (jobu1, jobu2, jobv1t, jobv2t, trans), then m, p, q, then a whole parade of complex u1/u2/v1t/v2t with their ld buddies, and then — count 'em — eight double * pointers named b11d, b11e, b12d, b12e, b21d, b21e, b22d, b22e. that's the b-matrix core, sliced and diced. genuinely ate and left no crumbs 👑 no const anywhere, everything's getting touched.

🌟 LAPACKE_zbbcsd_work

lapack_int LAPACKE_zbbcsd_work (int matrix_layout, char jobu1, char jobu2,
    char jobv1t, char jobv2t, char trans, lapack_int m, lapack_int p,
    lapack_int q, double * theta, double * phi, lapack_complex_double * u1,
    lapack_int ldu1, lapack_complex_double * u2, lapack_int ldu2,
    lapack_complex_double * v1t, lapack_int ldv1t, lapack_complex_double *
    v2t, lapack_int ldv2t, double * b11d, double * b11e, double * b12d,
    double * b12e, double * b21d, double * b21e, double * b22d, double *
    b22e, double * rwork, lapack_int lrwork)

Definition at line 36 of file lapacke_zbbcsd_work.c.

the _work version of the beast above, and all it adds is double * rwork + lapack_int lrwork tacked on the end. that's it. that's the whole difference. 😭 everything else is byte-for-byte the vibe.

🦋 LAPACKE_zbdsqr

lapack_int LAPACKE_zbdsqr (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, double * d, double * e,
    lapack_complex_double * vt, lapack_int ldvt, lapack_complex_double * u,
    lapack_int ldu, lapack_complex_double * c, lapack_int ldc)

Definition at line 36 of file lapacke_zbdsqr.c.

okay so we got n, ncvt, nru, ncc — yes those are four separate sizes, stay with me — then the real-valued d and e arrays (doubles, not complexes, iykyk), then complex vt/u/c each with their ld. uplo leads the whole thing. no consts, so everything is fair game to be written. 💅

🌸 LAPACKE_zbdsqr_work

lapack_int LAPACKE_zbdsqr_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int ncvt, lapack_int nru, lapack_int ncc, double * d, double * e,
    lapack_complex_double * vt, lapack_int ldvt, lapack_complex_double * u,
    lapack_int ldu, lapack_complex_double * c, lapack_int ldc, double *
    work)

Definition at line 36 of file lapacke_zbdsqr_work.c.

same as LAPACKE_zbdsqr with one single double * work on the end. no lwork here — just the pointer, and that's the tea. 🍵 note that it's a double *, not complex, because that's what the original says and we do NOT freelance. 🫶

💀 LAPACKE_zcgesv

lapack_int LAPACKE_zcgesv (int matrix_layout, lapack_int n, lapack_int nrhs,
    lapack_complex_double * a, lapack_int lda, lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, lapack_int * iter)

Definition at line 36 of file lapacke_zcgesv.c.

the zc prefix means double-complex calling single-complex internals, and honestly the name is telling you that up front — we love a name that does its job. 🔥 you've got the classic a/lda, b/ldb, then x/ldx and lapack_int * ipiv plus an output-ish lapack_int * iter right at the end. no consts. all vibes.

⭐ LAPACKE_zcgesv_work

lapack_int LAPACKE_zcgesv_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, lapack_complex_double * work, lapack_complex_float *
    swork, double * rwork, lapack_int * iter)

Definition at line 36 of file lapacke_zcgesv_work.c.

okay now THIS is a workspace moment. 👑 three whole scratch arrays before iter: lapack_complex_double * work, lapack_complex_float * swork (notice it's the single complex type, exactly as written, don't come for me), and double * rwork. no lwork/lrwork in sight — just hand over the buffers and pray, bestie. 🙈

🎀 LAPACKE_zcposv

lapack_int LAPACKE_zcposv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, lapack_int * iter)

Definition at line 36 of file lapacke_zcposv.c.

LAPACKE_zcgesv's cousin who leads with uplo instead of dropping straight into the sizes. ✨ otherwise same energy: a/lda, b/ldb, x/ldx, ending on lapack_int * iter. no consts, everything mutable, we move. 🦋

💖 LAPACKE_zcposv_work

lapack_int LAPACKE_zcposv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, lapack_complex_double * work, lapack_complex_float *
    swork, double * rwork, lapack_int * iter)

Definition at line 36 of file lapacke_zcposv_work.c.

and the _work twin brings the exact same trio of scratch buffers — work, swork, rwork — right before iter. consistency is so sexy. 💅

🧚 LAPACKE_zgbbrd

lapack_int LAPACKE_zgbbrd (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku,
    lapack_complex_double * ab, lapack_int ldab, double * d, double * e,
    lapack_complex_double * q, lapack_int ldq, lapack_complex_double * pt,
    lapack_int ldpt, lapack_complex_double * c, lapack_int ldc)

Definition at line 36 of file lapacke_zgbbrd.c.

the band-matrix crowd representation: vect, then m, n, ncc, kl, ku (yes, six ints in a row, hydrate 💧), then the packed ab/ldab, real d and e, and the full q/pt/c lineup each with its ld. honestly a full house. 🃏

🌟 LAPACKE_zgbbrd_work

lapack_int LAPACKE_zgbbrd_work (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int ncc, lapack_int kl, lapack_int ku,
    lapack_complex_double * ab, lapack_int ldab, double * d, double * e,
    lapack_complex_double * q, lapack_int ldq, lapack_complex_double * pt,
    lapack_int ldpt, lapack_complex_double * c, lapack_int ldc,
    lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgbbrd_work.c.

same monster, plus lapack_complex_double * work and double * rwork at the tail. no lengths, just pointers. the _work convention said "you know what you're doing" and honestly, we do. 😌

🌈 LAPACKE_zgbcon

lapack_int LAPACKE_zgbcon (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const lapack_complex_double * ab,
    lapack_int ldab, const lapack_int * ipiv, double anorm, double * rcond)

Definition at line 36 of file lapacke_zgbcon.c.

ooh a const sighting! 👀 ab and ipiv are both const — this one reads, it doesn't wreck. anorm comes in as a plain double by value, and rcond is the pointer getting the answer. norm leads. very "I'm just here to evaluate" of it.

⭐ LAPACKE_zgbcon_work

lapack_int LAPACKE_zgbcon_work (int matrix_layout, char norm, lapack_int n,
    lapack_int kl, lapack_int ku, const lapack_complex_double * ab,
    lapack_int ldab, const lapack_int * ipiv, double anorm, double * rcond,
    lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgbcon_work.c.

same consts, same anorm by value, then lapack_complex_double * work and double * rwork tacked on. predictable? yes. correct? also yes. 🫶

🎀 LAPACKE_zgbequ

lapack_int LAPACKE_zgbequ (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, const lapack_complex_double * ab,
    lapack_int ldab, double * r, double * c, double * rowcnd, double *
    colcnd, double * amax)

Definition at line 36 of file lapacke_zgbequ.c.

ab is const (respect 💅) and then it's output city: r, c, rowcnd, colcnd, amax, all double *. m, n, kl, ku set the stage. note c here is a double * — that's the row/column scaling vector, not a complex matrix, don't get it twisted. 😭

🦋 LAPACKE_zgbequ_work

lapack_int LAPACKE_zgbequ_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const lapack_complex_double * ab,
    lapack_int ldab, double * r, double * c, double * rowcnd, double *
    colcnd, double * amax)

Definition at line 36 of file lapacke_zgbequ_work.c.

literally the same list, _work edition, and no extra scratch args at all. sometimes _work is just a vibe, not a payload. 🎀

💜 LAPACKE_zgbequb

lapack_int LAPACKE_zgbequb (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, const lapack_complex_double * ab,
    lapack_int ldab, double * r, double * c, double * rowcnd, double *
    colcnd, double * amax)

Definition at line 36 of file lapacke_zgbequb.c.

the b on the end is the whole personality here, bestie — otherwise this signature is a carbon copy of LAPACKE_zgbequ: same const ab, same five double * outputs. and they say twins don't exist. 🙈

🍓 LAPACKE_zgbequb_work

lapack_int LAPACKE_zgbequb_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, const lapack_complex_double * ab,
    lapack_int ldab, double * r, double * c, double * rowcnd, double *
    colcnd, double * amax)

Definition at line 36 of file lapacke_zgbequb_work.c.

and the _work version matches it exactly again. we are nothing if not consistent. ✨

🔥 LAPACKE_zgbrfs

lapack_int LAPACKE_zgbrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_double * ab, lapack_int ldab, const lapack_complex_double
    * afb, lapack_int ldafb, const lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * ferr, double * berr)

Definition at line 36 of file lapacke_zgbrfs.c.

okay, count the consts: ab, afb, ipiv, b — four of them, all read-only, love that boundary-setting energy. 👑 the only mutable matrix is x/ldx, and then ferr + berr catch the error estimates at the end. trans kicks it off, nrhs rides along.

💀 LAPACKE_zgbrfs_work

lapack_int LAPACKE_zgbrfs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_double * ab, lapack_int ldab, const lapack_complex_double
    * afb, lapack_int ldafb, const lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * ferr, double * berr, lapack_complex_double *
    work, double * rwork)

Definition at line 36 of file lapacke_zgbrfs_work.c.

same four consts (still respecting boundaries 😌) plus lapack_complex_double * work and double * rwork at the end. ferr and berr didn't move an inch. 🫶

⭐ LAPACKE_zgbrfsx

lapack_int LAPACKE_zgbrfsx (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_double * ab, lapack_int ldab, const lapack_complex_double
    * afb, lapack_int ldafb, const lapack_int * ipiv, const double * r,
    const double * c, const lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    berr, lapack_int n_err_bnds, double * err_bnds_norm, double *
    err_bnds_comp, lapack_int nparams, double * params)

Definition at line 36 of file lapacke_zgbrfsx.c.

the x variant said "let me cook" and cooked. 🔥 new here: char equed, const double * r, const double * c, and then the error-bound era begins — double * rcond, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params. that's a lot of pointers and honestly? she's worth it. all the consts from LAPACKE_zgbrfs are still there doing their jobs. 👑

🧚 LAPACKE_zgbrfsx_work

lapack_int LAPACKE_zgbrfsx_work (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_double * ab, lapack_int ldab, const lapack_complex_double
    * afb, lapack_int ldafb, const lapack_int * ipiv, const double * r,
    const double * c, const lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    berr, lapack_int n_err_bnds, double * err_bnds_norm, double *
    err_bnds_comp, lapack_int nparams, double * params,
    lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgbrfsx_work.c.

the full extended family, plus lapack_complex_double * work and double * rwork. everything through params stays exactly where it was. no notes, she's perfect. 🎀

🌸 LAPACKE_zgbsv

lapack_int LAPACKE_zgbsv (int matrix_layout, lapack_int n, lapack_int kl,
    lapack_int ku, lapack_int nrhs, lapack_complex_double * ab, lapack_int
    ldab, lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgbsv.c.

nice and tidy for a change: n, kl, ku, nrhs, then ab/ldab, ipiv, b/ldb. no consts anywhere — this one's here to work, not to admire. 💅

🦋 LAPACKE_zgbsv_work

lapack_int LAPACKE_zgbsv_work (int matrix_layout, lapack_int n, lapack_int
    kl, lapack_int ku, lapack_int nrhs, lapack_complex_double * ab,
    lapack_int ldab, lapack_int * ipiv, lapack_complex_double * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_zgbsv_work.c.

identical again, zero extra args, _work in the name only. the pattern is pattering. 😭

💜 LAPACKE_zgbsvx

lapack_int LAPACKE_zgbsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
    lapack_complex_double * ab, lapack_int ldab, lapack_complex_double *
    afb, lapack_int ldafb, lapack_int * ipiv, char * equed, double * r,
    double * c, lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    ferr, double * berr, double * rpivot)

Definition at line 36 of file lapacke_zgbsvx.c.

big x energy: fact and trans up front, then ab/afb/ipiv, then char * equed (a pointer to a char, bestie, so it can be written back 🫶), r, c, both matrices b and x with their lds, and the triple finale rcond, ferr, berr — plus double * rpivot right at the end. no consts, everything's in play. 🌟


still in the function docs, still not done — more coming, don't touch that dial 💖

okay bestie, we’re still deep in the function-signature gallery and it is lowkey endless, but every single one is here, fully intact, no skipped lore 💅✨

  • LAPACKE_zgbsvx_work — the _work entry has entered the chat:
lapack_int LAPACKE_zgbsvx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
    lapack_complex_double * ab, lapack_int ldab, lapack_complex_double *
    afb, lapack_int ldafb, lapack_int * ipiv, char * equed, double * r,
    double * c, lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    ferr, double * berr, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgbsvx_work.c.

  • LAPACKE_zgbsvxx — another icon with a whole lotta parameters:
lapack_int LAPACKE_zgbsvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
    lapack_complex_double * ab, lapack_int ldab, lapack_complex_double *
    afb, lapack_int ldafb, lapack_int * ipiv, char * equed, double * r,
    double * c, lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    rpvgrw, double * berr, lapack_int n_err_bnds, double * err_bnds_norm,
    double * err_bnds_comp, lapack_int nparams, double * params)

Definition at line 36 of file lapacke_zgbsvxx.c.

  • LAPACKE_zgbsvxx_work — same energy, now with work and rwork:
lapack_int LAPACKE_zgbsvxx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int kl, lapack_int ku, lapack_int nrhs,
    lapack_complex_double * ab, lapack_int ldab, lapack_complex_double *
    afb, lapack_int ldafb, lapack_int * ipiv, char * equed, double * r,
    double * c, lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    rpvgrw, double * berr, lapack_int n_err_bnds, double * err_bnds_norm,
    double * err_bnds_comp, lapack_int nparams, double * params,
    lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgbsvxx_work.c.

  • LAPACKE_zgbtrf — short, sharp, and very zgb:
lapack_int LAPACKE_zgbtrf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_complex_double * ab, lapack_int
    ldab, lapack_int * ipiv)

Definition at line 36 of file lapacke_zgbtrf.c.

  • LAPACKE_zgbtrf_work — the _work twin, same signature:
lapack_int LAPACKE_zgbtrf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int kl, lapack_int ku, lapack_complex_double * ab, lapack_int
    ldab, lapack_int * ipiv)

Definition at line 36 of file lapacke_zgbtrf_work.c.

  • LAPACKE_zgbtrs — trans, n, kl, ku, nrhs, and friends:
lapack_int LAPACKE_zgbtrs (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_double * ab, lapack_int ldab, const lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgbtrs.c.

  • LAPACKE_zgbtrs_work — yup, the _work version too:
lapack_int LAPACKE_zgbtrs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int kl, lapack_int ku, lapack_int nrhs, const
    lapack_complex_double * ab, lapack_int ldab, const lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgbtrs_work.c.

  • LAPACKE_zgebak — job, side, ilo, ihi, scale, all present and accounted for:
lapack_int LAPACKE_zgebak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const double * scale,
    lapack_int m, lapack_complex_double * v, lapack_int ldv)

Definition at line 36 of file lapacke_zgebak.c.

  • LAPACKE_zgebak_work — the _work version of that same lineup:
lapack_int LAPACKE_zgebak_work (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const double * scale,
    lapack_int m, lapack_complex_double * v, lapack_int ldv)

Definition at line 36 of file lapacke_zgebak_work.c.

  • LAPACKE_zgebal — balancing routine signature, zero details dropped:
lapack_int LAPACKE_zgebal (int matrix_layout, char job, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_int * ilo, lapack_int
    * ihi, double * scale)

Definition at line 36 of file lapacke_zgebal.c.

  • LAPACKE_zgebal_work — same thing, _work edition:
lapack_int LAPACKE_zgebal_work (int matrix_layout, char job, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_int * ilo, lapack_int
    * ihi, double * scale)

Definition at line 36 of file lapacke_zgebal_work.c.

  • LAPACKE_zgebrd — d, e, tauq, taup, the whole cast:
lapack_int LAPACKE_zgebrd (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_double * a, lapack_int lda, double * d, double * e,
    lapack_complex_double * tauq, lapack_complex_double * taup)

Definition at line 36 of file lapacke_zgebrd.c.

  • LAPACKE_zgebrd_work — plus work and lwork, because of course:
lapack_int LAPACKE_zgebrd_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double * a, lapack_int lda, double * d, double * e,
    lapack_complex_double * tauq, lapack_complex_double * taup,
    lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgebrd_work.c.

  • LAPACKE_zgecon — norm, anorm, rcond, iconic behavior:
lapack_int LAPACKE_zgecon (int matrix_layout, char norm, lapack_int n, const
    lapack_complex_double * a, lapack_int lda, double anorm, double * rcond)

Definition at line 36 of file lapacke_zgecon.c.

  • LAPACKE_zgecon_work — and the _work version brings work + rwork:
lapack_int LAPACKE_zgecon_work (int matrix_layout, char norm, lapack_int n,
    const lapack_complex_double * a, lapack_int lda, double anorm, double *
    rcond, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgecon_work.c.

  • LAPACKE_zgeequ — r, c, rowcnd, colcnd, amax, no cap:
lapack_int LAPACKE_zgeequ (int matrix_layout, lapack_int m, lapack_int n,
    const lapack_complex_double * a, lapack_int lda, double * r, double * c,
    double * rowcnd, double * colcnd, double * amax)

Definition at line 36 of file lapacke_zgeequ.c.

  • LAPACKE_zgeequ_work — same signature, _work file:
lapack_int LAPACKE_zgeequ_work (int matrix_layout, lapack_int m, lapack_int
    n, const lapack_complex_double * a, lapack_int lda, double * r, double *
    c, double * rowcnd, double * colcnd, double * amax)

Definition at line 36 of file lapacke_zgeequ_work.c.

  • LAPACKE_zgeequb — the b is doing its little thing, signature below:
lapack_int LAPACKE_zgeequb (int matrix_layout, lapack_int m, lapack_int n,
    const lapack_complex_double * a, lapack_int lda, double * r, double * c,
    double * rowcnd, double * colcnd, double * amax)

Definition at line 36 of file lapacke_zgeequb.c.

  • LAPACKE_zgeequb_work — yes bestie, the _work one too:
lapack_int LAPACKE_zgeequb_work (int matrix_layout, lapack_int m, lapack_int
    n, const lapack_complex_double * a, lapack_int lda, double * r, double *
    c, double * rowcnd, double * colcnd, double * amax)

Definition at line 36 of file lapacke_zgeequb_work.c.

  • LAPACKE_zgees — jobvs, sort, LAPACK_Z_SELECT1, and the whole gang:
lapack_int LAPACKE_zgees (int matrix_layout, char jobvs, char sort,
    LAPACK_Z_SELECT1 select, lapack_int n, lapack_complex_double * a,
    lapack_int lda, lapack_int * sdim, lapack_complex_double * w,
    lapack_complex_double * vs, lapack_int ldvs)

Definition at line 36 of file lapacke_zgees.c.

  • LAPACKE_zgees_work — this one adds work, lwork, rwork, bwork:
lapack_int LAPACKE_zgees_work (int matrix_layout, char jobvs, char sort,
    LAPACK_Z_SELECT1 select, lapack_int n, lapack_complex_double * a,
    lapack_int lda, lapack_int * sdim, lapack_complex_double * w,
    lapack_complex_double * vs, lapack_int ldvs, lapack_complex_double *
    work, lapack_int lwork, double * rwork, lapack_logical * bwork)

Definition at line 36 of file lapacke_zgees_work.c.

  • LAPACKE_zgeesx — sense, rconde, rcondv, all up in here:
lapack_int LAPACKE_zgeesx (int matrix_layout, char jobvs, char sort,
    LAPACK_Z_SELECT1 select, char sense, lapack_int n, lapack_complex_double
    * a, lapack_int lda, lapack_int * sdim, lapack_complex_double * w,
    lapack_complex_double * vs, lapack_int ldvs, double * rconde, double *
    rcondv)

Definition at line 36 of file lapacke_zgeesx.c.

  • LAPACKE_zgeesx_work — the _work version with the extra buffers:
lapack_int LAPACKE_zgeesx_work (int matrix_layout, char jobvs, char sort,
    LAPACK_Z_SELECT1 select, char sense, lapack_int n, lapack_complex_double
    * a, lapack_int lda, lapack_int * sdim, lapack_complex_double * w,
    lapack_complex_double * vs, lapack_int ldvs, double * rconde, double *
    rcondv, lapack_complex_double * work, lapack_int lwork, double * rwork,
    lapack_logical * bwork)

Definition at line 36 of file lapacke_zgeesx_work.c.

  • LAPACKE_zgeev — jobvl, jobvr, eigenvalues and vectors, periodt:
lapack_int LAPACKE_zgeev (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * w, lapack_complex_double * vl, lapack_int ldvl,
    lapack_complex_double * vr, lapack_int ldvr)

Definition at line 36 of file lapacke_zgeev.c.

  • LAPACKE_zgeev_work — the _work buffer trio has entered:
lapack_int LAPACKE_zgeev_work (int matrix_layout, char jobvl, char jobvr,
    lapack_int n, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * w, lapack_complex_double * vl, lapack_int ldvl,
    lapack_complex_double * vr, lapack_int ldvr, lapack_complex_double *
    work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zgeev_work.c.

  • LAPACKE_zgeevx — balanc, ilo, ihi, scale, abnrm, rconde, rcondv, nobody left behind:
lapack_int LAPACKE_zgeevx (int matrix_layout, char balanc, char jobvl, char
    jobvr, char sense, lapack_int n, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * w, lapack_complex_double * vl, lapack_int
    ldvl, lapack_complex_double * vr, lapack_int ldvr, lapack_int * ilo,
    lapack_int * ihi, double * scale, double * abnrm, double * rconde,
    double * rcondv)

Definition at line 36 of file lapacke_zgeevx.c.

  • LAPACKE_zgeevx_work — same plus work, lwork, rwork:
lapack_int LAPACKE_zgeevx_work (int matrix_layout, char balanc, char jobvl,
    char jobvr, char sense, lapack_int n, lapack_complex_double * a,
    lapack_int lda, lapack_complex_double * w, lapack_complex_double * vl,
    lapack_int ldvl, lapack_complex_double * vr, lapack_int ldvr, lapack_int
    * ilo, lapack_int * ihi, double * scale, double * abnrm, double *
    rconde, double * rcondv, lapack_complex_double * work, lapack_int lwork,
    double * rwork)

Definition at line 36 of file lapacke_zgeevx_work.c.

  • LAPACKE_zgehrd — ilo, ihi, tau, and no missing pieces:
lapack_int LAPACKE_zgehrd (int matrix_layout, lapack_int n, lapack_int ilo,
    lapack_int ihi, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * tau)

Definition at line 36 of file lapacke_zgehrd.c.

  • LAPACKE_zgehrd_work — plus work and lwork, naturally:
lapack_int LAPACKE_zgehrd_work (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * tau, lapack_complex_double * work, lapack_int
    lwork)

Definition at line 36 of file lapacke_zgehrd_work.c.

  • LAPACKE_zgejsv — joba through jobp, plus stat and istat, it’s giving full cast:
lapack_int LAPACKE_zgejsv (int matrix_layout, char joba, char jobu, char
    jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int n,
    lapack_complex_double * a, lapack_int lda, double * sva,
    lapack_complex_double * u, lapack_int ldu, lapack_complex_double * v,
    lapack_int ldv, double * stat, lapack_int * istat)

Definition at line 36 of file lapacke_zgejsv.c.

  • LAPACKE_zgejsv_work — long list, but we keep every token:
lapack_int LAPACKE_zgejsv_work (int matrix_layout, char joba, char jobu,
    char jobv, char jobr, char jobt, char jobp, lapack_int m, lapack_int n,
    lapack_complex_double * a, lapack_int lda, double * sva,
    lapack_complex_double * u, lapack_int ldu, lapack_complex_double * v,
    lapack_int ldv, lapack_complex_double * cwork, lapack_int lwork, double
    * work, lapack_int lrwork, lapack_int * iwork)

Definition at line 36 of file lapacke_zgejsv_work.c.

  • LAPACKE_zgelq — t and tsize are here, bestie:
lapack_int LAPACKE_zgelq (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_complex_double * t,
    lapack_int tsize)

Definition at line 36 of file lapacke_zgelq.c.

  • LAPACKE_zgelq2 — cute little zgelq2 signature:
lapack_int LAPACKE_zgelq2 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau)

Definition at line 36 of file lapacke_zgelq2.c.

  • LAPACKE_zgelq2_work — and the _work one closes this batch with work included:
lapack_int LAPACKE_zgelq2_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double * a, lapack_int lda, lapack_complex_double *
    tau, lapack_complex_double * work)

Definition at line 36 of file lapacke_zgelq2_work.c.

LAPACKE_zgelq_work

lapack_int LAPACKE_zgelq_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * t, lapack_int tsize, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgelq_work.c.

It's the _work bestie — you bring your own scratch space, she brings the LQ. 💅


LAPACKE_zgelqf

lapack_int LAPACKE_zgelqf (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau)

Definition at line 36 of file lapacke_zgelqf.c.

z for double complex, gelqf for that LQ factorization moment. Iconic honestly. ✨


LAPACKE_zgelqf_work

lapack_int LAPACKE_zgelqf_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgelqf_work.c.

Same LQ energy, except now you're handing her work and lwork yourself. Main character behavior fr. 🫶


LAPACKE_zgels

lapack_int LAPACKE_zgels (int matrix_layout, char trans, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgels.c.

Least squares with a trans char, because she likes to know which way you're facing. Respect. 💜


LAPACKE_zgels_work

lapack_int LAPACKE_zgels_work (int matrix_layout, char trans, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgels_work.c.

The work-flavored zgels — same cast, plus work and lwork making a guest appearance. 🌸


LAPACKE_zgelsd

lapack_int LAPACKE_zgelsd (int matrix_layout, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * s, double rcond, lapack_int * rank)

Definition at line 36 of file lapacke_zgelsd.c.

Look at her, pulling up with s, rcond and a rank pointer. Overachiever behavior, we love to see it. 👑


LAPACKE_zgelsd_work

lapack_int LAPACKE_zgelsd_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * s, double rcond, lapack_int * rank, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int * iwork)

Definition at line 36 of file lapacke_zgelsd_work.c.

FULL loadout: work, lwork, rwork and iwork. She packed everything bestie, no cap. 🧳✨


LAPACKE_zgelss

lapack_int LAPACKE_zgelss (int matrix_layout, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * s, double rcond, lapack_int * rank)

Definition at line 36 of file lapacke_zgelss.c.

zgelss — double the s, double the slay. Singular values go in s, rcond does its thing, rank gets written. 🌈


LAPACKE_zgelss_work

lapack_int LAPACKE_zgelss_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * s, double rcond, lapack_int * rank, lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zgelss_work.c.

zgelss but she's got work, lwork, and rwork on her too. Prepared queen. 🎀


LAPACKE_zgelsy

lapack_int LAPACKE_zgelsy (int matrix_layout, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_int * jpvt, double rcond, lapack_int * rank)

Definition at line 36 of file lapacke_zgelsy.c.

That y at the end is for "yes bestie, here's your jpvt column permutation array." 💅


LAPACKE_zgelsy_work

lapack_int LAPACKE_zgelsy_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_int * jpvt, double rcond, lapack_int * rank, lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zgelsy_work.c.

Same jpvt-having legend, now with work, lwork and rwork tagging along. Obsessed. 🦋


LAPACKE_zgemlq

lapack_int LAPACKE_zgemlq (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * t, lapack_int tsize, lapack_complex_double * c, lapack_int ldc)

Definition at line 36 of file lapacke_zgemlq.c.

side? trans? a, t, tsize, c, ldc? She said "all of it, and make it const where it counts." 🔥


LAPACKE_zgemlq_work

lapack_int LAPACKE_zgemlq_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * t, lapack_int tsize, lapack_complex_double * c, lapack_int ldc, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgemlq_work.c.

The _work cut of zgemlq — everything the original takes, plus work and lwork. 💖


LAPACKE_zgemqr

lapack_int LAPACKE_zgemqr (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * t, lapack_int tsize, lapack_complex_double * c, lapack_int ldc)

Definition at line 36 of file lapacke_zgemqr.c.

s in gemqr-land? Nope — zgemqr is right here with her side/trans/t/tsize entourage. ⭐


LAPACKE_zgemqr_work

lapack_int LAPACKE_zgemqr_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * t, lapack_int tsize, lapack_complex_double * c, lapack_int ldc, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgemqr_work.c.

zgemqr's _work sibling, showing up with work and lwork like the plus-one everyone wants. 🫶


LAPACKE_zgemqrt

lapack_int LAPACKE_zgemqrt (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const lapack_complex_double * v, lapack_int ldv, const lapack_complex_double * t, lapack_int ldt, lapack_complex_double * c, lapack_int ldc)

Definition at line 36 of file lapacke_zgemqrt.c.

She brought nb and ldt and ldv — the blocky, compact-WY-adjacent one. It's giving "I know what I'm doing." 💅


LAPACKE_zgemqrt_work

lapack_int LAPACKE_zgemqrt_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, lapack_int nb, const lapack_complex_double * v, lapack_int ldv, const lapack_complex_double * t, lapack_int ldt, lapack_complex_double * c, lapack_int ldc, lapack_complex_double * work)

Definition at line 36 of file lapacke_zgemqrt_work.c.

Note the vibe check: same big signature, work appended at the end, and no lwork — that's just how she rolls here. 🙈


LAPACKE_zgeqlf

lapack_int LAPACKE_zgeqlf (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau)

Definition at line 36 of file lapacke_zgeqlf.c.

QL this time, not LQ. Same letters, completely different lewk. Understand the difference bestie. 💜


LAPACKE_zgeqlf_work

lapack_int LAPACKE_zgeqlf_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgeqlf_work.c.

QL factorization, but you're supplying the work and lwork. Very DIY of you. ✨


LAPACKE_zgeqp3

lapack_int LAPACKE_zgeqp3 (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * jpvt, lapack_complex_double * tau)

Definition at line 36 of file lapacke_zgeqp3.c.

The p is for pivoting, the 3 is for "she's been through revisions and she's better for it." jpvt and tau both in the building. 👑


LAPACKE_zgeqp3_work

lapack_int LAPACKE_zgeqp3_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * jpvt, lapack_complex_double * tau, lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zgeqp3_work.c.

Pivoted QR with the full backstage crew: work, lwork, rwork. She does not travel light. 🌈


LAPACKE_zgeqpf

lapack_int LAPACKE_zgeqpf (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * jpvt, lapack_complex_double * tau)

Definition at line 36 of file lapacke_zgeqpf.c.

No 3 at the end, but all the same faces on stage: jpvt and tau. 🎀


LAPACKE_zgeqpf_work

lapack_int LAPACKE_zgeqpf_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * jpvt, lapack_complex_double * tau, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgeqpf_work.c.

zgeqpf in work mode — work and rwork are here, and there's no lwork in sight. That's the whole guest list, no add-ons. 🦋


LAPACKE_zgeqr

lapack_int LAPACKE_zgeqr (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * t, lapack_int tsize)

Definition at line 36 of file lapacke_zgeqr.c.

Look at her — t and tsize instead of tau. New era, same QR excellence. ✨


LAPACKE_zgeqr2

lapack_int LAPACKE_zgeqr2 (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau)

Definition at line 36 of file lapacke_zgeqr2.c.

zgeqr2, the unblocked little sister. Small signature energy, tau included. 💖


LAPACKE_zgeqr2_work

lapack_int LAPACKE_zgeqr2_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau, lapack_complex_double * work)

Definition at line 36 of file lapacke_zgeqr2_work.c.

Just work tacked on — no lwork, no drama. She keeps it cute and minimal. 🍓


LAPACKE_zgeqr_work

lapack_int LAPACKE_zgeqr_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * t, lapack_int tsize, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgeqr_work.c.

t + tsize + work + lwork. The full QR-with-T package, assembled and ready. 💅


LAPACKE_zgeqrf

lapack_int LAPACKE_zgeqrf (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau)

Definition at line 36 of file lapacke_zgeqrf.c.

The classic. The blueprint. zgeqrf walked so the rest could run. 🏆


LAPACKE_zgeqrf_work

lapack_int LAPACKE_zgeqrf_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgeqrf_work.c.

The blueprint, but you're the one bringing work and lwork to the function. Fair trade honestly. 🫶


LAPACKE_zgeqrfp

lapack_int LAPACKE_zgeqrfp (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau)

Definition at line 36 of file lapacke_zgeqrfp.c.

That trailing p is not a typo bestie, she's just built different. tau is right there where you left it. 🌸


LAPACKE_zgeqrfp_work

lapack_int LAPACKE_zgeqrfp_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgeqrfp_work.c.

zgeqrfp plus your favorite duo, work and lwork. No notes. ⭐


LAPACKE_zgeqrt

lapack_int LAPACKE_zgeqrt (int matrix_layout, lapack_int m, lapack_int n, lapack_int nb, lapack_complex_double * a, lapack_int lda, lapack_complex_double * t, lapack_int ldt)

Definition at line 36 of file lapacke_zgeqrt.c.

nb and ldt in the house — block size and the T matrix's leading dimension, doing their little dance. 🎀


LAPACKE_zgeqrt2

lapack_int LAPACKE_zgeqrt2 (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * t, lapack_int ldt)

Definition at line 36 of file lapacke_zgeqrt2.c.

The 2 version: no nb, just m, n, a, lda, t, ldt. Streamlined and unbothered. 🦋


LAPACKE_zgeqrt2_work

lapack_int LAPACKE_zgeqrt2_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * t, lapack_int ldt)

Definition at line 36 of file lapacke_zgeqrt2_work.c

Honestly? Same signature as zgeqrt2, _work in the name and everything. She ate and left zero crumbs. 💀


LAPACKE_zgeqrt3

lapack_int LAPACKE_zgeqrt3 (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * t, lapack_int ldt)

Definition at line 36 of file lapacke_zgeqrt3.c.

A whole 3 this time. Same m, n, a, lda, t, ldt lineup though — consistency queen. 👑


LAPACKE_zgeqrt3_work

lapack_int LAPACKE_zgeqrt3_work (int matrix_layout, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * t, lapack_int ldt)

Definition at line 36 of file lapacke_zgeqrt3_work.c.

zgeqrt3 with _work on the label — identical parameters, zero extra baggage. Respectfully, slay. 🔥


LAPACKE_zgeqrt_work

lapack_int LAPACKE_zgeqrt_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int nb, lapack_complex_double * a, lapack_int lda, lapack_complex_double * t, lapack_int ldt, lapack_complex_double * work)

Definition at line 36 of file lapacke_zgeqrt_work.c.

nb and work, but again — no lwork. Read the signature carefully bestie, this one's particular. 🙈


LAPACKE_zgerfs

lapack_int LAPACKE_zgerfs (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const lapack_int * ipiv, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr)

Definition at line 36 of file lapacke_zgerfs.c.

Refinement time ✨ — a, af, ipiv, b, x, all const-ified where she can, and ferr/berr collecting the receipts.


LAPACKE_zgerfs_work

lapack_int LAPACKE_zgerfs_work (int matrix_layout, char trans, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const lapack_int * ipiv, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgerfs_work.c.

The _work version of zgerfs, now with work and rwork joining the lineup at the very end. Same energy, more room. 💜

LAPACKE_zgerfsx

lapack_int LAPACKE_zgerfsx (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * a,
    lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const
    lapack_int * ipiv, const double * r, const double * c, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * berr, lapack_int n_err_bnds,
    double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams,
    double * params)

Definition at line 36 of file lapacke_zgerfsx.c.

okay bestie, this one is a whole situation — it's the error-bounds-and-refinement girlie for the z (aka lapack_complex_double) general matrices. Look at that arg list, she is not travelling light: matrix_layout, trans, equed, n, nrhs, a, lda, af, ldaf, ipiv, r, c, b, ldb, x, ldx, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. Literally every single one accounted for 💅


LAPACKE_zgerfsx_work

lapack_int LAPACKE_zgerfsx_work (int matrix_layout, char trans, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * a,
    lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const
    lapack_int * ipiv, const double * r, const double * c, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * berr, lapack_int n_err_bnds,
    double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams,
    double * params, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgerfsx_work.c.

same exact energy as LAPACKE_zgerfsx but you bring your own scratch space — the two extra besties at the end are work and rwork, and that's the entire difference, no cap 🫶


LAPACKE_zgerqf

lapack_int LAPACKE_zgerqf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau)

Definition at line 36 of file lapacke_zgerqf.c.

short, sweet, iconic: matrix_layout, m, n, a, lda, tau. Six args and she's out ✨


LAPACKE_zgerqf_work

lapack_int LAPACKE_zgerqf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double * a, lapack_int lda, lapack_complex_double *
    tau, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgerqf_work.c.

the _work twin, now featuring work and lwork because girlie needs room to breathe 💖


LAPACKE_zgesdd

lapack_int LAPACKE_zgesdd (int matrix_layout, char jobz, lapack_int m,
    lapack_int n, lapack_complex_double * a, lapack_int lda, double * s,
    lapack_complex_double * u, lapack_int ldu, lapack_complex_double * vt,
    lapack_int ldvt)

Definition at line 36 of file lapacke_zgesdd.c.

the one everybody's obsessed with, lowkey. args: matrix_layout, jobz, m, n, a, lda, s, u, ldu, vt, ldvt. she's giving main character energy in every numerical linear algebra syllabus 🎀


LAPACKE_zgesdd_work

lapack_int LAPACKE_zgesdd_work (int matrix_layout, char jobz, lapack_int m,
    lapack_int n, lapack_complex_double * a, lapack_int lda, double * s,
    lapack_complex_double * u, lapack_int ldu, lapack_complex_double * vt,
    lapack_int ldvt, lapack_complex_double * work, lapack_int lwork, double
    * rwork, lapack_int * iwork)

Definition at line 36 of file lapacke_zgesdd_work.c.

same call, but now you're supplying work, lwork, rwork and iwork. four extra args, four extra little responsibilities 🙈


LAPACKE_zgesv

lapack_int LAPACKE_zgesv (int matrix_layout, lapack_int n, lapack_int nrhs,
    lapack_complex_double * a, lapack_int lda, lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgesv.c.

the classic. matrix_layout, n, nrhs, a, lda, ipiv, b, ldb. eight args, zero notes, absolutely ate 🔥


LAPACKE_zgesv_work

lapack_int LAPACKE_zgesv_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgesv_work.c.

and no, you're not tripping — the _work version here has the exact same parameter list as the non-_work one. same matrix_layout, n, nrhs, a, lda, ipiv, b, ldb, no sneaky work argument tacked on. we love a consistent queen 💜


LAPACKE_zgesvd

lapack_int LAPACKE_zgesvd (int matrix_layout, char jobu, char jobvt,
    lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda,
    double * s, lapack_complex_double * u, lapack_int ldu,
    lapack_complex_double * vt, lapack_int ldvt, double * superb)

Definition at line 36 of file lapacke_zgesvd.c.

matrix_layout, jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, superb. yes the last one is literally called superb and honestly? she earned that name 💅


LAPACKE_zgesvd_work

lapack_int LAPACKE_zgesvd_work (int matrix_layout, char jobu, char jobvt,
    lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda,
    double * s, lapack_complex_double * u, lapack_int ldu,
    lapack_complex_double * vt, lapack_int ldvt, lapack_complex_double *
    work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zgesvd_work.c.

note the glow-up: no superb in this one, but you do get work, lwork and rwork. read the signature, bestie, don't assume 😭


LAPACKE_zgesvdx

lapack_int LAPACKE_zgesvdx (int matrix_layout, char jobu, char jobvt, char
    range, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int
    lda, double vl, double vu, lapack_int il, lapack_int iu, lapack_int *
    ns, double * s, lapack_complex_double * u, lapack_int ldu,
    lapack_complex_double * vt, lapack_int ldvt, lapack_int * superb)

Definition at line 36 of file lapacke_zgesvdx.c.

okay this one is long. deep breath: matrix_layout, jobu, jobvt, range, m, n, a, lda, vl, vu, il, iu, ns, s, u, ldu, vt, ldvt, superb. nineteen. count 'em. 💀


LAPACKE_zgesvdx_work

lapack_int LAPACKE_zgesvdx_work (int matrix_layout, char jobu, char jobvt,
    char range, lapack_int m, lapack_int n, lapack_complex_double * a,
    lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu,
    lapack_int * ns, double * s, lapack_complex_double * u, lapack_int ldu,
    lapack_complex_double * vt, lapack_int ldvt, lapack_complex_double *
    work, lapack_int lwork, double * rwork, lapack_int * iwork)

Definition at line 36 of file lapacke_zgesvdx_work.c.

same nineteen, plus work, lwork, rwork, iwork. she's thorough and she's not sorry about it 🌸


LAPACKE_zgesvj

lapack_int LAPACKE_zgesvj (int matrix_layout, char joba, char jobu, char
    jobv, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int
    lda, double * sva, lapack_int mv, lapack_complex_double * v, lapack_int
    ldv, double * stat)

Definition at line 36 of file lapacke_zgesvj.c.

matrix_layout, joba, jobu, jobv, m, n, a, lda, sva, mv, v, ldv, stat. note that it's sva here, not plain s — keep your eyes open, the letters matter 👀


LAPACKE_zgesvj_work

lapack_int LAPACKE_zgesvj_work (int matrix_layout, char joba, char jobu,
    char jobv, lapack_int m, lapack_int n, lapack_complex_double * a,
    lapack_int lda, double * sva, lapack_int mv, lapack_complex_double * v,
    lapack_int ldv, lapack_complex_double * cwork, lapack_int lwork, double
    * rwork, lapack_int lrwork)

Definition at line 36 of file lapacke_zgesvj_work.c.

plot twist bestie: the work array here is called cwork, not work, and she comes with her own lwork… plus rwork with lrwork. two lengths. not a typo. 🦋


LAPACKE_zgesvx

lapack_int LAPACKE_zgesvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv,
    char * equed, double * r, double * c, lapack_complex_double * b,
    lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double *
    rcond, double * ferr, double * berr, double * rpivot)

Definition at line 36 of file lapacke_zgesvx.c.

the fancy one with the equilibration glow-up: matrix_layout, fact, trans, n, nrhs, a, lda, af, ldaf, ipiv, equed, r, c, b, ldb, x, ldx, rcond, ferr, berr, rpivot. yes rpivot is in there, don't forget her 🎀


LAPACKE_zgesvx_work

lapack_int LAPACKE_zgesvx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv,
    char * equed, double * r, double * c, lapack_complex_double * b,
    lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double *
    rcond, double * ferr, double * berr, lapack_complex_double * work,
    double * rwork)

Definition at line 36 of file lapacke_zgesvx_work.c.

here rpivot dips and work + rwork slide in. everything else? identical, character for character 💅


LAPACKE_zgesvxx

lapack_int LAPACKE_zgesvxx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv,
    char * equed, double * r, double * c, lapack_complex_double * b,
    lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double *
    rcond, double * rpvgrw, double * berr, lapack_int n_err_bnds, double *
    err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double *
    params)

Definition at line 36 of file lapacke_zgesvxx.c.

double-x means extra everything ✨ matrix_layout, fact, trans, n, nrhs, a, lda, af, ldaf, ipiv, equed, r, c, b, ldb, x, ldx, rcond, rpvgrw, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. that's the whole squad 🫶


LAPACKE_zgesvxx_work

lapack_int LAPACKE_zgesvxx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv,
    char * equed, double * r, double * c, lapack_complex_double * b,
    lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double *
    rcond, double * rpvgrw, double * berr, lapack_int n_err_bnds, double *
    err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double *
    params, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgesvxx_work.c.

same twenty-five plus work and rwork on the end. she's long but she's worth it 😌


LAPACKE_zgetf2

lapack_int LAPACKE_zgetf2 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_zgetf2.c.

tiny. precious. six args: matrix_layout, m, n, a, lda, ipiv. the little routine that could 🍓


LAPACKE_zgetf2_work

lapack_int LAPACKE_zgetf2_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_zgetf2_work.c.

identical parameter list to the plain version — matrix_layout, m, n, a, lda, ipiv. no work, no extras. matching sets, bestie 🎀


LAPACKE_zgetrf

lapack_int LAPACKE_zgetrf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_zgetrf.c.

matrix_layout, m, n, a, lda, ipiv. she's everywhere and she knows it 👑


LAPACKE_zgetrf2

lapack_int LAPACKE_zgetrf2 (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_zgetrf2.c.

the 2 at the end is doing all the work aesthetically, but the args are the exact same six: matrix_layout, m, n, a, lda, ipiv 🌈


LAPACKE_zgetrf2_work

lapack_int LAPACKE_zgetrf2_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_zgetrf2_work.c.

matrix_layout, m, n, a, lda, ipiv. that's it. that's the tweet 💜


LAPACKE_zgetrf_work

lapack_int LAPACKE_zgetrf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_zgetrf_work.c.

and again — matrix_layout, m, n, a, lda, ipiv, no hidden extras. these four are matching besties, it's giving coordinating outfits 💖


LAPACKE_zgetri

lapack_int LAPACKE_zgetri (int matrix_layout, lapack_int n,
    lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv)

Definition at line 36 of file lapacke_zgetri.c.

five args and a tiny detail worth clocking: that's const lapack_int * ipiv, with the const — this girlie reads ipiv, she doesn't touch it 💅


LAPACKE_zgetri_work

lapack_int LAPACKE_zgetri_work (int matrix_layout, lapack_int n,
    lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv,
    lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgetri_work.c.

same as above (const lapack_int * ipiv stays const, we stan consistency) plus your own work and lwork 🦋


LAPACKE_zgetrs

lapack_int LAPACKE_zgetrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgetrs.c.

matrix_layout, trans, n, nrhs, a, lda, ipiv, b, ldb — and the consts are doing numbers here: const lapack_complex_double * a and const lapack_int * ipiv. she reads, she writes to b, she leaves a and ipiv alone 🌸


LAPACKE_zgetrs_work

lapack_int LAPACKE_zgetrs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgetrs_work.c.

yes, the parameter list is identical to LAPACKE_zgetrs, consts and all. no extra work argument, no notes. read it twice if you must 👀


LAPACKE_zgetsls

lapack_int LAPACKE_zgetsls (int matrix_layout, char trans, lapack_int m,
    lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgetsls.c.

matrix_layout, trans, m, n, nrhs, a, lda, b, ldb. see how she's got m and n but no ipiv? different girlie, different vibe ✨


LAPACKE_zgetsls_work

lapack_int LAPACKE_zgetsls_work (int matrix_layout, char trans, lapack_int
    m, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_zgetsls_work.c.

the same nine, plus work and lwork so you can bring the workspace yourself 🫶


LAPACKE_zggbak

lapack_int LAPACKE_zggbak (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const double * lscale,
    const double * rscale, lapack_int m, lapack_complex_double * v,
    lapack_int ldv)

Definition at line 36 of file lapacke_zggbak.c.

okay the gg girlies have so many args and i'm obsessed. here: matrix_layout, job, side, n, ilo, ihi, lscale, rscale, m, v, ldv. both scales are const double *, mwah 💋


LAPACKE_zggbak_work

lapack_int LAPACKE_zggbak_work (int matrix_layout, char job, char side,
    lapack_int n, lapack_int ilo, lapack_int ihi, const double * lscale,
    const double * rscale, lapack_int m, lapack_complex_double * v,
    lapack_int ldv)

Definition at line 36 of file lapacke_zggbak_work.c.

identical list to LAPACKE_zggbak — matrix_layout, job, side, n, ilo, ihi, lscale, rscale, m, v, ldv. no work in sight, and that's that 🎀


LAPACKE_zggbal

lapack_int LAPACKE_zggbal (int matrix_layout, char job, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_complex_double * b,
    lapack_int ldb, lapack_int * ilo, lapack_int * ihi, double * lscale,
    double * rscale)

Definition at line 36 of file lapacke_zggbal.c.

matrix_layout, job, n, a, lda, b, ldb, ilo, ihi, lscale, rscale. note that ilo and ihi are lapack_int * (outputs, bestie, you pass the address) while the scales are plain old double * 🦋


LAPACKE_zggbal_work

lapack_int LAPACKE_zggbal_work (int matrix_layout, char job, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_complex_double * b,
    lapack_int ldb, lapack_int * ilo, lapack_int * ihi, double * lscale,
    double * rscale, double * work)

Definition at line 36 of file lapacke_zggbal_work.c.

exactly that plus a single trailing work — one double *, no lwork length hanging around. slightly unhinged of her but we respect it 💀

LAPACKE_zgges

lapack_int LAPACKE_zgges (int matrix_layout, char jobvsl, char jobvsr, char sort, LAPACK_Z_SELECT2 selctg, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_int * sdim, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vsl, lapack_int ldvsl, lapack_complex_double * vsr, lapack_int ldvsr)

Definition at line 36 of file lapacke_zgges.c.

okay so this one is the full deluxe package 💅 — you get matrix_layout, both jobvsl and jobvsr, a sort flag, a LAPACK_Z_SELECT2 selctg callback, n, your two matrices a (with lda) and b (with ldb), an output sdim pointer, alpha and beta, plus both eigenvector outputs vsl/vsr and their leading dimensions ldvsl/ldvsr. that's a lot of arguments bestie, count them before you call, fr fr 🎀

LAPACKE_zgges3

lapack_int LAPACKE_zgges3 (int matrix_layout, char jobvsl, char jobvsr, char sort, LAPACK_Z_SELECT2 selctg, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_int * sdim, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vsl, lapack_int ldvsl, lapack_complex_double * vsr, lapack_int ldvsr)

Definition at line 36 of file lapacke_zgges3.c.

same signature as the one above, character for character ✨ — the only thing that changed is the file it lives in. so if you're swapping between them, your call site does not need to move a muscle 🫶

LAPACKE_zgges3_work

lapack_int LAPACKE_zgges3_work (int matrix_layout, char jobvsl, char jobvsr, char sort, LAPACK_Z_SELECT2 selctg, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_int * sdim, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vsl, lapack_int ldvsl, lapack_complex_double * vsr, lapack_int ldvsr, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_logical * bwork)

Definition at line 36 of file lapacke_zgges3_work.c.

the _work version 🧚 — everything from zgges3 is still there, and then at the tail end you pick up work, lwork, rwork and bwork. yes you're managing your own scratch space now, you're so grown 💖

LAPACKE_zgges_work

lapack_int LAPACKE_zgges_work (int matrix_layout, char jobvsl, char jobvsr, char sort, LAPACK_Z_SELECT2 selctg, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_int * sdim, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vsl, lapack_int ldvsl, lapack_complex_double * vsr, lapack_int ldvsr, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_logical * bwork)

Definition at line 36 of file lapacke_zgges_work.c.

and here's the work-form of the non-3 one. same argument list as LAPACKE_zgges3_work, different file — lapacke_zgges_work.c. keep your eyes on the filename bestie, they are twins 👯

LAPACKE_zggesx

lapack_int LAPACKE_zggesx (int matrix_layout, char jobvsl, char jobvsr, char sort, LAPACK_Z_SELECT2 selctg, char sense, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_int * sdim, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vsl, lapack_int ldvsl, lapack_complex_double * vsr, lapack_int ldvsr, double * rconde, double * rcondv)

Definition at line 36 of file lapacke_zggesx.c.

the x variant 🦋 — it slides a char sense in right after selctg, and it brings two extra outputs at the very end: rconde and rcondv. everything else is in the same order you already memorised (you did memorise it, right 😭)

LAPACKE_zggesx_work

lapack_int LAPACKE_zggesx_work (int matrix_layout, char jobvsl, char jobvsr, char sort, LAPACK_Z_SELECT2 selctg, char sense, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_int * sdim, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vsl, lapack_int ldvsl, lapack_complex_double * vsr, lapack_int ldvsr, double * rconde, double * rcondv, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int * iwork, lapack_int liwork, lapack_logical * bwork)

Definition at line 36 of file lapacke_zggesx_work.c.

okay this is the longest one in this batch 💀 zggesx_work keeps the whole zggesx sandwich and then stacks work, lwork, rwork, iwork, liwork, bwork on top. note that this one has an int-flavoured iwork and a liwork, plus the lapack_logical * bwork — five scratch pointers, no cap. count them twice before you compile 🙈

LAPACKE_zggev

lapack_int LAPACKE_zggev (int matrix_layout, char jobvl, char jobvr, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr, lapack_int ldvr)

Definition at line 36 of file lapacke_zggev.c.

new family, new flags ✨ — no sort, no selctg, no sdim here. just jobvl / jobvr, n, the two matrices a (lda) and b (ldb), then alpha, beta, and the vector outputs vl (ldvl) and vr (ldvr). it's giving clean and simple 🌸

LAPACKE_zggev3

lapack_int LAPACKE_zggev3 (int matrix_layout, char jobvl, char jobvr, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr, lapack_int ldvr)

Definition at line 36 of file lapacke_zggev3.c.

identical argument list to LAPACKE_zggev 💅 only the file name grew a 3. iconic, no notes.

LAPACKE_zggev3_work

lapack_int LAPACKE_zggev3_work (int matrix_layout, char jobvl, char jobvr, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr, lapack_int ldvr, lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zggev3_work.c.

the work form 🎀 tacks exactly three extras on the end: work, lwork, rwork. only three, bestie, breathe 😭

LAPACKE_zggev_work

lapack_int LAPACKE_zggev_work (int matrix_layout, char jobvl, char jobvr, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr, lapack_int ldvr, lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zggev_work.c.

same three extras (work, lwork, rwork), same everything else, different file. it's a matching set with zggev3_work, iykyk 🫶

LAPACKE_zggevx

lapack_int LAPACKE_zggevx (int matrix_layout, char balanc, char jobvl, char jobvr, char sense, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr, lapack_int ldvr, lapack_int * ilo, lapack_int * ihi, double * lscale, double * rscale, double * abnrm, double * bbnrm, double * rconde, double * rcondv)

Definition at line 36 of file lapacke_zggevx.c.

the maximalist one 👑 balanc first, then jobvl, jobvr, and a sense — then the usual n, a/lda, b/ldb, alpha, beta, vl/ldvl, vr/ldvr. and then the afterparty: ilo, ihi, lscale, rscale, abnrm, bbnrm, rconde, rcondv. that's eight, yes eight, trailing pointers. hydrate before you write this call 💀🍓

LAPACKE_zggevx_work

lapack_int LAPACKE_zggevx_work (int matrix_layout, char balanc, char jobvl, char jobvr, char sense, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr, lapack_int ldvr, lapack_int * ilo, lapack_int * ihi, double * lscale, double * rscale, double * abnrm, double * bbnrm, double * rconde, double * rcondv, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int * iwork, lapack_logical * bwork)

Definition at line 36 of file lapacke_zggevx_work.c.

and the work form just keeps going 💅 after rcondv you get work, lwork, rwork, iwork, bwork. it's giving scroll bar — but every single one of those arguments is real and you need all of them, periodt.

LAPACKE_zggglm

lapack_int LAPACKE_zggglm (int matrix_layout, lapack_int n, lapack_int m, lapack_int p, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * d, lapack_complex_double * x, lapack_complex_double * y)

Definition at line 36 of file lapacke_zggglm.c.

cute and compact 🎀 — matrix_layout, then the dimensions n, m, p (note the order: n before m, girlies), a/lda, b/ldb, and three lone pointers with no leading dimension in sight: d, x, y. slay.

LAPACKE_zggglm_work

lapack_int LAPACKE_zggglm_work (int matrix_layout, lapack_int n, lapack_int m, lapack_int p, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * d, lapack_complex_double * x, lapack_complex_double * y, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zggglm_work.c.

same as above plus work and lwork at the end. two extras and done ✨

LAPACKE_zgghd3

lapack_int LAPACKE_zgghd3 (int matrix_layout, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z, lapack_int ldz)

Definition at line 36 of file lapacke_zgghd3.c.

compq and compz, bestie 🦋 — then n, ilo, ihi (those two are ints, not pointers, don't @ me), a/lda, b/ldb, q/ldq, z/ldz. four matrix-and-ld pairs, one layout, three ints, two chars. tidy.

LAPACKE_zgghd3_work

lapack_int LAPACKE_zgghd3_work (int matrix_layout, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgghd3_work.c.

identical to LAPACKE_zgghd3 and then work, lwork. that's it, that's the tweet 💜

LAPACKE_zgghrd

lapack_int LAPACKE_zgghrd (int matrix_layout, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z, lapack_int ldz)

Definition at line 36 of file lapacke_zgghrd.c.

yup, this is the same argument list as LAPACKE_zgghd3 — different file (lapacke_zgghrd.c), zero signature drama 🌸

LAPACKE_zgghrd_work

lapack_int LAPACKE_zgghrd_work (int matrix_layout, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z, lapack_int ldz)

Definition at line 36 of file lapacke_zgghrd_work.c.

plot twist 🫶 — this _work one has no work and no lwork in the signature. it ends at ldz, exactly like the non-work version. don't go adding arguments that aren't there, bestie, that's how compilers get mad at you 😭

LAPACKE_zgglse

lapack_int LAPACKE_zgglse (int matrix_layout, lapack_int m, lapack_int n, lapack_int p, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * c, lapack_complex_double * d, lapack_complex_double * x)

Definition at line 36 of file lapacke_zgglse.c.

careful, the dimension order flips here: it's m, n, p — m first this time, unlike zggglm's n, m, p. then a/lda, b/ldb, and the bare pointers c, d, x. the way that ordering matters… 👀

LAPACKE_zgglse_work

lapack_int LAPACKE_zgglse_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int p, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * c, lapack_complex_double * d, lapack_complex_double * x, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zgglse_work.c.

plus work and lwork. classic ✨

LAPACKE_zggqrf

lapack_int LAPACKE_zggqrf (int matrix_layout, lapack_int n, lapack_int m, lapack_int p, lapack_complex_double * a, lapack_int lda, lapack_complex_double * taua, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * taub)

Definition at line 36 of file lapacke_zggqrf.c.

🎀 n, m, p — n first again — then a/lda, a taua, b/ldb, and a taub to close it out. note the interleaving: taua sits between a and b, taub sits at the very end. don't shuffle them, i'm begging 🙈

LAPACKE_zggqrf_work

lapack_int LAPACKE_zggqrf_work (int matrix_layout, lapack_int n, lapack_int m, lapack_int p, lapack_complex_double * a, lapack_int lda, lapack_complex_double * taua, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * taub, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zggqrf_work.c.

same plus work, lwork. 10/10, no notes 💅

LAPACKE_zggrqf

lapack_int LAPACKE_zggrqf (int matrix_layout, lapack_int m, lapack_int p, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * taua, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * taub)

Definition at line 36 of file lapacke_zggrqf.c.

vibe check ⚠️ this one is not a copy of zggqrf — the dimension triple is m, p, n. the others stay put: a/lda, taua, b/ldb, taub. it's giving "trust nobody, read the signature" 🔥

LAPACKE_zggrqf_work

lapack_int LAPACKE_zggrqf_work (int matrix_layout, lapack_int m, lapack_int p, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * taua, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * taub, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zggrqf_work.c.

m, p, n again here (yes, still that order) plus work, lwork 🫶

LAPACKE_zggsvd

lapack_int LAPACKE_zggsvd (int matrix_layout, char jobu, char jobv, char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k, lapack_int * l, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * alpha, double * beta, lapack_complex_double * u, lapack_int ldu, lapack_complex_double * v, lapack_int ldv, lapack_complex_double * q, lapack_int ldq, lapack_int * iwork)

Definition at line 36 of file lapacke_zggsvd.c.

big one 👑 three chars up front (jobu, jobv, jobq), then m, n, p, then two pointers to ints k and l, then a/lda, b/ldb, then alpha and beta as double * (yes, plain doubles even though everything else is complex double — that's what's written, bestie), then u/ldu, v/ldv, q/ldq, and finally a stray iwork. seventeen-ish arguments of pure main character energy ✨

LAPACKE_zggsvd3

lapack_int LAPACKE_zggsvd3 (int matrix_layout, char jobu, char jobv, char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k, lapack_int * l, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * alpha, double * beta, lapack_complex_double * u, lapack_int ldu, lapack_complex_double * v, lapack_int ldv, lapack_complex_double * q, lapack_int ldq, lapack_int * iwork)

Definition at line 36 of file lapacke_zggsvd3.c.

same exact list as LAPACKE_zggsvd, just living in lapacke_zggsvd3.c 💖 swap the call, keep the args, go live your life 🦋

💜 LAPACKE_zggsvd3_work

okay so this one's the worker for the generalized SVD (the 3 edition, bestie), and look at that parameter list, it's giving "I know what I'm doing":

lapack_int LAPACKE_zggsvd3_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb, double * alpha, double *
    beta, lapack_complex_double * u, lapack_int ldu, lapack_complex_double *
    v, lapack_int ldv, lapack_complex_double * q, lapack_int ldq,
    lapack_complex_double * work, lapack_int lwork, double * rwork,
    lapack_int * iwork)

Definition at line 36 of file lapacke_zggsvd3_work.c.


💜 LAPACKE_zggsvd_work

same energy as above but without the lwork moment — yes it still has work, it just doesn't ask you for the workspace size ✨

lapack_int LAPACKE_zggsvd_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int n, lapack_int p, lapack_int * k,
    lapack_int * l, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb, double * alpha, double *
    beta, lapack_complex_double * u, lapack_int ldu, lapack_complex_double *
    v, lapack_int ldv, lapack_complex_double * q, lapack_int ldq,
    lapack_complex_double * work, double * rwork, lapack_int * iwork)

Definition at line 36 of file lapacke_zggsvd_work.c.


🎀 LAPACKE_zggsvp

the preprocessing queen 👑 note the order here is m, p, n — not m, n, p, so bestie please read the signature before you yell at your code:

lapack_int LAPACKE_zggsvp (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, lapack_complex_double *
    a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double
    tola, double tolb, lapack_int * k, lapack_int * l, lapack_complex_double
    * u, lapack_int ldu, lapack_complex_double * v, lapack_int ldv,
    lapack_complex_double * q, lapack_int ldq)

Definition at line 36 of file lapacke_zggsvp.c.


🎀 LAPACKE_zggsvp3

literally the 3 variant of the one above and the signature is identical in every character, so don't come for me 💅

lapack_int LAPACKE_zggsvp3 (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, lapack_complex_double *
    a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double
    tola, double tolb, lapack_int * k, lapack_int * l, lapack_complex_double
    * u, lapack_int ldu, lapack_complex_double * v, lapack_int ldv,
    lapack_complex_double * q, lapack_int ldq)

Definition at line 36 of file lapacke_zggsvp3.c.


🦋 LAPACKE_zggsvp3_work

and here's the worker version, which brings the whole friend group: iwork, rwork, tau, work and lwork all showed up 🫶

lapack_int LAPACKE_zggsvp3_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_complex_double * b,
    lapack_int ldb, double tola, double tolb, lapack_int * k, lapack_int *
    l, lapack_complex_double * u, lapack_int ldu, lapack_complex_double * v,
    lapack_int ldv, lapack_complex_double * q, lapack_int ldq, lapack_int *
    iwork, double * rwork, lapack_complex_double * tau,
    lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zggsvp3_work.c.


🦋 LAPACKE_zggsvp_work

same lineup, minus the lwork at the end — the workspace is just there, no size negotiation 😌

lapack_int LAPACKE_zggsvp_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_complex_double * b,
    lapack_int ldb, double tola, double tolb, lapack_int * k, lapack_int *
    l, lapack_complex_double * u, lapack_int ldu, lapack_complex_double * v,
    lapack_int ldv, lapack_complex_double * q, lapack_int ldq, lapack_int *
    iwork, double * rwork, lapack_complex_double * tau,
    lapack_complex_double * work)

Definition at line 36 of file lapacke_zggsvp_work.c.


🌸 LAPACKE_zgtcon

tridiagonal condition estimator, no matrix_layout in sight — it just starts with norm and goes. iconic honestly:

lapack_int LAPACKE_zgtcon (char norm, lapack_int n, const
    lapack_complex_double * dl, const lapack_complex_double * d, const
    lapack_complex_double * du, const lapack_complex_double * du2, const
    lapack_int * ipiv, double anorm, double * rcond)

Definition at line 36 of file lapacke_zgtcon.c.


🌸 LAPACKE_zgtcon_work

same, plus a work array tacked on the end because of course 🎀

lapack_int LAPACKE_zgtcon_work (char norm, lapack_int n, const
    lapack_complex_double * dl, const lapack_complex_double * d, const
    lapack_complex_double * du, const lapack_complex_double * du2, const
    lapack_int * ipiv, double anorm, double * rcond, lapack_complex_double *
    work)

Definition at line 36 of file lapacke_zgtcon_work.c.


⭐ LAPACKE_zgtrfs

refinement time bestie — so many const pointers, dlf, df, duf, du2, ipiv, then b, x, ferr, berr:

lapack_int LAPACKE_zgtrfs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * dl, const
    lapack_complex_double * d, const lapack_complex_double * du, const
    lapack_complex_double * dlf, const lapack_complex_double * df, const
    lapack_complex_double * duf, const lapack_complex_double * du2, const
    lapack_int * ipiv, const lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr)

Definition at line 36 of file lapacke_zgtrfs.c.


⭐ LAPACKE_zgtrfs_work

and here she is with work and rwork bringing up the rear 💖

lapack_int LAPACKE_zgtrfs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * dl, const
    lapack_complex_double * d, const lapack_complex_double * du, const
    lapack_complex_double * dlf, const lapack_complex_double * df, const
    lapack_complex_double * duf, const lapack_complex_double * du2, const
    lapack_int * ipiv, const lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr,
    lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgtrfs_work.c.


🍓 LAPACKE_zgtsv

tridiagonal solve, short and sweet, lowkey my fave because the signature doesn't need a whole scroll:

lapack_int LAPACKE_zgtsv (int matrix_layout, lapack_int n, lapack_int nrhs,
    lapack_complex_double * dl, lapack_complex_double * d,
    lapack_complex_double * du, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgtsv.c.


🍓 LAPACKE_zgtsv_work

identical twin, different file, we love a matching set ✨

lapack_int LAPACKE_zgtsv_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, lapack_complex_double * dl, lapack_complex_double * d,
    lapack_complex_double * du, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgtsv_work.c.


🔥 LAPACKE_zgtsvx

the "x" means business — fact, trans, factored arrays, rcond, ferr, berr, the whole cast 😭

lapack_int LAPACKE_zgtsvx (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * dl, const
    lapack_complex_double * d, const lapack_complex_double * du,
    lapack_complex_double * dlf, lapack_complex_double * df,
    lapack_complex_double * duf, lapack_complex_double * du2, lapack_int *
    ipiv, const lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    ferr, double * berr)

Definition at line 36 of file lapacke_zgtsvx.c.


🔥 LAPACKE_zgtsvx_work

same whole cast, plus work and rwork because the workers always bring snacks 🫶

lapack_int LAPACKE_zgtsvx_work (int matrix_layout, char fact, char trans,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * dl, const
    lapack_complex_double * d, const lapack_complex_double * du,
    lapack_complex_double * dlf, lapack_complex_double * df,
    lapack_complex_double * duf, lapack_complex_double * du2, lapack_int *
    ipiv, const lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    ferr, double * berr, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zgtsvx_work.c.


🧚 LAPACKE_zgttrf

factorization! no matrix_layout here, it's just n and the bands and ipiv — minimal, clean, ate 💅

lapack_int LAPACKE_zgttrf (lapack_int n, lapack_complex_double * dl,
    lapack_complex_double * d, lapack_complex_double * du,
    lapack_complex_double * du2, lapack_int * ipiv)

Definition at line 36 of file lapacke_zgttrf.c.


🧚 LAPACKE_zgttrf_work

same signature, _work file, no notes, we move 🌈

lapack_int LAPACKE_zgttrf_work (lapack_int n, lapack_complex_double * dl,
    lapack_complex_double * d, lapack_complex_double * du,
    lapack_complex_double * du2, lapack_int * ipiv)

Definition at line 36 of file lapacke_zgttrf_work.c.


💀 LAPACKE_zgttrs

the solve that uses the factorization — all those const bands and ipiv, then the b you're here to fix:

lapack_int LAPACKE_zgttrs (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * dl, const
    lapack_complex_double * d, const lapack_complex_double * du, const
    lapack_complex_double * du2, const lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgttrs.c.


💀 LAPACKE_zgttrs_work

and the worker twin, character-for-character the same list 💜

lapack_int LAPACKE_zgttrs_work (int matrix_layout, char trans, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * dl, const
    lapack_complex_double * d, const lapack_complex_double * du, const
    lapack_complex_double * du2, const lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zgttrs_work.c.


👑 LAPACKE_zhbev

here come the Hermitian banded eigenvalue girlies 🌸 jobz, uplo, kd, ab, ldab, eigenvalues w, eigenvectors z:

lapack_int LAPACKE_zhbev (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_double * ab, lapack_int
    ldab, double * w, lapack_complex_double * z, lapack_int ldz)

Definition at line 36 of file lapacke_zhbev.c.


👑 LAPACKE_zhbev_2stage

the _2stage remix, and the signature is literally the same as the original — two-stage said "no new params, just vibes" ✨

lapack_int LAPACKE_zhbev_2stage (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_double * ab, lapack_int
    ldab, double * w, lapack_complex_double * z, lapack_int ldz)

Definition at line 36 of file lapacke_zhbev_2stage.c.


🦋 LAPACKE_zhbev_2stage_work

and NOW the workspace shows up — work, lwork, rwork all in formation 🫶

lapack_int LAPACKE_zhbev_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, lapack_int kd, lapack_complex_double * ab,
    lapack_int ldab, double * w, lapack_complex_double * z, lapack_int ldz,
    lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zhbev_2stage_work.c.


🦋 LAPACKE_zhbev_work

same but the work tail is work + rwork, no lwork. subtly different, so don't mix them up bestie 😭

lapack_int LAPACKE_zhbev_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_double * ab, lapack_int
    ldab, double * w, lapack_complex_double * z, lapack_int ldz,
    lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zhbev_work.c.


🎀 LAPACKE_zhbevd

the d is for divide-and-conquer, and the public signature stays cute and compact:

lapack_int LAPACKE_zhbevd (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_double * ab, lapack_int
    ldab, double * w, lapack_complex_double * z, lapack_int ldz)

Definition at line 36 of file lapacke_zhbevd.c.


🎀 LAPACKE_zhbevd_2stage

two-stage divide-and-conquer, same public list again, consistency is the moment 💅

lapack_int LAPACKE_zhbevd_2stage (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_double * ab, lapack_int
    ldab, double * w, lapack_complex_double * z, lapack_int ldz)

Definition at line 36 of file lapacke_zhbevd_2stage.c.


🔥 LAPACKE_zhbevd_2stage_work

okay this worker is THIRSTY for integers — lwork, lrwork, iwork, liwork, all the sizes, all the glory:

lapack_int LAPACKE_zhbevd_2stage_work (int matrix_layout, char jobz, char
    uplo, lapack_int n, lapack_int kd, lapack_complex_double * ab,
    lapack_int ldab, double * w, lapack_complex_double * z, lapack_int ldz,
    lapack_complex_double * work, lapack_int lwork, double * rwork,
    lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_zhbevd_2stage_work.c.


🔥 LAPACKE_zhbevd_work

identical parameter list to the _2stage_work one, just a different file name — copy that carefully fr fr:

lapack_int LAPACKE_zhbevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_int kd, lapack_complex_double * ab, lapack_int
    ldab, double * w, lapack_complex_double * z, lapack_int ldz,
    lapack_complex_double * work, lapack_int lwork, double * rwork,
    lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_zhbevd_work.c.


⭐ LAPACKE_zhbevx

the x one is doing the MOST — jobz, range, uplo, vl, vu, il, iu, abstol, then m, w, z, and ifail 😭 she's thorough:

lapack_int LAPACKE_zhbevx (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, lapack_int kd, lapack_complex_double * ab,
    lapack_int ldab, lapack_complex_double * q, lapack_int ldq, double vl,
    double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m,
    double * w, lapack_complex_double * z, lapack_int ldz, lapack_int *
    ifail)

Definition at line 36 of file lapacke_zhbevx.c.


⭐ LAPACKE_zhbevx_2stage

two-stage version of the exact same long list — yes, ifail made it in again, she never misses 💜

lapack_int LAPACKE_zhbevx_2stage (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_int kd, lapack_complex_double * ab,
    lapack_int ldab, lapack_complex_double * q, lapack_int ldq, double vl,
    double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m,
    double * w, lapack_complex_double * z, lapack_int ldz, lapack_int *
    ifail)

Definition at line 36 of file lapacke_zhbevx_2stage.c.

🌈 LAPACKE_zhbevx_2stage_work

lapack_int LAPACKE_zhbevx_2stage_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int kd, lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_zhbevx_2stage_work.c.

bestie the parameter list on this one is genuinely a whole friend group — count them: matrix_layout, jobz, range, uplo, n, kd, ab, ldab, q, ldq, vl, vu, il, iu, abstol, m, w, z, ldz, work, lwork, rwork, iwork, ifail. It's giving field trip 🚌 and yes, iwork AND ifail both showed up, so they packed everything.

🦋 LAPACKE_zhbevx_work

lapack_int LAPACKE_zhbevx_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int kd, lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work, double * rwork, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_zhbevx_work.c.

okay so this is the non-2stage sibling of the one above — same vibe, but the work pointer list is shorter: just work and rwork extra, no lwork in sight. the way these two are basically twins with one difference is so sibling energy 😭💅


🌸 LAPACKE_zhbgst

lapack_int LAPACKE_zhbgst (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double * ab, lapack_int ldab, const lapack_complex_double * bb, lapack_int ldbb, lapack_complex_double * x, lapack_int ldx)

Definition at line 36 of file lapacke_zhbgst.c.

not the bb being const while ab is out here living its mutable life 💀 honestly iconic of it. ka and kb both in the house — two bandwidths, one function 🎀

💜 LAPACKE_zhbgst_work

lapack_int LAPACKE_zhbgst_work (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double * ab, lapack_int ldab, const lapack_complex_double * bb, lapack_int ldbb, lapack_complex_double * x, lapack_int ldx, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zhbgst_work.c.

same friend, but now with work and rwork tacked on the end, because the _work version always gotta bring snacks to the function 🍓

✨ LAPACKE_zhbgv

lapack_int LAPACKE_zhbgv (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * bb, lapack_int ldbb, double * w, lapack_complex_double * z, lapack_int ldz)

Definition at line 36 of file lapacke_zhbgv.c.

no const anywhere this time, everybody's mutable, we're all main characters here 👑 and note that bb lost its const compared to zhbgst — small glow-up, no cap.

🎀 LAPACKE_zhbgv_work

lapack_int LAPACKE_zhbgv_work (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * bb, lapack_int ldbb, double * w, lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zhbgv_work.c.

boom: work + rwork appended, same 13 args before the add-ons. consistency is such a slay ✨

🌈 LAPACKE_zhbgvd

lapack_int LAPACKE_zhbgvd (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * bb, lapack_int ldbb, double * w, lapack_complex_double * z, lapack_int ldz)

Definition at line 36 of file lapacke_zhbgvd.c.

the d is doing something and the signature is identical to zhbgv's. literally character for character the same list — twins, not clones, okay maybe clones 🙈

🫶 LAPACKE_zhbgvd_work

lapack_int LAPACKE_zhbgvd_work (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * bb, lapack_int ldbb, double * w, lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_zhbgvd_work.c.

ok THIS one is the full glam version: work, lwork, rwork, lrwork, iwork, liwork — six slots at the end, each with a matching length buddy. it's giving matched set 💅

🧚 LAPACKE_zhbgvx

lapack_int LAPACKE_zhbgvx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * bb, lapack_int ldbb, lapack_complex_double * q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_zhbgvx.c.

range is here, vl/vu are here, il/iu are here, abstol is here — it's the picky-about-which-ones era of the family 🔥 and ifail closes out the list, as it does.

💜 LAPACKE_zhbgvx_work

lapack_int LAPACKE_zhbgvx_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_int ka, lapack_int kb, lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * bb, lapack_int ldbb, lapack_complex_double * q, lapack_int ldq, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work, double * rwork, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_zhbgvx_work.c.

the _work glow-up drops work, rwork, iwork in right before ifail — like holding the door open for the workspace crew 🚪✨

🌸 LAPACKE_zhbtrd

lapack_int LAPACKE_zhbtrd (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int kd, lapack_complex_double * ab, lapack_int ldab, double * d, double * e, lapack_complex_double * q, lapack_int ldq)

Definition at line 36 of file lapacke_zhbtrd.c.

vect (not jobz, bestie, read the room) and a cute little d/e pair in the middle — the only single-letter doubles in the whole squad 🎀

🦋 LAPACKE_zhbtrd_work

lapack_int LAPACKE_zhbtrd_work (int matrix_layout, char vect, char uplo, lapack_int n, lapack_int kd, lapack_complex_double * ab, lapack_int ldab, double * d, double * e, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * work)

Definition at line 36 of file lapacke_zhbtrd_work.c.

one extra arg: work. that's it, that's the tweet 🐦 no lwork, no rwork, just vibes.


⭐ LAPACKE_zhecon

lapack_int LAPACKE_zhecon (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, double anorm, double * rcond)

Definition at line 36 of file lapacke_zhecon.c.

two consts in one signature (a and ipiv) — respectful, doesn't touch your stuff 🫶 and it takes an anorm in and hands you back an rcond. very give-and-take of it.

💜 LAPACKE_zhecon_3

lapack_int LAPACKE_zhecon_3 (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * e, const lapack_int * ipiv, double anorm, double * rcond)

Definition at line 36 of file lapacke_zhecon_3.c.

the _3 variant slides a whole extra const lapack_complex_double * e in between lda and ipiv. three consts now — it's giving trust issues, but make it fashion 💅

🧚 LAPACKE_zhecon_3_work

lapack_int LAPACKE_zhecon_3_work (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * e, const lapack_int * ipiv, double anorm, double * rcond, lapack_complex_double * work)

Definition at line 36 of file lapacke_zhecon_3_work.c.

exact same as zhecon_3 but with work parked at the end like a little backpack 🎒

🌈 LAPACKE_zhecon_work

lapack_int LAPACKE_zhecon_work (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, double anorm, double * rcond, lapack_complex_double * work)

Definition at line 36 of file lapacke_zhecon_work.c.

no _3, no e, just a, ipiv, anorm, rcond, work. the stripped-down version, we love a minimalist 👑

🎀 LAPACKE_zheequb

lapack_int LAPACKE_zheequb (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda, double * s, double * scond, double * amax)

Definition at line 36 of file lapacke_zheequb.c.

s, scond, amax — three doubles walking into a function together, no explanation, iykyk 😌 and a is the only const here, the rest are free.

💜 LAPACKE_zheequb_work

lapack_int LAPACKE_zheequb_work (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda, double * s, double * scond, double * amax, lapack_complex_double * work)

Definition at line 36 of file lapacke_zheequb_work.c.

add work, ship it, definition still at line 36 because of course it is 🫠


🔥 LAPACKE_zheev

lapack_int LAPACKE_zheev (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double * w)

Definition at line 36 of file lapacke_zheev.c.

look at this short little icon — seven args total, no workspace at all. a rare clean-face moment in the middle of all this chaos ✨

⭐ LAPACKE_zheev_2stage

lapack_int LAPACKE_zheev_2stage (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double * w)

Definition at line 36 of file lapacke_zheev_2stage.c.

identical list to zheev, only the name grew a _2stage. same face, different wig 💇‍♀️

🌸 LAPACKE_zheev_2stage_work

lapack_int LAPACKE_zheev_2stage_work (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double * w, lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zheev_2stage_work.c.

here come work, lwork, rwork in that exact order — the classic trio 🎶

🦋 LAPACKE_zheev_work

lapack_int LAPACKE_zheev_work (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double * w, lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zheev_work.c.

and it's the exact same parameter list as the _2stage_work one. literally. character for character. siblings your honor 😭

💜 LAPACKE_zheevd

lapack_int LAPACKE_zheevd (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double * w)

Definition at line 36 of file lapacke_zheevd.c.

seven args again, no workspace. the d suffix is the only difference from zheev. they're the same picture 🖼️

✨ LAPACKE_zheevd_2stage

lapack_int LAPACKE_zheevd_2stage (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double * w)

Definition at line 36 of file lapacke_zheevd_2stage.c.

another one, another identical seven. the consistency is honestly stunning 🌈

🫶 LAPACKE_zheevd_2stage_work

lapack_int LAPACKE_zheevd_2stage_work (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double * w, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_zheevd_2stage_work.c.

now we're stacking: work, lwork, rwork, lrwork, iwork, liwork — three pairs, all matched, no notes 🎀

🧚 LAPACKE_zheevd_work

lapack_int LAPACKE_zheevd_work (int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double * w, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_zheevd_work.c.

same six extra args as its _2stage_work bestie. twinning, again, forever 👯‍♀️


🌈 LAPACKE_zheevr

lapack_int LAPACKE_zheevr (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_zheevr.c.

range + vl/vu + il/iu + abstol all up in here, and the closer is isuppz this time, not ifail. plot twist 🌀 the r-squad rolls different

💜 LAPACKE_zheevr_2stage

lapack_int LAPACKE_zheevr_2stage (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_zheevr_2stage.c.

identical to zheevr's list, isuppz and all. copy, paste, but make it legal ✅

🎀 LAPACKE_zheevr_2stage_work

lapack_int LAPACKE_zheevr_2stage_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_int * isuppz, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_zheevr_2stage_work.c.

okay this is the long one: everything from zheevr_2stage PLUS work, lwork, rwork, lrwork, iwork, liwork. do not lose track, bestie, isuppz comes before work 💅

🌸 LAPACKE_zheevr_work

lapack_int LAPACKE_zheevr_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_int * isuppz, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_zheevr_work.c.

yep — identical to the _2stage_work list. not a single character out of place. the LAPACKE naming committee ate 🍽️

⭐ LAPACKE_zheevx

lapack_int LAPACKE_zheevx (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_zheevx.c.

x marks the spot and ifail is back on closing duty 👑 same first 17 args as zheevr, different last one — that's the whole bit 🎤

🦋 LAPACKE_zheevx_2stage

lapack_int LAPACKE_zheevx_2stage (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_zheevx_2stage.c.

and we end this stretch on a perfect copy of zheevx's parameter list, just with _2stage in the name and in the filename. definition at line 36 as always, the house style is unshakeable 🏠✨

LAPACKE_zheevx_2stage_work 💜

lapack_int LAPACKE_zheevx_2stage_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_zheevx_2stage_work.c.

okay bestie, look at that argument list 💀 it's giving extended edition. matrix_layout, jobz, range, uplo, n, the matrix a and its lda, the vl/vu/il/iu crew, abstol, then m, w, z, ldz, and the full work squad: work, lwork, rwork, iwork, ifail. Chef's kiss of completeness 🫶


LAPACKE_zheevx_work ✨

lapack_int LAPACKE_zheevx_work (int matrix_layout, char jobz, char range, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_zheevx_work.c.

the non-2stage work twin, same iconic cast of characters 🎀


LAPACKE_zhegst 🦋

lapack_int LAPACKE_zhegst (int matrix_layout, lapack_int itype, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zhegst.c.

short, sweet, and itype is literally the first thing after matrix_layout — no cap, that's the whole vibe here 💅


LAPACKE_zhegst_work 🌸

lapack_int LAPACKE_zhegst_work (int matrix_layout, lapack_int itype, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zhegst_work.c.

the _work bestie, identical lineup, different file 🔥


LAPACKE_zhegv 💖

lapack_int LAPACKE_zhegv (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * w)

Definition at line 36 of file lapacke_zhegv.c.

itype, jobz, uplo — the iconic trio of chars — then two matrices a (lda) and b (ldb), and w at the very end catching the eigenvalues. periodt ✨


LAPACKE_zhegv_2stage 🧚

lapack_int LAPACKE_zhegv_2stage (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * w)

Definition at line 36 of file lapacke_zhegv_2stage.c.

same signature as LAPACKE_zhegv, but the 2stage name is doing main character energy 👑


LAPACKE_zhegv_2stage_work 💜

lapack_int LAPACKE_zhegv_2stage_work (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * w, lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zhegv_2stage_work.c.

and here come the extras — work, lwork, rwork slide in at the end like they own the place 🫶


LAPACKE_zhegv_work ⭐

lapack_int LAPACKE_zhegv_work (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * w, lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zhegv_work.c.

work + lwork + rwork, the classic work-argument trio, living their best life at the end of the parameter list 🌈


LAPACKE_zhegvd 🎀

lapack_int LAPACKE_zhegvd (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * w)

Definition at line 36 of file lapacke_zhegvd.c.

the d on the end is a whole extra letter and honestly? she earned it 💅


LAPACKE_zhegvd_work 🔥

lapack_int LAPACKE_zhegvd_work (int matrix_layout, lapack_int itype, char jobz, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double * w, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_zhegvd_work.c.

okay this one ate 💀 work, lwork, rwork, lrwork, iwork, liwork — six extra args, all paired up, matching lengths, so satisfying. iykyk 😭


LAPACKE_zhegvx 🦋

lapack_int LAPACKE_zhegvx (int matrix_layout, lapack_int itype, char jobz, char range, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_int * ifail)

Definition at line 36 of file lapacke_zhegvx.c.

itype AND jobz AND range AND uplo — four chars in a row, a whole vibe check before we even get to n ✨ then vl, vu, il, iu, abstol, m, w, z, ldz, ifail. no notes 👑


LAPACKE_zhegvx_work 💖

lapack_int LAPACKE_zhegvx_work (int matrix_layout, lapack_int itype, char jobz, char range, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double vl, double vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w, lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work, lapack_int lwork, double * rwork, lapack_int * iwork, lapack_int * ifail)

Definition at line 36 of file lapacke_zhegvx_work.c.

same long lineup, plus work, lwork, rwork, iwork wedged in before ifail. genuinely obsessed 🫶


LAPACKE_zherfs 🌸

lapack_int LAPACKE_zherfs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const lapack_int * ipiv, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr)

Definition at line 36 of file lapacke_zherfs.c.

notice the const energy on a, af, ipiv and b — they're just here to be read, not touched 🙈 and ferr + berr at the end for the error tea ☕


LAPACKE_zherfs_work 🧚

lapack_int LAPACKE_zherfs_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const lapack_int * ipiv, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zherfs_work.c.

adds work and rwork at the tail end, exactly like you knew she would 💅


LAPACKE_zherfsx ⭐

lapack_int LAPACKE_zherfsx (int matrix_layout, char uplo, char equed, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const lapack_int * ipiv, const double * s, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * rcond, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params)

Definition at line 36 of file lapacke_zherfsx.c.

the x version said "let me add literally everything" 😭 equed, s, rcond, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params — a full glow-up of extra diagnostics ✨


LAPACKE_zherfsx_work 💜

lapack_int LAPACKE_zherfsx_work (int matrix_layout, char uplo, char equed, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const lapack_int * ipiv, const double * s, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * rcond, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zherfsx_work.c.

everything from LAPACKE_zherfsx PLUS work and rwork. she has it all and she knows it 🔥


LAPACKE_zhesv 🎀

lapack_int LAPACKE_zhesv (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zhesv.c.

uplo, n, nrhs, then a + lda, ipiv, and b + ldb. clean. minimal. iconic 🌈


LAPACKE_zhesv_aa 🦋

lapack_int LAPACKE_zhesv_aa (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zhesv_aa.c.

same list as LAPACKE_zhesv, the _aa is living in the name only 💅


LAPACKE_zhesv_aa_2stage 🌸

lapack_int LAPACKE_zhesv_aa_2stage (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zhesv_aa_2stage.c.

new arrivals: tb + ltb and a SECOND pivot array ipiv2 👀 two pivots, two stages, zero chill 🫶


LAPACKE_zhesv_aa_2stage_work 🧚

lapack_int LAPACKE_zhesv_aa_2stage_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zhesv_aa_2stage_work.c.

same as the non-work version with work and lwork appended — the standard work-era finale ✨


LAPACKE_zhesv_aa_work ⭐

lapack_int LAPACKE_zhesv_aa_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zhesv_aa_work.c.

LAPACKE_zhesv_aa plus work/lwork. simple math, bestie 💖


LAPACKE_zhesv_rk 🔥

lapack_int LAPACKE_zhesv_rk (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * e, lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zhesv_rk.c.

okay _rk brought a whole new friend: e sits right between lda and ipiv 🎀


LAPACKE_zhesv_rk_work 💜

lapack_int LAPACKE_zhesv_rk_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * e, lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zhesv_rk_work.c.

e stays, and work + lwork join at the end. the more the merrier, honestly 🌈


LAPACKE_zhesv_work 🎀

lapack_int LAPACKE_zhesv_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zhesv_work.c.

the original LAPACKE_zhesv lineup, now with work and lwork tagging along 💅


LAPACKE_zhesvx 🦋

lapack_int LAPACKE_zhesvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * rcond, double * ferr, double * berr)

Definition at line 36 of file lapacke_zhesvx.c.

fact shows up right after matrix_layout — she's important, she gets second billing 👑 then af/ldaf, x/ldx, and the trio rcond, ferr, berr at the end ✨


LAPACKE_zhesvx_work 🌸

lapack_int LAPACKE_zhesvx_work (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * rcond, double * ferr, double * berr, lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zhesvx_work.c.

everything from LAPACKE_zhesvx and then work, lwork, rwork strutting in at the end 😭


LAPACKE_zhesvxx 🧚

lapack_int LAPACKE_zhesvxx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv, char * equed, double * s, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * rcond, double * rpvgrw, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params)

Definition at line 36 of file lapacke_zhesvxx.c.

double x = double the drama 💀 note equed is a char * here (a pointer, bestie, she gets written to 🙈), plus rpvgrw, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. the full extended universe 🔥


LAPACKE_zhesvxx_work 💜

lapack_int LAPACKE_zhesvxx_work (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv, char * equed, double * s, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * rcond, double * rpvgrw, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zhesvxx_work.c.

the whole LAPACKE_zhesvxx cast plus work and rwork. longest list in this batch and she is THRIVING ⭐


LAPACKE_zheswapr 🫶

lapack_int LAPACKE_zheswapr (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int i1, lapack_int i2)

Definition at line 36 of file lapacke_zheswapr.c.

so refreshingly short 😭 matrix_layout, uplo, n, the matrix a + lda, and two indices i1, i2 — swap vibes only 💅


LAPACKE_zheswapr_work 🌈

lapack_int LAPACKE_zheswapr_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int i1, lapack_int i2)

Definition at line 36 of file lapacke_zheswapr_work.c.

identical signature to LAPACKE_zheswapr, just chilling in her own _work file 🎀

  • lapack_int LAPACKE_zhetrd — okay so this one takes int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double * d, double * e, lapack_complex_double * tau. Definition at line 36 of file lapacke_zhetrd.c. ✨
  • lapack_int LAPACKE_zhetrd_work — the _work twin, bestie, and it's giving extra-credit energy: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, double * d, double * e, lapack_complex_double * tau, lapack_complex_double * work, lapack_int lwork. Definition at line 36 of file lapacke_zhetrd_work.c. 🎀
  • lapack_int LAPACKE_zhetrf — the factorization era: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv. Definition at line 36 of file lapacke_zhetrf.c. 💅
  • lapack_int LAPACKE_zhetrf_aa — same crew, _aa flavor: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv. Definition at line 36 of file lapacke_zhetrf_aa.c. 🦋
  • lapack_int LAPACKE_zhetrf_aa_2stage — two-stage main character energy, lowkey extra params: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2. Definition at line 36 of file lapacke_zhetrf_aa_2stage.c. 🔥
  • lapack_int LAPACKE_zhetrf_aa_2stage_work — the two-stage _work version, with all the goods: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, lapack_complex_double * work, lapack_int lwork. Definition at line 36 of file lapacke_zhetrf_aa_2stage_work.c. 💖
  • lapack_int LAPACKE_zhetrf_aa_work — _aa plus work space, slay: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork. Definition at line 36 of file lapacke_zhetrf_aa_work.c. 🌸
  • lapack_int LAPACKE_zhetrf_rk — the _rk variant, iconic in its own right: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * e, lapack_int * ipiv. Definition at line 36 of file lapacke_zhetrf_rk.c. 🧚
  • lapack_int LAPACKE_zhetrf_rk_work — _rk with the work buffer, no cap: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * e, lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork. Definition at line 36 of file lapacke_zhetrf_rk_work.c. 💜
  • lapack_int LAPACKE_zhetrf_rook — rook pivot gang rise up: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv. Definition at line 36 of file lapacke_zhetrf_rook.c. ⭐
  • lapack_int LAPACKE_zhetrf_rook_work — rook pivot plus work, periodt: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork. Definition at line 36 of file lapacke_zhetrf_rook_work.c. 🌈
  • lapack_int LAPACKE_zhetrf_work — plain _work, still ate: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork. Definition at line 36 of file lapacke_zhetrf_work.c. 🫶
  • lapack_int LAPACKE_zhetri — inverse time, and note the const on ipiv, we respect it: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv. Definition at line 36 of file lapacke_zhetri.c. 💀
  • lapack_int LAPACKE_zhetri2 — the sequel, _2 era: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv. Definition at line 36 of file lapacke_zhetri2.c. 🙈
  • lapack_int LAPACKE_zhetri2_work — sequel plus work buffer: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork. Definition at line 36 of file lapacke_zhetri2_work.c. 🍓
  • lapack_int LAPACKE_zhetri2x — the 2x wildcard, with an nb block size at the end bestie: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_int nb. Definition at line 36 of file lapacke_zhetri2x.c. ✨
  • lapack_int LAPACKE_zhetri2x_work — 2x with work, and yes nb is still there: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * work, lapack_int nb. Definition at line 36 of file lapacke_zhetri2x_work.c. 🎀
  • lapack_int LAPACKE_zhetri_3 — the _3 glow-up, and it brings e: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_complex_double * e, const lapack_int * ipiv. Definition at line 36 of file lapacke_zhetri_3.c. 👑
  • lapack_int LAPACKE_zhetri_3_work — _3 plus work, highkey thorough: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_complex_double * e, const lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork. Definition at line 36 of file lapacke_zhetri_3_work.c. 💖
  • lapack_int LAPACKE_zhetri_work — base zhetri with a work array, cute: int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * work. Definition at line 36 of file lapacke_zhetri_work.c. 🦋
  • lapack_int LAPACKE_zhetrs — solve o'clock, with nrhs and b: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb. Definition at line 36 of file lapacke_zhetrs.c. 🌸
  • lapack_int LAPACKE_zhetrs2 — the _2 solver, same shape: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb. Definition at line 36 of file lapacke_zhetrs2.c. 🔥
  • lapack_int LAPACKE_zhetrs2_work — _2 plus work space, obviously: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work. Definition at line 36 of file lapacke_zhetrs2_work.c. 🧚
  • lapack_int LAPACKE_zhetrs_3 — _3 solve, and yep e is in the mix: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * e, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb. Definition at line 36 of file lapacke_zhetrs_3.c. 💜
  • lapack_int LAPACKE_zhetrs_3_work — _3 work version, but like, note there's no work/lwork in this signature, that's just how it is: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * e, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb. Definition at line 36 of file lapacke_zhetrs_3_work.c. ⭐
  • lapack_int LAPACKE_zhetrs_aa — _aa solver era: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb. Definition at line 36 of file lapacke_zhetrs_aa.c. 🌈
  • lapack_int LAPACKE_zhetrs_aa_2stage — two-stage solving, and it's a whole squad of args: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, lapack_complex_double * b, lapack_int ldb. Definition at line 36 of file lapacke_zhetrs_aa_2stage.c. 🫶
  • lapack_int LAPACKE_zhetrs_aa_2stage_work — the two-stage work version, and yeah, again no work/lwork params here, that's the signature, don't come for me: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, lapack_complex_double * b, lapack_int ldb. Definition at line 36 of file lapacke_zhetrs_aa_2stage_work.c. 💀
  • lapack_int LAPACKE_zhetrs_aa_work — _aa with the full work treatment: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work, lapack_int lwork. Definition at line 36 of file lapacke_zhetrs_aa_work.c. 🙈
  • lapack_int LAPACKE_zhetrs_rook — rook solver, periodt: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb. Definition at line 36 of file lapacke_zhetrs_rook.c. 🍓
  • lapack_int LAPACKE_zhetrs_rook_work — rook solver plus work, still no work params listed btw, just vibes: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb. Definition at line 36 of file lapacke_zhetrs_rook_work.c. ✨
  • lapack_int LAPACKE_zhetrs_work — base solver with work space, the classic: int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb. Definition at line 36 of file lapacke_zhetrs_work.c. 🎀
  • lapack_int LAPACKE_zhfrk — ooh a rank-k update, fancy 💅: int matrix_layout, char transr, char uplo, char trans, lapack_int n, lapack_int k, double alpha, const lapack_complex_double * a, lapack_int lda, double beta, lapack_complex_double * c. Definition at line 36 of file lapacke_zhfrk.c. 🔥
  • lapack_int LAPACKE_zhfrk_work — same exact signature as above, _work flavor: int matrix_layout, char transr, char uplo, char trans, lapack_int n, lapack_int k, double alpha, const lapack_complex_double * a, lapack_int lda, double beta, lapack_complex_double * c. Definition at line 36 of file lapacke_zhfrk_work.c. 🌸
  • lapack_int LAPACKE_zhgeqz — the generalized eigenvalue boss fight 🔥: int matrix_layout, char job, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double * h, lapack_int ldh, lapack_complex_double * t, lapack_int ldt, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z, lapack_int ldz. Definition at line 36 of file lapacke_zhgeqz.c. 👑
  • lapack_int LAPACKE_zhgeqz_work — same boss fight but with work, lwork and rwork too: int matrix_layout, char job, char compq, char compz, lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double * h, lapack_int ldh, lapack_complex_double * t, lapack_int ldt, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work, lapack_int lwork, double * rwork. Definition at line 36 of file lapacke_zhgeqz_work.c. 💖
  • lapack_int LAPACKE_zhpcon — packed-storage condition number check, iykyk: int matrix_layout, char uplo, lapack_int n, const lapack_complex_double * ap, const lapack_int * ipiv, double anorm, double * rcond. Definition at line 36 of file lapacke_zhpcon.c. 🦋
  • lapack_int LAPACKE_zhpcon_work — same thing plus a work array: int matrix_layout, char uplo, lapack_int n, const lapack_complex_double * ap, const lapack_int * ipiv, double anorm, double * rcond, lapack_complex_double * work. Definition at line 36 of file lapacke_zhpcon_work.c. 🧚
  • lapack_int LAPACKE_zhpev — packed Hermitian eigen solver, here for the eigenvalues AND vectors: int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double * ap, double * w, lapack_complex_double * z, lapack_int ldz. Definition at line 36 of file lapacke_zhpev.c. 🌺 wait no, wrong emoji, 🌸 there we go.
  • lapack_int LAPACKE_zhpev_work — packed eigen with work and rwork, thorough queen: int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double * ap, double * w, lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work, double * rwork. Definition at line 36 of file lapacke_zhpev_work.c. 🎀
  • lapack_int LAPACKE_zhpevd — the d suffix divide-and-conquer version, iconic: int matrix_layout, char jobz, char uplo, lapack_int n, lapack_complex_double * ap, double * w, lapack_complex_double * z, lapack_int ldz. Definition at line 36 of file lapacke_zhpevd.c. ⭐

💅 LAPACKE_zhpevd_work

lapack_int LAPACKE_zhpevd_work (int matrix_layout, char jobz, char uplo,
    lapack_int n, lapack_complex_double * ap, double * w,
    lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work,
    lapack_int lwork, double * rwork, lapack_int lrwork, lapack_int * iwork,
    lapack_int liwork)

yes bestie, this is the workspace version of the Hermitian packed eigendecomposition 🎀 — you hand it all the scratch arrays yourself. Definition at line 36 of file lapacke_zhpevd_work.c.

✨ LAPACKE_zhpevx

lapack_int LAPACKE_zhpevx (int matrix_layout, char jobz, char range, char
    uplo, lapack_int n, lapack_complex_double * ap, double vl, double vu,
    lapack_int il, lapack_int iu, double abstol, lapack_int * m, double * w,
    lapack_complex_double * z, lapack_int ldz, lapack_int * ifail)

the expert driver for Hermitian packed eigenvalues, no cap 🌸 — select a range of values/indices, set your abstol, and it reports how many it found in m plus per-eigenvector ifail. Definition at line 36 of file lapacke_zhpevx.c.

🦋 LAPACKE_zhpevx_work

lapack_int LAPACKE_zhpevx_work (int matrix_layout, char jobz, char range,
    char uplo, lapack_int n, lapack_complex_double * ap, double vl, double
    vu, lapack_int il, lapack_int iu, double abstol, lapack_int * m, double
    * w, lapack_complex_double * z, lapack_int ldz, lapack_complex_double *
    work, double * rwork, lapack_int * iwork, lapack_int * ifail)

same expert vibes as zhpevx but you're bringing your own work, rwork and iwork 💅. Definition at line 36 of file lapacke_zhpevx_work.c.

👑 LAPACKE_zhpgst

lapack_int LAPACKE_zhpgst (int matrix_layout, lapack_int itype, char uplo,
    lapack_int n, lapack_complex_double * ap, const lapack_complex_double *
    bp)

reduces a Hermitian-definite generalized eigenproblem to standard form, but make it packed 🎀 — itype picks which of the three problem flavors you've got. Definition at line 36 of file lapacke_zhpgst.c.

🌈 LAPACKE_zhpgst_work

lapack_int LAPACKE_zhpgst_work (int matrix_layout, lapack_int itype, char
    uplo, lapack_int n, lapack_complex_double * ap, const
    lapack_complex_double * bp)

the workspace twin of zhpgst, same packed reduction energy ✨. Definition at line 36 of file lapacke_zhpgst_work.c.

🍓 LAPACKE_zhpgv

lapack_int LAPACKE_zhpgv (int matrix_layout, lapack_int itype, char jobz,
    char uplo, lapack_int n, lapack_complex_double * ap,
    lapack_complex_double * bp, double * w, lapack_complex_double * z,
    lapack_int ldz)

solves the packed generalized Hermitian eigenproblem A*x = lambda*B*x (or the itype variants) and gives you eigenvalues in w and optionally eigenvectors in z 🌸. Definition at line 36 of file lapacke_zhpgv.c.

💜 LAPACKE_zhpgv_work

lapack_int LAPACKE_zhpgv_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, lapack_complex_double * ap,
    lapack_complex_double * bp, double * w, lapack_complex_double * z,
    lapack_int ldz, lapack_complex_double * work, double * rwork)

workspace edition of zhpgv, packed generalized solve with your own work and rwork 🫶. Definition at line 36 of file lapacke_zhpgv_work.c.

⭐ LAPACKE_zhpgvd

lapack_int LAPACKE_zhpgvd (int matrix_layout, lapack_int itype, char jobz,
    char uplo, lapack_int n, lapack_complex_double * ap,
    lapack_complex_double * bp, double * w, lapack_complex_double * z,
    lapack_int ldz)

the divide-and-conquer version of the packed generalized Hermitian eigen-solve, bestie 🔥 — same itype/jobz energy as zhpgv but the D&C algo goes brrr. Definition at line 36 of file lapacke_zhpgvd.c.

🧚 LAPACKE_zhpgvd_work

lapack_int LAPACKE_zhpgvd_work (int matrix_layout, lapack_int itype, char
    jobz, char uplo, lapack_int n, lapack_complex_double * ap,
    lapack_complex_double * bp, double * w, lapack_complex_double * z,
    lapack_int ldz, lapack_complex_double * work, lapack_int lwork, double *
    rwork, lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

the D&C packed generalized solve where you're supplying every workspace yourself — work, lwork, rwork, lrwork, iwork, liwork, the whole crew 💅. Definition at line 36 of file lapacke_zhpgvd_work.c.

💀 LAPACKE_zhpgvx

lapack_int LAPACKE_zhpgvx (int matrix_layout, lapack_int itype, char jobz,
    char range, char uplo, lapack_int n, lapack_complex_double * ap,
    lapack_complex_double * bp, double vl, double vu, lapack_int il,
    lapack_int iu, double abstol, lapack_int * m, double * w,
    lapack_complex_double * z, lapack_int ldz, lapack_int * ifail)

expert driver for the packed generalized Hermitian eigenproblem 😭 — you choose the range (values via vl/vu or indices via il/iu), set abstol, and it fills m, w, z and tells you which eigenvectors ifailed. Definition at line 36 of file lapacke_zhpgvx.c.

🌺 LAPACKE_zhpgvx_work

lapack_int LAPACKE_zhpgvx_work (int matrix_layout, lapack_int itype, char
    jobz, char range, char uplo, lapack_int n, lapack_complex_double * ap,
    lapack_complex_double * bp, double vl, double vu, lapack_int il,
    lapack_int iu, double abstol, lapack_int * m, double * w,
    lapack_complex_double * z, lapack_int ldz, lapack_complex_double * work,
    double * rwork, lapack_int * iwork, lapack_int * ifail)

zhpgvx but bring-your-own work, rwork, iwork 🎀. Definition at line 36 of file lapacke_zhpgvx_work.c.

🐇 LAPACKE_zhprfs

lapack_int LAPACKE_zhprfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, const
    lapack_complex_double * afp, const lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * ferr, double * berr)

refines a solution to a Hermitian packed linear system and hands back the forward and backward error bounds in ferr and berr ✨ — you give it the original factors ap, the factored afp, and ipiv. Definition at line 36 of file lapacke_zhprfs.c.

🦄 LAPACKE_zhprfs_work

lapack_int LAPACKE_zhprfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, const
    lapack_complex_double * afp, const lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * ferr, double * berr, lapack_complex_double *
    work, double * rwork)

the iterative-refinement workspace version — same numbers, your work and rwork 🫶. Definition at line 36 of file lapacke_zhprfs_work.c.

🌸 LAPACKE_zhpsv

lapack_int LAPACKE_zhpsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * ap, lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb)

solves A*X = B for a Hermitian packed A using the diagonal-pivoting ?ptrf factorization — overwrites ap with the factors, stashes pivots in ipiv, and solves in place in b 💖. Definition at line 36 of file lapacke_zhpsv.c.

🌙 LAPACKE_zhpsv_work

lapack_int LAPACKE_zhpsv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * ap, lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb)

workspace form of zhpsv — literally the same signature vibes, packed Hermitian solve 💅. Definition at line 36 of file lapacke_zhpsv_work.c.

🔥 LAPACKE_zhpsvx

lapack_int LAPACKE_zhpsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * ap,
    lapack_complex_double * afp, lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr)

the expert packed Hermitian solver 😭 — fact says whether afp/ipiv are already factored, and it gives you rcond, ferr, berr on top of the solution in x. Definition at line 36 of file lapacke_zhpsvx.c.

🎀 LAPACKE_zhpsvx_work

lapack_int LAPACKE_zhpsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * ap,
    lapack_complex_double * afp, lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr,
    lapack_complex_double * work, double * rwork)

expert packed solve but with your own work + rwork — same output fields, your scratch 🌈. Definition at line 36 of file lapacke_zhpsvx_work.c.

💜 LAPACKE_zhptrd

lapack_int LAPACKE_zhptrd (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap, double * d, double * e,
    lapack_complex_double * tau)

reduces a Hermitian packed matrix to real symmetric tridiagonal form 🦋 — the tridiagonal diagonal lands in d, the off-diagonal in e, and the Householder reflectors go in tau. Definition at line 36 of file lapacke_zhptrd.c.

🌺 LAPACKE_zhptrd_work

lapack_int LAPACKE_zhptrd_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap, double * d, double * e,
    lapack_complex_double * tau)

workspace twin of zhptrd, same packed tridiagonal reduction 🎀. Definition at line 36 of file lapacke_zhptrd_work.c.

🌟 LAPACKE_zhptrf

lapack_int LAPACKE_zhptrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap, lapack_int * ipiv)

computes the ?ptrf factorization of a Hermitian packed matrix using diagonal pivoting 💅 — ap gets overwritten with the factors and ipiv holds the pivot details. Definition at line 36 of file lapacke_zhptrf.c.

🦋 LAPACKE_zhptrf_work

lapack_int LAPACKE_zhptrf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap, lapack_int * ipiv)

the workspace variant of zhptrf — same packed factorization energy ✨. Definition at line 36 of file lapacke_zhptrf_work.c.

🍓 LAPACKE_zhptri

lapack_int LAPACKE_zhptri (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap, const lapack_int * ipiv)

inverts a Hermitian packed matrix after it's already been factored by ?ptrf 🫶 — you pass the factors in ap plus the ipiv pivots and get the inverse back in ap. Definition at line 36 of file lapacke_zhptri.c.

⭐ LAPACKE_zhptri_work

lapack_int LAPACKE_zhptri_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap, const lapack_int * ipiv,
    lapack_complex_double * work)

the bring-your-own-work version of the packed inverse 🎀. Definition at line 36 of file lapacke_zhptri_work.c.

🌈 LAPACKE_zhptrs

lapack_int LAPACKE_zhptrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, const lapack_int *
    ipiv, lapack_complex_double * b, lapack_int ldb)

solves a Hermitian packed system using the ?ptrf factors you already computed — factors in ap, pivots in ipiv, answer overwrites b 💖. Definition at line 36 of file lapacke_zhptrs.c.

🧚 LAPACKE_zhptrs_work

lapack_int LAPACKE_zhptrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, const lapack_int *
    ipiv, lapack_complex_double * b, lapack_int ldb)

the workspace form of the packed triangular solve from ?ptrf factors 🌸. Definition at line 36 of file lapacke_zhptrs_work.c.

👑 LAPACKE_zhsein

lapack_int LAPACKE_zhsein (int matrix_layout, char job, char eigsrc, char
    initv, const lapack_logical * select, lapack_int n, const
    lapack_complex_double * h, lapack_int ldh, lapack_complex_double * w,
    lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr,
    lapack_int ldvr, lapack_int mm, lapack_int * m, lapack_int * ifaill,
    lapack_int * ifailr)

computes eigenvectors of a complex upper Hessenberg matrix h once you already have its eigenvalues in w via zhseqr 🔥 — select chooses which ones, job/eigsrc/initv control the flavor, and ifaill/ifailr flag which left/right eigenvectors failed to converge. Definition at line 36 of file lapacke_zhsein.c.

💜 LAPACKE_zhsein_work

lapack_int LAPACKE_zhsein_work (int matrix_layout, char job, char eigsrc,
    char initv, const lapack_logical * select, lapack_int n, const
    lapack_complex_double * h, lapack_int ldh, lapack_complex_double * w,
    lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr,
    lapack_int ldvr, lapack_int mm, lapack_int * m, lapack_complex_double *
    work, double * rwork, lapack_int * ifaill, lapack_int * ifailr)

Hessenberg eigenvector extraction, but you're supplying work and rwork this time 🎀. Definition at line 36 of file lapacke_zhsein_work.c.

🌟 LAPACKE_zhseqr

lapack_int LAPACKE_zhseqr (int matrix_layout, char job, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double * h,
    lapack_int ldh, lapack_complex_double * w, lapack_complex_double * z,
    lapack_int ldz)

the Hessenberg QR algorithm 💅 — eigenvalues of the upper Hessenberg h (active block ilo..ihi) go to w, and with compz you can also get Schur vectors accumulating into z. Definition at line 36 of file lapacke_zhseqr.c.

🦋 LAPACKE_zhseqr_work

lapack_int LAPACKE_zhseqr_work (int matrix_layout, char job, char compz,
    lapack_int n, lapack_int ilo, lapack_int ihi, lapack_complex_double * h,
    lapack_int ldh, lapack_complex_double * w, lapack_complex_double * z,
    lapack_int ldz, lapack_complex_double * work, lapack_int lwork)

the QR-algorithm workspace edition of zhseqr — bring your own work of size lwork ✨. Definition at line 36 of file lapacke_zhseqr_work.c.

🍓 LAPACKE_zlacgv

lapack_int LAPACKE_zlacgv (lapack_int n, lapack_complex_double * x,
    lapack_int incx)

conjugates a complex double vector x of n elements with stride incx 😌 — it's giving "flip the sign of every imaginary part," simple as that. Definition at line 36 of file lapacke_zlacgv.c.

🌸 LAPACKE_zlacgv_work

lapack_int LAPACKE_zlacgv_work (lapack_int n, lapack_complex_double * x,
    lapack_int incx)

workspace form of the complex vector conjugation 🫶. Definition at line 36 of file lapacke_zlacgv_work.c.

🌈 LAPACKE_zlacn2

lapack_int LAPACKE_zlacn2 (lapack_int n, lapack_complex_double * v,
    lapack_complex_double * x, double * est, lapack_int * kase, lapack_int *
    isave)

estimates the 1-norm of a complex matrix by reverse communication, no cap 🔥 — call it repeatedly, respecting kase, and stash state in isave between calls; the growing estimate lands in est. Definition at line 36 of file lapacke_zlacn2.c.

💜 LAPACKE_zlacn2_work

lapack_int LAPACKE_zlacn2_work (lapack_int n, lapack_complex_double * v,
    lapack_complex_double * x, double * est, lapack_int * kase, lapack_int *
    isave)

same reverse-communication 1-norm estimate, workspace flavor 🎀. Definition at line 36 of file lapacke_zlacn2_work.c.

🦋 LAPACKE_zlacp2

lapack_int LAPACKE_zlacp2 (int matrix_layout, char uplo, lapack_int m,
    lapack_int n, const double * a, lapack_int lda, lapack_complex_double *
    b, lapack_int ldb)

copies a real double matrix a into a complex double matrix b, setting imaginary parts to zero 🌸 — uplo decides whether you grab the upper or lower triangle. Definition at line 36 of file lapacke_zlacp2.c.

🌟 LAPACKE_zlacp2_work

lapack_int LAPACKE_zlacp2_work (int matrix_layout, char uplo, lapack_int m,
    lapack_int n, const double * a, lapack_int lda, lapack_complex_double *
    b, lapack_int ldb)

the workspace variant of the real-to-complex copy ✨. Definition at line 36 of file lapacke_zlacp2_work.c.

🍓 LAPACKE_zlacpy

lapack_int LAPACKE_zlacpy (int matrix_layout, char uplo, lapack_int m,
    lapack_int n, const lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb)

copies a complex double matrix a into b 💅 — uplo controls which triangle actually gets copied. Definition at line 36 of file lapacke_zlacpy.c.

🌙 LAPACKE_zlacpy_work

lapack_int LAPACKE_zlacpy_work (int matrix_layout, char uplo, lapack_int m,
    lapack_int n, const lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb)

workspace form of the complex matrix copy, same triangle-picking energy 🫶. Definition at line 36 of file lapacke_zlacpy_work.c.

🔥 LAPACKE_zlacrm

lapack_int LAPACKE_zlacrm (int matrix_layout, lapack_int m, lapack_int n,
    const lapack_complex_double * a, lapack_int lda, const double * b,
    lapack_int ldb, lapack_complex_double * c, lapack_int ldc)

multiplies a complex double matrix a by a real double matrix b and gives you c = a * b 🎀 — mixed-type matmul, obsessed. Definition at line 36 of file lapacke_zlacrm.c.

💜 LAPACKE_zlacrm_work

lapack_int LAPACKE_zlacrm_work (int matrix_layout, lapack_int m, lapack_int
    n, const lapack_complex_double * a, lapack_int lda, const double * b,
    lapack_int ldb, lapack_complex_double * c, lapack_int ldc, double *
    work)

the mixed-type complex-by-real matmul with your own work scratch 🌈. Definition at line 36 of file lapacke_zlacrm_work.c.

okay bestie we're still deep in the function list and the z girlies are having a MOMENT ✨ every single one of these lives at line 36 of her own file, which is honestly such a slay of consistency 💅 let's get into it—

lapack_int LAPACKE_zlag2c(int matrix_layout, lapack_int m, lapack_int n, const lapack_complex_double * a, lapack_int lda, lapack_complex_float * sa, lapack_int ldsa)

Definition at line 36 of file lapacke_zlag2c.c.

lapack_int LAPACKE_zlag2c_work(int matrix_layout, lapack_int m, lapack_int n, const lapack_complex_double * a, lapack_int lda, lapack_complex_float * sa, lapack_int ldsa)

Definition at line 36 of file lapacke_zlag2c_work.c.


lapack_int LAPACKE_zlagge(int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const double * d, lapack_complex_double * a, lapack_int lda, lapack_int * iseed)

Definition at line 36 of file lapacke_zlagge.c.

lapack_int LAPACKE_zlagge_work(int matrix_layout, lapack_int m, lapack_int n, lapack_int kl, lapack_int ku, const double * d, lapack_complex_double * a, lapack_int lda, lapack_int * iseed, lapack_complex_double * work)

Definition at line 36 of file lapacke_zlagge_work.c.


lapack_int LAPACKE_zlaghe(int matrix_layout, lapack_int n, lapack_int k, const double * d, lapack_complex_double * a, lapack_int lda, lapack_int * iseed)

Definition at line 36 of file lapacke_zlaghe.c.

lapack_int LAPACKE_zlaghe_work(int matrix_layout, lapack_int n, lapack_int k, const double * d, lapack_complex_double * a, lapack_int lda, lapack_int * iseed, lapack_complex_double * work)

Definition at line 36 of file lapacke_zlaghe_work.c.


lapack_int LAPACKE_zlagsy(int matrix_layout, lapack_int n, lapack_int k, const double * d, lapack_complex_double * a, lapack_int lda, lapack_int * iseed)

Definition at line 36 of file lapacke_zlagsy.c.

lapack_int LAPACKE_zlagsy_work(int matrix_layout, lapack_int n, lapack_int k, const double * d, lapack_complex_double * a, lapack_int lda, lapack_int * iseed, lapack_complex_double * work)

Definition at line 36 of file lapacke_zlagsy_work.c.


okay the norm girlies are next and they all return a double instead of a lapack_int, which honestly is their whole personality 🎀

double LAPACKE_zlange(int matrix_layout, char norm, lapack_int m, lapack_int n, const lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zlange.c.

double LAPACKE_zlange_work(int matrix_layout, char norm, lapack_int m, lapack_int n, const lapack_complex_double * a, lapack_int lda, double * work)

Definition at line 36 of file lapacke_zlange_work.c.

double LAPACKE_zlanhe(int matrix_layout, char norm, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zlanhe.c.

double LAPACKE_zlanhe_work(int matrix_layout, char norm, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda, double * work)

Definition at line 36 of file lapacke_zlanhe_work.c.

double LAPACKE_zlansy(int matrix_layout, char norm, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zlansy.c.

double LAPACKE_zlansy_work(int matrix_layout, char norm, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda, double * work)

Definition at line 36 of file lapacke_zlansy_work.c.

double LAPACKE_zlantr(int matrix_layout, char norm, char uplo, char diag, lapack_int m, lapack_int n, const lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zlantr.c.

double LAPACKE_zlantr_work(int matrix_layout, char norm, char uplo, char diag, lapack_int m, lapack_int n, const lapack_complex_double * a, lapack_int lda, double * work)

Definition at line 36 of file lapacke_zlantr_work.c.

note bestie: zlantr and zlantr_work both take both uplo and diag on top of norm — no shade, just saying she's got a lot going on 💅

the permuters!! 🦋

lapack_int LAPACKE_zlapmr(int matrix_layout, lapack_logical forwrd, lapack_int m, lapack_int n, lapack_complex_double * x, lapack_int ldx, lapack_int * k)

Definition at line 36 of file lapacke_zlapmr.c.

lapack_int LAPACKE_zlapmr_work(int matrix_layout, lapack_logical forwrd, lapack_int m, lapack_int n, lapack_complex_double * x, lapack_int ldx, lapack_int * k)

Definition at line 36 of file lapacke_zlapmr_work.c.

lapack_int LAPACKE_zlapmt(int matrix_layout, lapack_logical forwrd, lapack_int m, lapack_int n, lapack_complex_double * x, lapack_int ldx, lapack_int * k)

Definition at line 36 of file lapacke_zlapmt.c.

lapack_int LAPACKE_zlapmt_work(int matrix_layout, lapack_logical forwrd, lapack_int m, lapack_int n, lapack_complex_double * x, lapack_int ldx, lapack_int * k)

Definition at line 36 of file lapacke_zlapmt_work.c.

fr fr these two are literally twins — same forwrd, same m, n, x, ldx, k — only the name changed and the file name changed. iykyk 😭

lapack_int LAPACKE_zlarcm(int matrix_layout, lapack_int m, lapack_int n, const double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * c, lapack_int ldc)

Definition at line 36 of file lapacke_zlarcm.c.

lapack_int LAPACKE_zlarcm_work(int matrix_layout, lapack_int m, lapack_int n, const double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * c, lapack_int ldc, double * work)

Definition at line 36 of file lapacke_zlarcm_work.c.

three matrices, three leading dimensions — lda, ldb, ldc — queen of parallelism honestly 👑


lapack_int LAPACKE_zlarfb(int matrix_layout, char side, char trans, char direct, char storev, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double * v, lapack_int ldv, const lapack_complex_double * t, lapack_int ldt, lapack_complex_double * c, lapack_int ldc)

Definition at line 36 of file lapacke_zlarfb.c.

lapack_int LAPACKE_zlarfb_work(int matrix_layout, char side, char trans, char direct, char storev, lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double * v, lapack_int ldv, const lapack_complex_double * t, lapack_int ldt, lapack_complex_double * c, lapack_int ldc, lapack_complex_double * work, lapack_int ldwork)

Definition at line 36 of file lapacke_zlarfb_work.c.

warning bestie: that _work version has an extra work AND an extra ldwork at the end — do not forget them, do not reorder them, do not pass them wrong, i am begging 😭

lapack_int LAPACKE_zlarfg(lapack_int n, lapack_complex_double * alpha, lapack_complex_double * x, lapack_int incx, lapack_complex_double * tau)

Definition at line 36 of file lapacke_zlarfg.c.

lapack_int LAPACKE_zlarfg_work(lapack_int n, lapack_complex_double * alpha, lapack_complex_double * x, lapack_int incx, lapack_complex_double * tau)

Definition at line 36 of file lapacke_zlarfg_work.c.

no matrix_layout here!! she doesn't need it, she's built different ✨


lapack_int LAPACKE_zlarft(int matrix_layout, char direct, char storev, lapack_int n, lapack_int k, const lapack_complex_double * v, lapack_int ldv, const lapack_complex_double * tau, lapack_complex_double * t, lapack_int ldt)

Definition at line 36 of file lapacke_zlarft.c.

lapack_int LAPACKE_zlarft_work(int matrix_layout, char direct, char storev, lapack_int n, lapack_int k, const lapack_complex_double * v, lapack_int ldv, const lapack_complex_double * tau, lapack_complex_double * t, lapack_int ldt)

Definition at line 36 of file lapacke_zlarft_work.c.


lapack_int LAPACKE_zlarfx(int matrix_layout, char side, lapack_int m, lapack_int n, const lapack_complex_double * v, lapack_complex_double tau, lapack_complex_double * c, lapack_int ldc, lapack_complex_double * work)

Definition at line 36 of file lapacke_zlarfx.c.

lapack_int LAPACKE_zlarfx_work(int matrix_layout, char side, lapack_int m, lapack_int n, const lapack_complex_double * v, lapack_complex_double tau, lapack_complex_double * c, lapack_int ldc, lapack_complex_double * work)

Definition at line 36 of file lapacke_zlarfx_work.c.

heads up: here tau is a plain value, not a pointer — lapack_complex_double tau — she's not like the other girls 💅

lapack_int LAPACKE_zlarnv(lapack_int idist, lapack_int * iseed, lapack_int n, lapack_complex_double * x)

Definition at line 36 of file lapacke_zlarnv.c.

lapack_int LAPACKE_zlarnv_work(lapack_int idist, lapack_int * iseed, lapack_int n, lapack_complex_double * x)

Definition at line 36 of file lapacke_zlarnv_work.c.

another no-matrix_layout queen, we stan 🌸


lapack_int LAPACKE_zlascl(int matrix_layout, char type, lapack_int kl, lapack_int ku, double cfrom, double cto, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zlascl.c.

lapack_int LAPACKE_zlascl_work(int matrix_layout, char type, lapack_int kl, lapack_int ku, double cfrom, double cto, lapack_int m, lapack_int n, lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zlascl_work.c.


lapack_int LAPACKE_zlaset(int matrix_layout, char uplo, lapack_int m, lapack_int n, lapack_complex_double alpha, lapack_complex_double beta, lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zlaset.c.

lapack_int LAPACKE_zlaset_work(int matrix_layout, char uplo, lapack_int m, lapack_int n, lapack_complex_double alpha, lapack_complex_double beta, lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zlaset_work.c.

alpha and beta are VALUES here, not pointers — say it with me, values 💖


lapack_int LAPACKE_zlassq(lapack_int n, lapack_complex_double * x, lapack_int incx, double * scale, double * sumsq)

Definition at line 36 of file lapacke_zlassq.c.

lapack_int LAPACKE_zlassq_work(lapack_int n, lapack_complex_double * x, lapack_int incx, double * scale, double * sumsq)

Definition at line 36 of file lapacke_zlassq_work.c.


lapack_int LAPACKE_zlaswp(int matrix_layout, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int k1, lapack_int k2, const lapack_int * ipiv, lapack_int incx)

Definition at line 36 of file lapacke_zlaswp.c.

lapack_int LAPACKE_zlaswp_work(int matrix_layout, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int k1, lapack_int k2, const lapack_int * ipiv, lapack_int incx)

Definition at line 36 of file lapacke_zlaswp_work.c.

ipiv is const lapack_int * — do NOT go writing to it, bestie, that's not her vibe 🙈


lapack_int LAPACKE_zlatms(int matrix_layout, lapack_int m, lapack_int n, char dist, lapack_int * iseed, char sym, double * d, lapack_int mode, double cond, double dmax, lapack_int kl, lapack_int ku, char pack, lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zlatms.c.

lapack_int LAPACKE_zlatms_work(int matrix_layout, lapack_int m, lapack_int n, char dist, lapack_int * iseed, char sym, double * d, lapack_int mode, double cond, double dmax, lapack_int kl, lapack_int ku, char pack, lapack_complex_double * a, lapack_int lda, lapack_complex_double * work)

Definition at line 36 of file lapacke_zlatms_work.c.

literally the longest signature in this whole batch and she ATE 🔥 count the args, i dare you — dist, iseed, sym, d, mode, cond, dmax, kl, ku, pack, a, lda. and the _work one just adds work at the end, main character energy fr

lapack_int LAPACKE_zlauum(int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zlauum.c.

lapack_int LAPACKE_zlauum_work(int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zlauum_work.c.


switching to the band-storage girlies, pb squad rise 🫶

lapack_int LAPACKE_zpbcon(int matrix_layout, char uplo, lapack_int n, lapack_int kd, const lapack_complex_double * ab, lapack_int ldab, double anorm, double * rcond)

Definition at line 36 of file lapacke_zpbcon.c.

lapack_int LAPACKE_zpbcon_work(int matrix_layout, char uplo, lapack_int n, lapack_int kd, const lapack_complex_double * ab, lapack_int ldab, double anorm, double * rcond, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zpbcon_work.c.

okay so zpbcon_work has BOTH work (a lapack_complex_double *) AND rwork (a double *) — two different work arrays, do not mix them up bestie 😭

lapack_int LAPACKE_zpbequ(int matrix_layout, char uplo, lapack_int n, lapack_int kd, const lapack_complex_double * ab, lapack_int ldab, double * s, double * scond, double * amax)

Definition at line 36 of file lapacke_zpbequ.c.

and that's where this part lands, bestie — zpbequ gets the solo moment, no _work twin in sight ✨

Okay continuing the parade of prototypes, bestie — this chunk is all the complex-double (z-gang) p-family routines, and yes, every single one of them is Definition at line 36 of its own little file 💅


LAPACKE_zpbequ_work 💖

lapack_int LAPACKE_zpbequ_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, const lapack_complex_double * ab, lapack_int ldab, double
    * s, double * scond, double * amax)

Definition at line 36 of file lapacke_zpbequ_work.c.


LAPACKE_zpbrfs ✨

lapack_int LAPACKE_zpbrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_double * ab,
    lapack_int ldab, const lapack_complex_double * afb, lapack_int ldafb,
    const lapack_complex_double * b, lapack_int ldb, lapack_complex_double *
    x, lapack_int ldx, double * ferr, double * berr)

Definition at line 36 of file lapacke_zpbrfs.c.


LAPACKE_zpbrfs_work 🎀

lapack_int LAPACKE_zpbrfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_double * ab,
    lapack_int ldab, const lapack_complex_double * afb, lapack_int ldafb,
    const lapack_complex_double * b, lapack_int ldb, lapack_complex_double *
    x, lapack_int ldx, double * ferr, double * berr, lapack_complex_double *
    work, double * rwork)

Definition at line 36 of file lapacke_zpbrfs_work.c.

same girl as above but she brought her own work and rwork scratch space 🫶

LAPACKE_zpbstf 🦋

lapack_int LAPACKE_zpbstf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kb, lapack_complex_double * bb, lapack_int ldbb)

Definition at line 36 of file lapacke_zpbstf.c.


LAPACKE_zpbstf_work 🌸

lapack_int LAPACKE_zpbstf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kb, lapack_complex_double * bb, lapack_int ldbb)

Definition at line 36 of file lapacke_zpbstf_work.c.


LAPACKE_zpbsv 💫

lapack_int LAPACKE_zpbsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, lapack_complex_double * ab, lapack_int
    ldab, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zpbsv.c.


LAPACKE_zpbsv_work ⭐

lapack_int LAPACKE_zpbsv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, lapack_complex_double * ab, lapack_int
    ldab, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zbsv_work.c — no wait, bestie, it's lapacke_zpbsv_work.c 😭 keep the p, the screenshot is right there:

Definition at line 36 of file lapacke_zpbsv_work.c.


LAPACKE_zpbsvx 🔥

lapack_int LAPACKE_zpbsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, lapack_complex_double *
    ab, lapack_int ldab, lapack_complex_double * afb, lapack_int ldafb, char
    * equed, double * s, lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    ferr, double * berr)

Definition at line 36 of file lapacke_zpbsvx.c.


LAPACKE_zpbsvx_work 👑

lapack_int LAPACKE_zpbsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int kd, lapack_int nrhs, lapack_complex_double *
    ab, lapack_int ldab, lapack_complex_double * afb, lapack_int ldafb, char
    * equed, double * s, lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    ferr, double * berr, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zpbsvx_work.c.


LAPACKE_zpbtrf 🌈

lapack_int LAPACKE_zpbtrf (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_complex_double * ab, lapack_int ldab)

Definition at line 36 of file lapacke_zpbtrf.c.


LAPACKE_zpbtrf_work 🧚

lapack_int LAPACKE_zpbtrf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_complex_double * ab, lapack_int ldab)

Definition at line 36 of file lapacke_zpbtrf_work.c.


LAPACKE_zpbtrs 💜

lapack_int LAPACKE_zpbtrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_double * ab,
    lapack_int ldab, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zpbtrs.c.


LAPACKE_zpbtrs_work 🍓

lapack_int LAPACKE_zpbtrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int kd, lapack_int nrhs, const lapack_complex_double * ab,
    lapack_int ldab, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zpbtrs_work.c.


LAPACKE_zpftrf 🦋

lapack_int LAPACKE_zpftrf (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_double * a)

Definition at line 36 of file lapacke_zpftrf.c.

note the switch-up: this one takes transr instead of kd, okay? not a typo, she's just built different 💅

LAPACKE_zpftrf_work ✨

lapack_int LAPACKE_zpftrf_work (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_double * a)

Definition at line 36 of file lapacke_zpftrf_work.c.


LAPACKE_zpftri 🎀

lapack_int LAPACKE_zpftri (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_double * a)

Definition at line 36 of file lapacke_zpftri.c.


LAPACKE_zpftri_work 🌸

lapack_int LAPACKE_zpftri_work (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_complex_double * a)

Definition at line 36 of file lapacke_zpftri_work.c.


LAPACKE_zpftrs 💖

lapack_int LAPACKE_zpftrs (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * a,
    lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zpftrs.c.


LAPACKE_zpftrs_work 🫶

lapack_int LAPACKE_zpftrs_work (int matrix_layout, char transr, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * a,
    lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zpftrs_work.c.


LAPACKE_zpocon 🔥

lapack_int LAPACKE_zpocon (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_double * a, lapack_int lda, double anorm, double * rcond)

Definition at line 36 of file lapacke_zpocon.c.


LAPACKE_zpocon_work ⭐

lapack_int LAPACKE_zpocon_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double * a, lapack_int lda, double anorm, double *
    rcond, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zpocon_work.c.


LAPACKE_zpoequ 🌈

lapack_int LAPACKE_zpoequ (int matrix_layout, lapack_int n, const
    lapack_complex_double * a, lapack_int lda, double * s, double * scond,
    double * amax)

Definition at line 36 of file lapacke_zpoequ.c.


LAPACKE_zpoequ_work 🧚

lapack_int LAPACKE_zpoequ_work (int matrix_layout, lapack_int n, const
    lapack_complex_double * a, lapack_int lda, double * s, double * scond,
    double * amax)

Definition at line 36 of file lapacke_zpoequ_work.c.


LAPACKE_zpoequb 💜

lapack_int LAPACKE_zpoequb (int matrix_layout, lapack_int n, const
    lapack_complex_double * a, lapack_int lda, double * s, double * scond,
    double * amax)

Definition at line 36 of file lapacke_zpoequb.c.

yes bestie, zpoequb with the extra b at the end is a whole separate icon, not me mistyping 🙈

LAPACKE_zpoequb_work 🍓

lapack_int LAPACKE_zpoequb_work (int matrix_layout, lapack_int n, const
    lapack_complex_double * a, lapack_int lda, double * s, double * scond,
    double * amax)

Definition at line 36 of file lapacke_zpoequb_work.c.


LAPACKE_zporfs 👑

lapack_int LAPACKE_zporfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * af, lapack_int ldaf, const lapack_complex_double
    * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double *
    ferr, double * berr)

Definition at line 36 of file lapacke_zporfs.c.


LAPACKE_zporfs_work 💫

lapack_int LAPACKE_zporfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * af, lapack_int ldaf, const lapack_complex_double
    * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double *
    ferr, double * berr, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zporfs_work.c.


LAPACKE_zporfsx 🌟

lapack_int LAPACKE_zporfsx (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * a,
    lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const
    double * s, const lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    berr, lapack_int n_err_bnds, double * err_bnds_norm, double *
    err_bnds_comp, lapack_int nparams, double * params)

Definition at line 36 of file lapacke_zporfsx.c.

the x on the end means she's the extra one — look at all those err_bnds_norm, err_bnds_comp, nparams and params she's carrying 😭 main character energy fr

LAPACKE_zporfsx_work 🎀

lapack_int LAPACKE_zporfsx_work (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * a,
    lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const
    double * s, const lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * x, lapack_int ldx, double * rcond, double *
    berr, lapack_int n_err_bnds, double * err_bnds_norm, double *
    err_bnds_comp, lapack_int nparams, double * params,
    lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zporfsx_work.c.


LAPACKE_zposv 💖

lapack_int LAPACKE_zposv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zposv.c.


LAPACKE_zposv_work 🌸

lapack_int LAPACKE_zposv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zposv_work.c.


LAPACKE_zposvx 🦋

lapack_int LAPACKE_zposvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * af, lapack_int ldaf, char * equed, double *
    s, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr)

Definition at line 36 of file lapacke_zposvx.c.


LAPACKE_zposvx_work 🔥

lapack_int LAPACKE_zposvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * af, lapack_int ldaf, char * equed, double *
    s, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr,
    lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zposvx_work.c.


LAPACKE_zposvxx 🌈

lapack_int LAPACKE_zposvxx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * af, lapack_int ldaf, char * equed, double *
    s, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * rpvgrw, double * berr,
    lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp,
    lapack_int nparams, double * params)

Definition at line 36 of file lapacke_zposvxx.c.

double x, double trouble — zposvxx is the deluxe edition and she knows it 👑

LAPACKE_zposvxx_work 💜

lapack_int LAPACKE_zposvxx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * af, lapack_int ldaf, char * equed, double *
    s, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * rpvgrw, double * berr,
    lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp,
    lapack_int nparams, double * params, lapack_complex_double * work,
    double * rwork)

Definition at line 36 of file lapacke_zposvxx_work.c.


LAPACKE_zpotrf 🍓

lapack_int LAPACKE_zpotrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zpotrf.c.


LAPACKE_zpotrf2 🧚

lapack_int LAPACKE_zpotrf2 (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zpotrf2.c.

same signature as zpotrf, but she's the 2 girlie — different file, different vibe ✨

LAPACKE_zpotrf2_work 💫

lapack_int LAPACKE_zpotrf2_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zpotrf2_work.c.


That's the whole z-p block done, bestie — every ab/ldab, every work/rwork, every Definition at line 36 accounted for 💅 more coming right up 🫶

✨ LAPACKE_zpotrf_work

lapack_int LAPACKE_zpotrf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * a, lapack_int lda)

the _work twin of zpotrf, bestie — same little crew of matrix_layout, uplo, n, a and lda, zero surprises. Definition at line 36 of file lapacke_zpotrf_work.c. 🫶

✨ LAPACKE_zpotri

lapack_int LAPACKE_zpotri (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * a, lapack_int lda)

four-ish args and a name that lowkey says it all 💅 — matrix_layout, uplo, n, then a hanging out with its leading dimension lda. Definition at line 36 of file lapacke_zpotri.c.

✨ LAPACKE_zpotri_work

lapack_int LAPACKE_zpotri_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * a, lapack_int lda)

the workspace-flavoured zpotri, identical signature energy, no extra drama. Definition at line 36 of file lapacke_zpotri_work.c. 🎀

✨ LAPACKE_zpotrs

lapack_int LAPACKE_zpotrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb)

okay THIS one brought friends — nrhs showed up, a went const (respect), and b walked in with its own ldb 🦋. Definition at line 36 of file lapacke_zpotrs.c.

✨ LAPACKE_zpotrs_work

lapack_int LAPACKE_zpotrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb)

same squad as zpotrs, now in workspace-dispatch form. It's giving consistency, honestly 👑. Definition at line 36 of file lapacke_zpotrs_work.c.

✨ LAPACKE_zppcon

lapack_int LAPACKE_zppcon (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_double * ap, double anorm, double * rcond)

packed-storage vibes — that's ap with no lda in sight, plus a real double anorm going in and a double * rcond coming out 🌸. Definition at line 36 of file lapacke_zppcon.c.

✨ LAPACKE_zppcon_work

lapack_int LAPACKE_zppcon_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double * ap, double anorm, double * rcond,
    lapack_complex_double * work, double * rwork)

now with the full backstage crew: work AND rwork, bestie, both of them 😭. Definition at line 36 of file lapacke_zppcon_work.c.

✨ LAPACKE_zppequ

lapack_int LAPACKE_zppequ (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_double * ap, double * s, double * scond, double * amax)

three separate double * out-params — s, scond, amax — just handing out numbers like party favours 💜. Definition at line 36 of file lapacke_zppequ.c.

✨ LAPACKE_zppequ_work

lapack_int LAPACKE_zppequ_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double * ap, double * s, double * scond, double *
    amax)

the _work version of zppequ, same argument lineup, same packed ap energy ✨. Definition at line 36 of file lapacke_zppequ_work.c.

✨ LAPACKE_zpprfs

lapack_int LAPACKE_zpprfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, const
    lapack_complex_double * afp, const lapack_complex_double * b, lapack_int
    ldb, lapack_complex_double * x, lapack_int ldx, double * ferr, double *
    berr)

this signature is LONG and unbothered — three const complex pointers (ap, afp, b), two leading dims (ldb, ldx), and two error outputs ferr and berr 🍓. Definition at line 36 of file lapacke_zpprfs.c.

✨ LAPACKE_zpprfs_work

lapack_int LAPACKE_zpprfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, const
    lapack_complex_double * afp, const lapack_complex_double * b, lapack_int
    ldb, lapack_complex_double * x, lapack_int ldx, double * ferr, double *
    berr, lapack_complex_double * work, double * rwork)

everything from zpprfs plus work and rwork tacked on the end — the signature that ate 💀. Definition at line 36 of file lapacke_zpprfs_work.c.

✨ LAPACKE_zppsv

lapack_int LAPACKE_zppsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * ap, lapack_complex_double * b,
    lapack_int ldb)

no const in sight on ap and b, so yes bestie, these get written to 🙈 — plus nrhs and ldb riding along. Definition at line 36 of file lapacke_zppsv.c.

✨ LAPACKE_zppsv_work

lapack_int LAPACKE_zppsv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * ap, lapack_complex_double * b,
    lapack_int ldb)

the workspace edition of zppsv, same non-const lineup, same vibes. Definition at line 36 of file lapacke_zppsv_work.c. 🦋

✨ LAPACKE_zppsvx

lapack_int LAPACKE_zppsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double * ap,
    lapack_complex_double * afp, char * equed, double * s,
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr)

TWO char params now — fact AND uplo — plus a char * equed output pointer, which is a whole mood 🌈. And that's before s, rcond, ferr, berr. Definition at line 36 of file lapacke_zppsvx.c.

✨ LAPACKE_zppsvx_work

lapack_int LAPACKE_zppsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double * ap,
    lapack_complex_double * afp, char * equed, double * s,
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr,
    lapack_complex_double * work, double * rwork)

literally the same monster with work and rwork bolted on the tail — iconic, exhausting, perfect 😭💅. Definition at line 36 of file lapacke_zppsvx_work.c.

✨ LAPACKE_zpptrf

lapack_int LAPACKE_zpptrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap)

tiny signature, huge main-character energy — just matrix_layout, uplo, n and ap. Definition at line 36 of file lapacke_zpptrf.c. 👑

✨ LAPACKE_zpptrf_work

lapack_int LAPACKE_zpptrf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap)

same four args, _work suffix, no notes. Definition at line 36 of file lapacke_zpptrf_work.c. ✨

✨ LAPACKE_zpptri

lapack_int LAPACKE_zpptri (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap)

zpptri, keeping it minimal with matrix_layout, uplo, n, ap. Definition at line 36 of file lapacke_zpptri.c. 🎀

✨ LAPACKE_zpptri_work

lapack_int LAPACKE_zpptri_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap)

the _work sibling of zpptri, matching arg-for-arg. Definition at line 36 of file lapacke_zpptri_work.c. 💜

✨ LAPACKE_zpptrs

lapack_int LAPACKE_zpptrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, lapack_complex_double
    * b, lapack_int ldb)

here ap is const (ty king) but b is definitely getting modified, and ldb is right there supervising 🫶. Definition at line 36 of file lapacke_zpptrs.c.

✨ LAPACKE_zpptrs_work

lapack_int LAPACKE_zpptrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, lapack_complex_double
    * b, lapack_int ldb)

zpptrs but make it workspace. Same args, no cap. Definition at line 36 of file lapacke_zpptrs_work.c. ⭐

✨ LAPACKE_zpstrf

lapack_int LAPACKE_zpstrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_int * piv, lapack_int
    * rank, double tol)

look at this glow-up — lapack_int * piv, lapack_int * rank, and a real-valued double tol all up in here 🔥. Definition at line 36 of file lapacke_zpstrf.c.

✨ LAPACKE_zpstrf_work

lapack_int LAPACKE_zpstrf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_int * piv, lapack_int
    * rank, double tol, double * work)

same as zpstrf plus a double * work out the back, because of course 🫠. Definition at line 36 of file lapacke_zpstrf_work.c.

✨ LAPACKE_zptcon

lapack_int LAPACKE_zptcon (lapack_int n, const double * d, const
    lapack_complex_double * e, double anorm, double * rcond)

WAIT — no matrix_layout?? no uplo?? just n, then d (real!), e (complex!), anorm and rcond 💀. A plot twist, truly. Definition at line 36 of file lapacke_zptcon.c.

✨ LAPACKE_zptcon_work

lapack_int LAPACKE_zptcon_work (lapack_int n, const double * d, const
    lapack_complex_double * e, double anorm, double * rcond, double * work)

the left-field non-layout version again, now with a double * work for good measure 🌸. Definition at line 36 of file lapacke_zptcon_work.c.

✨ LAPACKE_zpteqr

lapack_int LAPACKE_zpteqr (int matrix_layout, char compz, lapack_int n,
    double * d, double * e, lapack_complex_double * z, lapack_int ldz)

compz instead of uplo — switch it up, we love to see it — with real arrays d and e and a complex z plus ldz 🌈. Definition at line 36 of file lapacke_zpteqr.c.

✨ LAPACKE_zpteqr_work

lapack_int LAPACKE_zpteqr_work (int matrix_layout, char compz, lapack_int n,
    double * d, double * e, lapack_complex_double * z, lapack_int ldz,
    double * work)

same as above but the double * work said "room for one more?" 😌. Definition at line 36 of file lapacke_zpteqr_work.c.

✨ LAPACKE_zptrfs

lapack_int LAPACKE_zptrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * d, const lapack_complex_double * e,
    const double * df, const lapack_complex_double * ef, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * ferr, double * berr)

the alternating real/complex duo is BACK: d + e, df + ef — all four const, all four besties 💜. Then b, x, both leading dims, and ferr/berr to finish. Definition at line 36 of file lapacke_zptrfs.c.

✨ LAPACKE_zptrfs_work

lapack_int LAPACKE_zptrfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * d, const lapack_complex_double * e,
    const double * df, const lapack_complex_double * ef, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * ferr, double * berr, lapack_complex_double *
    work, double * rwork)

zptrfs with work AND rwork — one for each flavour of number, naturally 🍓. Definition at line 36 of file lapacke_zptrfs_work.c.

✨ LAPACKE_zptsv

lapack_int LAPACKE_zptsv (int matrix_layout, lapack_int n, lapack_int nrhs,
    double * d, lapack_complex_double * e, lapack_complex_double * b,
    lapack_int ldb)

no uplo needed here — just matrix_layout, n, nrhs, then d, e, b and ldb doing their thing 🦋. Definition at line 36 of file lapacke_zptsv.c.

✨ LAPACKE_zptsv_work

lapack_int LAPACKE_zptsv_work (int matrix_layout, lapack_int n, lapack_int
    nrhs, double * d, lapack_complex_double * e, lapack_complex_double * b,
    lapack_int ldb)

same seven-arg lineup, _work on the end of the name, business as usual ✨. Definition at line 36 of file lapacke_zptsv_work.c.

✨ LAPACKE_zptsvx

lapack_int LAPACKE_zptsvx (int matrix_layout, char fact, lapack_int n,
    lapack_int nrhs, const double * d, const lapack_complex_double * e,
    double * df, lapack_complex_double * ef, const lapack_complex_double *
    b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double *
    rcond, double * ferr, double * berr)

oh she's fancy — note that d/e are const but df/ef are NOT, and fact is steering the whole thing 👑. Definition at line 36 of file lapacke_zptsvx.c.

✨ LAPACKE_zptsvx_work

lapack_int LAPACKE_zptsvx_work (int matrix_layout, char fact, lapack_int n,
    lapack_int nrhs, const double * d, const lapack_complex_double * e,
    double * df, lapack_complex_double * ef, const lapack_complex_double *
    b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double *
    rcond, double * ferr, double * berr, lapack_complex_double * work,
    double * rwork)

everything from zptsvx, then work and rwork slide in at the end like they own the place 💅. Definition at line 36 of file lapacke_zptsvx_work.c.

✨ LAPACKE_zpttrf

lapack_int LAPACKE_zpttrf (lapack_int n, double * d, lapack_complex_double *
    e)

three args, no layout, no uplo, just n, d and e — a minimalist queen 🌸. Definition at line 36 of file lapacke_zpttrf.c.

✨ LAPACKE_zpttrf_work

lapack_int LAPACKE_zpttrf_work (lapack_int n, double * d,
    lapack_complex_double * e)

identical to zpttrf, _work edition, still only three args. Definition at line 36 of file lapacke_zpttrf_work.c. 🎀

✨ LAPACKE_zpttrs

lapack_int LAPACKE_zpttrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * d, const lapack_complex_double * e,
    lapack_complex_double * b, lapack_int ldb)

uplo is back babes, and now d and e are const while b takes the writes, with ldb watching 🫶. Definition at line 36 of file lapacke_zpttrs.c.

✨ LAPACKE_zpttrs_work

lapack_int LAPACKE_zpttrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const double * d, const lapack_complex_double * e,
    lapack_complex_double * b, lapack_int ldb)

zpttrs with the workspace hat on. Same eight args, no chaos. Definition at line 36 of file lapacke_zpttrs_work.c. 💜

✨ LAPACKE_zspcon

lapack_int LAPACKE_zspcon (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_double * ap, const lapack_int * ipiv, double anorm,
    double * rcond)

ooh, new guest star: const lapack_int * ipiv 🔥 — plus anorm in and rcond out. Definition at line 36 of file lapacke_zspcon.c.

✨ LAPACKE_zspcon_work

lapack_int LAPACKE_zspcon_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double * ap, const lapack_int * ipiv, double anorm,
    double * rcond, lapack_complex_double * work)

same as zspcon with a lapack_complex_double * work appended, as tradition dictates ✨. Definition at line 36 of file lapacke_zspcon_work.c.

✨ LAPACKE_zsprfs

lapack_int LAPACKE_zsprfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, const
    lapack_complex_double * afp, const lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * ferr, double * berr)

ipiv is here too, sitting snugly between afp and b, and literally everything except x, ferr and berr is const 😌💅. Definition at line 36 of file lapacke_zsprfs.c.

✨ LAPACKE_zsprfs_work

lapack_int LAPACKE_zsprfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, const
    lapack_complex_double * afp, const lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * ferr, double * berr, lapack_complex_double *
    work, double * rwork)

the full-length version — everything above, then work and rwork making it a party 💀🎉. Definition at line 36 of file lapacke_zsprfs_work.c.

✨ LAPACKE_zspsv

lapack_int LAPACKE_zspsv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * ap, lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb)

note ap and ipiv are both non-const here — they get touched, bestie 🙈 — and b with ldb tags along. Definition at line 36 of file lapacke_zspsv.c.

✨ LAPACKE_zspsv_work

lapack_int LAPACKE_zspsv_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * ap, lapack_int * ipiv,
    lapack_complex_double * b, lapack_int ldb)

zspsv in workspace form, same eight args, same mutable energy 🌈. Definition at line 36 of file lapacke_zspsv_work.c.

✨ LAPACKE_zspsvx

lapack_int LAPACKE_zspsvx (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * ap,
    lapack_complex_double * afp, lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr)

okay so check the const-ness gymnastics: ap is const, afp is NOT, ipiv is NOT, b is const, x is NOT 🧚 — plus fact, both layout-ish chars, and the trio rcond/ferr/berr 💜. Definition at line 36 of file lapacke_zspsvx.c.

LAPACKE_zspsvx_work

lapack_int LAPACKE_zspsvx_work (int matrix_layout, char fact, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * ap,
    lapack_complex_double * afp, lapack_int * ipiv, const
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x,
    lapack_int ldx, double * rcond, double * ferr, double * berr,
    lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zspsvx_work.c.

okay bestie this one is stacked — seventeen arguments, both a work and an rwork, and it still lives at line 36 like everyone else 💀 iconic behaviour honestly.

LAPACKE_zsptrf

lapack_int LAPACKE_zsptrf (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap, lapack_int * ipiv)

Definition at line 36 of file lapacke_zsptrf.c.

five args, no workspace, no drama. she's lowkey the chill one of the group 🫶

LAPACKE_zsptrf_work

lapack_int LAPACKE_zsptrf_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap, lapack_int * ipiv)

Definition at line 36 of file lapacke_zsptrf_work.c.

the _work twin with the exact same argument list as LAPACKE_zsptrf — yes, same params, no extra work pointer, and that's genuinely how it's written, don't come for me 🙈

LAPACKE_zsptri

lapack_int LAPACKE_zsptri (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap, const lapack_int * ipiv)

Definition at line 36 of file lapacke_zsptri.c.

note the const on ipiv here — she reads her pivots and does not touch them, we respect a boundaries queen ✨

LAPACKE_zsptri_work

lapack_int LAPACKE_zsptri_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * ap, const lapack_int * ipiv,
    lapack_complex_double * work)

Definition at line 36 of file lapacke_zsptri_work.c.

and here's the version that does take a work buffer at the end. six args. very demure, very mindful 🎀

LAPACKE_zsptrs

lapack_int LAPACKE_zsptrs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, const lapack_int *
    ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsptrs.c.

ap is const, ipiv is const, b is very much not const because that's the whole point bestie 🦋

LAPACKE_zsptrs_work

lapack_int LAPACKE_zsptrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * ap, const lapack_int *
    ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsptrs_work.c.

same signature as the plain one, zero extra args. the _work in the name is carrying the whole personality here ngl 💅

LAPACKE_zstedc

lapack_int LAPACKE_zstedc (int matrix_layout, char compz, lapack_int n,
    double * d, double * e, lapack_complex_double * z, lapack_int ldz)

Definition at line 36 of file lapacke_zstedc.c.

seven params, two chars (compz says hi), and d/e are plain double * while z is lapack_complex_double *. the way it mixes real and complex and doesn't even apologise 😭

LAPACKE_zstedc_work

lapack_int LAPACKE_zstedc_work (int matrix_layout, char compz, lapack_int n,
    double * d, double * e, lapack_complex_double * z, lapack_int ldz,
    lapack_complex_double * work, lapack_int lwork, double * rwork,
    lapack_int lrwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_zstedc_work.c.

THIRTEEN arguments. three separate workspaces: work/lwork, rwork/lrwork, iwork/liwork. she brought her whole friend group to the function call 🔥

LAPACKE_zstegr

lapack_int LAPACKE_zstegr (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, double abstol, lapack_int * m, double * w,
    lapack_complex_double * z, lapack_int ldz, lapack_int * isuppz)

Definition at line 36 of file lapacke_zstegr.c.

two chars, two plain double scalars vl and vu, an abstol, a pointer m, a pointer isuppz… it's giving "I contain multitudes" 👑

LAPACKE_zstegr_work

lapack_int LAPACKE_zstegr_work (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, double abstol, lapack_int * m, double * w,
    lapack_complex_double * z, lapack_int ldz, lapack_int * isuppz, double *
    work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)

Definition at line 36 of file lapacke_zstegr_work.c.

the non-_work one plus work/lwork and iwork/liwork. notice there's no rwork here — I'm just reporting what's on the page, don't shoot the messenger 🍓

LAPACKE_zstein

lapack_int LAPACKE_zstein (int matrix_layout, lapack_int n, const double *
    d, const double * e, lapack_int m, const double * w, const lapack_int *
    iblock, const lapack_int * isplit, lapack_complex_double * z, lapack_int
    ldz, lapack_int * ifailv)

Definition at line 36 of file lapacke_zstein.c.

count the consts bestie: d, e, w, iblock, isplit. all read-only. only z and ifailv get to be written to. boundaries!! 🎀

LAPACKE_zstein_work

lapack_int LAPACKE_zstein_work (int matrix_layout, lapack_int n, const
    double * d, const double * e, lapack_int m, const double * w, const
    lapack_int * iblock, const lapack_int * isplit, lapack_complex_double *
    z, lapack_int ldz, double * work, lapack_int * iwork, lapack_int *
    ifailv)

Definition at line 36 of file lapacke_zstein_work.c.

same as LAPACKE_zstein but with double * work and lapack_int * iwork wedged in before ifailv. and yes, still line 36 😭

LAPACKE_zstemr

lapack_int LAPACKE_zstemr (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, lapack_int * m, double * w, lapack_complex_double *
    z, lapack_int ldz, lapack_int nzc, lapack_int * isuppz, lapack_logical *
    tryrac)

Definition at line 36 of file lapacke_zstemr.c.

spot the icon: lapack_logical * tryrac at the very end. yes queen, take a chance on it ✨

LAPACKE_zstemr_work

lapack_int LAPACKE_zstemr_work (int matrix_layout, char jobz, char range,
    lapack_int n, double * d, double * e, double vl, double vu, lapack_int
    il, lapack_int iu, lapack_int * m, double * w, lapack_complex_double *
    z, lapack_int ldz, lapack_int nzc, lapack_int * isuppz, lapack_logical *
    tryrac, double * work, lapack_int lwork, lapack_int * iwork, lapack_int
    liwork)

Definition at line 36 of file lapacke_zstemr_work.c.

that's the full LAPACKE_zstemr list plus work/lwork and iwork/liwork tacked on the end. twenty-one arguments total, and honestly? she ate 💅

LAPACKE_zsteqr

lapack_int LAPACKE_zsteqr (int matrix_layout, char compz, lapack_int n,
    double * d, double * e, lapack_complex_double * z, lapack_int ldz)

Definition at line 36 of file lapacke_zsteqr.c.

literally the same arg list as LAPACKE_zstedc — matrix_layout, compz, n, d, e, z, ldz. twins fr fr 👯

LAPACKE_zsteqr_work

lapack_int LAPACKE_zsteqr_work (int matrix_layout, char compz, lapack_int n,
    double * d, double * e, lapack_complex_double * z, lapack_int ldz,
    double * work)

Definition at line 36 of file lapacke_zsteqr_work.c.

one extra double * work at the end and that's it, that's the whole update. short king 🫶

LAPACKE_zsycon

lapack_int LAPACKE_zsycon (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv,
    double anorm, double * rcond)

Definition at line 36 of file lapacke_zsycon.c.

anorm comes in as a plain old double, rcond is the pointer you're filling. no e, no workspace — clean, minimal, hydrated 💧

LAPACKE_zsycon_3

lapack_int LAPACKE_zsycon_3 (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * e, const lapack_int * ipiv, double anorm, double
    * rcond)

Definition at line 36 of file lapacke_zsycon_3.c.

the _3 version slides a const lapack_complex_double * e in between lda and ipiv. one extra arg, maximum chaos 🌈

LAPACKE_zsycon_3_work

lapack_int LAPACKE_zsycon_3_work (int matrix_layout, char uplo, lapack_int
    n, const lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * e, const lapack_int * ipiv, double anorm, double
    * rcond, lapack_complex_double * work)

Definition at line 36 of file lapacke_zsycon_3_work.c.

same as LAPACKE_zsycon_3 with a lapack_complex_double * work at the end. the _work suffix said what it said 💅

LAPACKE_zsycon_work

lapack_int LAPACKE_zsycon_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double * a, lapack_int lda, const lapack_int *
    ipiv, double anorm, double * rcond, lapack_complex_double * work)

Definition at line 36 of file lapacke_zsycon_work.c.

no e here — that's the _3 branch's whole thing. this one is LAPACKE_zsycon + work. simple as 🎀

LAPACKE_zsyconv

lapack_int LAPACKE_zsyconv (int matrix_layout, char uplo, char way,
    lapack_int n, lapack_complex_double * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_double * e)

Definition at line 36 of file lapacke_zsyconv.c.

two chars bestie: uplo and way. and a is not const while ipiv is. read the room, read the signatures 🌸

LAPACKE_zsyconv_work

lapack_int LAPACKE_zsyconv_work (int matrix_layout, char uplo, char way,
    lapack_int n, lapack_complex_double * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_double * e)

Definition at line 36 of file lapacke_zsyconv_work.c.

identical parameter list to LAPACKE_zsyconv, no extra work arg. yes I double-checked, and yes I'm as surprised as you 🙈

LAPACKE_zsyequb

lapack_int LAPACKE_zsyequb (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double * a, lapack_int lda, double * s, double *
    scond, double * amax)

Definition at line 36 of file lapacke_zsyequb.c.

three output doubles in a row: s, scond, amax. the holy trinity of "here's your scaling info" ⭐

LAPACKE_zsyequb_work

lapack_int LAPACKE_zsyequb_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double * a, lapack_int lda, double * s, double *
    scond, double * amax, lapack_complex_double * work)

Definition at line 36 of file lapacke_zsyequb_work.c.

all of the above, plus lapack_complex_double * work. nine args, still line 36, still slaying 🦋

LAPACKE_zsyr

lapack_int LAPACKE_zsyr (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double alpha, const lapack_complex_double * x, lapack_int
    incx, lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zsyr.c.

alpha is passed by value as a lapack_complex_double — not a pointer, bestie, look at it, no star 👀 and there's an incx because of course there is 💅

LAPACKE_zsyr_work

lapack_int LAPACKE_zsyr_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double alpha, const lapack_complex_double * x, lapack_int
    incx, lapack_complex_double * a, lapack_int lda)

Definition at line 36 of file lapacke_zsyr_work.c.

same eight args as LAPACKE_zsyr, no extra buffer. if you were waiting for a work pointer, she's not coming 😭

LAPACKE_zsyrfs

lapack_int LAPACKE_zsyrfs (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * af, lapack_int ldaf, const lapack_int * ipiv,
    const lapack_complex_double * b, lapack_int ldb, lapack_complex_double *
    x, lapack_int ldx, double * ferr, double * berr)

Definition at line 36 of file lapacke_zsyrfs.c.

a/lda, af/ldaf, b/ldb, x/ldx — four matrix-plus-leading-dimension pairs, then ferr and berr to close it out. the symmetry?? obsessed 🎀

LAPACKE_zsyrfs_work

lapack_int LAPACKE_zsyrfs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * af, lapack_int ldaf, const lapack_int * ipiv,
    const lapack_complex_double * b, lapack_int ldb, lapack_complex_double *
    x, lapack_int ldx, double * ferr, double * berr, lapack_complex_double *
    work, double * rwork)

Definition at line 36 of file lapacke_zsyrfs_work.c.

everything from LAPACKE_zsyrfs plus lapack_complex_double * work and double * rwork. two buffers, one queen 🔥

LAPACKE_zsyrfsx

lapack_int LAPACKE_zsyrfsx (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * a,
    lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const
    lapack_int * ipiv, const double * s, const lapack_complex_double * b,
    lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double *
    rcond, double * berr, lapack_int n_err_bnds, double * err_bnds_norm,
    double * err_bnds_comp, lapack_int nparams, double * params)

Definition at line 36 of file lapacke_zsyrfsx.c.

the x suffix means business: equed, const double * s, rcond, berr, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. error bounds for days, honey 🌈

LAPACKE_zsyrfsx_work

lapack_int LAPACKE_zsyrfsx_work (int matrix_layout, char uplo, char equed,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * a,
    lapack_int lda, const lapack_complex_double * af, lapack_int ldaf, const
    lapack_int * ipiv, const double * s, const lapack_complex_double * b,
    lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double *
    rcond, double * berr, lapack_int n_err_bnds, double * err_bnds_norm,
    double * err_bnds_comp, lapack_int nparams, double * params,
    lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zsyrfsx_work.c.

the big one: every single arg from LAPACKE_zsyrfsx plus lapack_complex_double * work and double * rwork. twenty-four parameters. twenty-four!! she's the main character of this whole stretch ngl 👑💅

LAPACKE_zsysv

lapack_int LAPACKE_zsysv (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_int *
    ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsysv.c.

nine args, and a is writable because factorization goes right back into it. ipiv comes out too. she's a working girlie ✨

LAPACKE_zsysv_aa

lapack_int LAPACKE_zsysv_aa (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_int *
    ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsysv_aa.c.

exactly the same nine params as LAPACKE_zsysv — the _aa is living in the name and the filename, that's it, that's the whole difference from where I'm standing 🙈

LAPACKE_zsysv_aa_2stage

lapack_int LAPACKE_zsysv_aa_2stage (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv,
    lapack_int * ipiv2, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsysv_aa_2stage.c.

now we're talking — she's got tb/ltb and two pivot arrays, ipiv and ipiv2. two-stage, two pivots, two hundred percent that girl 💅

LAPACKE_zsysv_aa_2stage_work

lapack_int LAPACKE_zsysv_aa_2stage_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int
    lda, lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv,
    lapack_int * ipiv2, lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsysv_aa_2stage_work.c.

all twelve from the line above plus work/lwork. fourteen args and a workspace to match — no notes 💖

LAPACKE_zsysv_aa_work

lapack_int LAPACKE_zsysv_aa_work (int matrix_layout, char uplo, lapack_int
    n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda,
    lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsysv_aa_work.c.

the _aa nine plus work/lwork. no tb, no ipiv2 — that's the 2stage girlie's job, not hers 🫶

LAPACKE_zsysv_rk

lapack_int LAPACKE_zsysv_rk (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * e, lapack_int * ipiv, lapack_complex_double * b,
    lapack_int ldb)

Definition at line 36 of file lapacke_zsysv_rk.c.

and this one's got an e sandwiched between lda and ipiv, with no ltb and no work in sight. different flavour, same energy 🍓 and yep — definition at line 36, because apparently line 36 is the moment for everyone in this house 😭✨

okay bestie we're still deep in the zsys-and-zsyt cinematic universe and honestly it's giving season finale energy 🌈 every single one of these bad boys lives at line 36 of its own little file, so let's just vibe through them in order, no skipping, no cap 💅


  • LAPACKE_zsysv_rk_work — the _rk work-horse of the zsysv crew, complete with its own e and work/lwork situation ✨
lapack_int LAPACKE_zsysv_rk_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * e, lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsysv_rk_work.c.

  • LAPACKE_zsysv_rook — rook-flavoured zsysv, no extra work array invited to the party 🎀
lapack_int LAPACKE_zsysv_rook (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsysv_rook.c.

  • LAPACKE_zsysv_rook_work — same rook energy, now with work and lwork because she's thorough 💅
lapack_int LAPACKE_zsysv_rook_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsysv_rook_work.c.

  • LAPACKE_zsysv_work — the classic zsysv with the work array, the moment, the everything 🦋
lapack_int LAPACKE_zsysv_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsysv_work.c.

  • LAPACKE_zsysvx — the x variant, out here collecting rcond, ferr and berr like they're friendship bracelets 🫶
lapack_int LAPACKE_zsysvx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * rcond, double * ferr, double * berr)

Definition at line 36 of file lapacke_zsysvx.c.

  • LAPACKE_zsysvx_work — zsysvx but she brought work, lwork and rwork 😭 iconic
lapack_int LAPACKE_zsysvx_work (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * rcond, double * ferr, double * berr, lapack_complex_double * work, lapack_int lwork, double * rwork)

Definition at line 36 of file lapacke_zsysvx_work.c.

  • LAPACKE_zsysvxx — the xx one, absolutely stacked: equed, s, rpvgrw, n_err_bnds, err_bnds_norm, err_bnds_comp, nparams, params. main character energy, fr fr 👑
lapack_int LAPACKE_zsysvxx (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv, char * equed, double * s, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * rcond, double * rpvgrw, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params)

Definition at line 36 of file lapacke_zsysvxx.c.

  • LAPACKE_zsysvxx_work — all of the above plus work and rwork, because why gatekeep 💀
lapack_int LAPACKE_zsysvxx_work (int matrix_layout, char fact, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * af, lapack_int ldaf, lapack_int * ipiv, char * equed, double * s, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * x, lapack_int ldx, double * rcond, double * rpvgrw, double * berr, lapack_int n_err_bnds, double * err_bnds_norm, double * err_bnds_comp, lapack_int nparams, double * params, lapack_complex_double * work, double * rwork)

Definition at line 36 of file lapacke_zsysvxx_work.c.

  • LAPACKE_zsyswapr — tiny icon behaviour: she just swaps i1 and i2, periodt 🌸
lapack_int LAPACKE_zsyswapr (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int i1, lapack_int i2)

Definition at line 36 of file lapacke_zsyswapr.c.

  • LAPACKE_zsyswapr_work — the same swap agenda, _work edition ✨
lapack_int LAPACKE_zsyswapr_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int i1, lapack_int i2)

Definition at line 36 of file lapacke_zsyswapr_work.c.

  • LAPACKE_zsytrf — factorization era begins, ipiv is literally the blueprint 🎀
lapack_int LAPACKE_zsytrf (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_zsytrf.c.

  • LAPACKE_zsytrf_aa — _aa remix, same signature, different aura 💜
lapack_int LAPACKE_zsytrf_aa (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_zsytrf_aa.c.

  • LAPACKE_zsytrf_aa_2stage — two-stage girlie with tb, ltb, ipiv and ipiv2 — double the pivots, double the slay 🔥
lapack_int LAPACKE_zsytrf_aa_2stage (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2)

Definition at line 36 of file lapacke_zsytrf_aa_2stage.c.

  • LAPACKE_zsytrf_aa_2stage_work — the two-stage one but with work/lwork tagging along 🙈
lapack_int LAPACKE_zsytrf_aa_2stage_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsytrf_aa_2stage_work.c.

  • LAPACKE_zsytrf_aa_work — _aa with the work array, obviously 💅
lapack_int LAPACKE_zsytrf_aa_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsytrf_aa_work.c.

  • LAPACKE_zsytrf_rk — _rk variant carrying her e alongside ipiv 🦋
lapack_int LAPACKE_zsytrf_rk (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * e, lapack_int * ipiv)

Definition at line 36 of file lapacke_zsytrf_rk.c.

  • LAPACKE_zsytrf_rk_work — same _rk situation, now with work and lwork 🎀
lapack_int LAPACKE_zsytrf_rk_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * e, lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsytrf_rk_work.c.

  • LAPACKE_zsytrf_rook — rook remix of the factorization, clean and mean 🌟
lapack_int LAPACKE_zsytrf_rook (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv)

Definition at line 36 of file lapacke_zsytrf_rook.c.

  • LAPACKE_zsytrf_rook_work — rook plus work/lwork, because she doesn't do anything halfway 💖
lapack_int LAPACKE_zsytrf_rook_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsytrf_rook_work.c.

  • LAPACKE_zsytrf_work — plain zsytrf with the work array invite 😌
lapack_int LAPACKE_zsytrf_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsytrf_work.c.

  • LAPACKE_zsytri — inverse time bestie, ipiv comes in as const 🎀
lapack_int LAPACKE_zsytri (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv)

Definition at line 36 of file lapacke_zsytri.c.

  • LAPACKE_zsytri2 — the 2 version, same dish, extra garnish ✨
lapack_int LAPACKE_zsytri2 (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv)

Definition at line 36 of file lapacke_zsytri2.c.

  • LAPACKE_zsytri2_work — zsytri2 with work and lwork, thriving 💜
lapack_int LAPACKE_zsytri2_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsytri2_work.c.

  • LAPACKE_zsytri2x — now with nb, a whole blocking parameter, fancy 🍓
lapack_int LAPACKE_zsytri2x (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_int nb)

Definition at line 36 of file lapacke_zsytri2x.c.

  • LAPACKE_zsytri2x_work — zsytri2x + work + nb, the full trio 🌸
lapack_int LAPACKE_zsytri2x_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * work, lapack_int nb)

Definition at line 36 of file lapacke_zsytri2x_work.c.

  • LAPACKE_zsytri_3 — the _3 girlie, and note she takes a const lapack_complex_double * e too 👀
lapack_int LAPACKE_zsytri_3 (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_complex_double * e, const lapack_int * ipiv)

Definition at line 36 of file lapacke_zsytri_3.c.

  • LAPACKE_zsytri_3_work — _3 with work/lwork, because of course 💅
lapack_int LAPACKE_zsytri_3_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_complex_double * e, const lapack_int * ipiv, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsytri_3_work.c.

  • LAPACKE_zsytri_work — and here work is a pointer with no lwork, love that for her 🫶
lapack_int LAPACKE_zsytri_work (int matrix_layout, char uplo, lapack_int n, lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * work)

Definition at line 36 of file lapacke_zsytri_work.c.

  • LAPACKE_zsytrs — solve szn, ipiv is const, b is on deck 🌈
lapack_int LAPACKE_zsytrs (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsytrs.c.

  • LAPACKE_zsytrs2 — the 2 remix of the solve, same squad 😌
lapack_int LAPACKE_zsytrs2 (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsytrs2.c.

  • LAPACKE_zsytrs2_work — zsytrs2 plus a work pointer (no lwork here, bestie, just work) 🎀
lapack_int LAPACKE_zsytrs2_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work)

Definition at line 36 of file lapacke_zsytrs2_work.c.

  • LAPACKE_zsytrs_3 — _3 solve, dragging const ... * e along for the ride 💜
lapack_int LAPACKE_zsytrs_3 (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * e, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsytrs_3.c.

  • LAPACKE_zsytrs_3_work — same signature as _3 up there, and yes that's on purpose, don't come for her 😭
lapack_int LAPACKE_zsytrs_3_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * e, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsytrs_3_work.c.

  • LAPACKE_zsytrs_aa — _aa solve, clean const energy all the way through ⭐
lapack_int LAPACKE_zsytrs_aa (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsytrs_aa.c.

  • LAPACKE_zsytrs_aa_2stage — two-stage solve with tb, ltb, ipiv and ipiv2, she's booked and busy 🔥
lapack_int LAPACKE_zsytrs_aa_2stage (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsytrs_aa_2stage.c.

  • LAPACKE_zsytrs_aa_2stage_work — identical parameter list to the non-_work one, and that's just how it is 🌸
lapack_int LAPACKE_zsytrs_aa_2stage_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, lapack_complex_double * a, lapack_int lda, lapack_complex_double * tb, lapack_int ltb, lapack_int * ipiv, lapack_int * ipiv2, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsytrs_aa_2stage_work.c.

  • LAPACKE_zsytrs_aa_work — _aa solve with work and lwork back in the mix 🙈
lapack_int LAPACKE_zsytrs_aa_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zsytrs_aa_work.c.

  • LAPACKE_zsytrs_rook — and the rook solve closes out this little batch, no cap 💖
lapack_int LAPACKE_zsytrs_rook (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

Definition at line 36 of file lapacke_zsytrs_rook.c.

  • lapack_int LAPACKE_zsytrs_rook_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)
lapack_int LAPACKE_zsytrs_rook_work (int matrix_layout, char uplo,
    lapack_int n, lapack_int nrhs, const lapack_complex_double * a,
    lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b,
    lapack_int ldb)

Bestie, it's the _work twin of zsytrs_rook 💜 same args, same double-precision-complex vibes, and yeah — Definition at line 36 of file lapacke_zsytrs_rook_work.c. She's giving "I do the actual work while my non-_work sister takes the credit" ✨

  • lapack_int LAPACKE_zsytrs_work (int matrix_layout, char uplo, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)
lapack_int LAPACKE_zsytrs_work (int matrix_layout, char uplo, lapack_int n,
    lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const
    lapack_int * ipiv, lapack_complex_double * b, lapack_int ldb)

The workspace-having solve for symmetric complex-double systems 🫶 Definition at line 36 of file lapacke_zsytrs_work.c. Same signature as her rook cousin, no additions, no surprises, slay 🎀


🦋 Triangular band — the ztb* girlies 🦋

  • lapack_int LAPACKE_ztbcon (int matrix_layout, char norm, char uplo, char diag, lapack_int n, lapack_int kd, const lapack_complex_double * ab, lapack_int ldab, double * rcond)
lapack_int LAPACKE_ztbcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, lapack_int kd, const lapack_complex_double * ab,
    lapack_int ldab, double * rcond)

Condition-number estimate for a triangular band matrix in complex double — that's what tb means, iykyk 💅 rcond comes back as a plain double, which honestly? iconic. Definition at line 36 of file lapacke_ztbcon.c ✨

  • lapack_int LAPACKE_ztbcon_work (int matrix_layout, char norm, char uplo, char diag, lapack_int n, lapack_int kd, const lapack_complex_double * ab, lapack_int ldab, double * rcond, lapack_complex_double * work, double * rwork)
lapack_int LAPACKE_ztbcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, lapack_int kd, const lapack_complex_double *
    ab, lapack_int ldab, double * rcond, lapack_complex_double * work,
    double * rwork)

Same condition-number party but now you're bringing your own work AND rwork — two buffers, main character energy 👑 Definition at line 36 of file lapacke_ztbcon_work.c

  • lapack_int LAPACKE_ztbrfs (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const lapack_complex_double * ab, lapack_int ldab, const lapack_complex_double * b, lapack_int ldb, const lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr)
lapack_int LAPACKE_ztbrfs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
    lapack_complex_double * ab, lapack_int ldab, const lapack_complex_double
    * b, lapack_int ldb, const lapack_complex_double * x, lapack_int ldx,
    double * ferr, double * berr)

Refinement time 🧚 triangular-band system gets checked against an improved solution x, and you get ferr + berr back so you know exactly how much to trust it, fr fr. Definition at line 36 of file lapacke_ztbrfs.c

  • lapack_int LAPACKE_ztbrfs_work (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const lapack_complex_double * ab, lapack_int ldab, const lapack_complex_double * b, lapack_int ldb, const lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork)
lapack_int LAPACKE_ztbrfs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
    lapack_complex_double * ab, lapack_int ldab, const lapack_complex_double
    * b, lapack_int ldb, const lapack_complex_double * x, lapack_int ldx,
    double * ferr, double * berr, lapack_complex_double * work, double *
    rwork)

The refined version with your own work + rwork bolted on the end 🫶 same game, more buffers. Definition at line 36 of file lapacke_ztbrfs_work.c 💖

  • lapack_int LAPACKE_ztbtrs (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * b, lapack_int ldb)
lapack_int LAPACKE_ztbtrs (int matrix_layout, char uplo, char trans, char
    diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
    lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * b,
    lapack_int ldb)

Solving A*X = B when A is triangular-band complex double 🔥 b gets overwritten with the answer, which is lowkey the whole point. Definition at line 36 of file lapacke_ztbtrs.c ⭐

  • lapack_int LAPACKE_ztbtrs_work (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * b, lapack_int ldb)
lapack_int LAPACKE_ztbtrs_work (int matrix_layout, char uplo, char trans,
    char diag, lapack_int n, lapack_int kd, lapack_int nrhs, const
    lapack_complex_double * ab, lapack_int ldab, lapack_complex_double * b,
    lapack_int ldb)

Identical arg list to the non-_work one, no cap 🧢 Definition at line 36 of file lapacke_ztbtrs_work.c — same signature, different file name, and that's the tea ☕


🎀 RFP triangular squad — ztf* 🎀

  • lapack_int LAPACKE_ztfsm (int matrix_layout, char transr, char side, char uplo, char trans, char diag, lapack_int m, lapack_int n, lapack_complex_double alpha, const lapack_complex_double * a, lapack_complex_double * b, lapack_int ldb)
lapack_int LAPACKE_ztfsm (int matrix_layout, char transr, char side, char
    uplo, char trans, char diag, lapack_int m, lapack_int n,
    lapack_complex_double alpha, const lapack_complex_double * a,
    lapack_complex_double * b, lapack_int ldb)

B := alpha*op(A)*B (or B*op(A), depending on side) where A is triangular in RFP storage 🌈 note the transr — that's the rectangular-full-pack thing, not a typo, iykyk. alpha is a lapack_complex_double. Definition at line 36 of file lapacke_ztfsm.c 💫

  • lapack_int LAPACKE_ztfsm_work (int matrix_layout, char transr, char side, char uplo, char trans, char diag, lapack_int m, lapack_int n, lapack_complex_double alpha, const lapack_complex_double * a, lapack_complex_double * b, lapack_int ldb)
lapack_int LAPACKE_ztfsm_work (int matrix_layout, char transr, char side,
    char uplo, char trans, char diag, lapack_int m, lapack_int n,
    lapack_complex_double alpha, const lapack_complex_double * a,
    lapack_complex_double * b, lapack_int ldb)

The _work twin, same args verbatim, living her best life in her own file 💜 Definition at line 36 of file lapacke_ztfsm_work.c

  • lapack_int LAPACKE_ztftri (int matrix_layout, char transr, char uplo, char diag, lapack_int n, lapack_complex_double * a)
lapack_int LAPACKE_ztftri (int matrix_layout, char transr, char uplo, char
    diag, lapack_int n, lapack_complex_double * a)

Inverse of a triangular matrix in RFP format ✨ a is in/out, n is the order, that's the whole vibe. Definition at line 36 of file lapacke_ztftri.c 🦋

  • lapack_int LAPACKE_ztftri_work (int matrix_layout, char transr, char uplo, char diag, lapack_int n, lapack_complex_double * a)
lapack_int LAPACKE_ztftri_work (int matrix_layout, char transr, char uplo,
    char diag, lapack_int n, lapack_complex_double * a)

Same six args, same energy, _work in the filename 🫶 Definition at line 36 of file lapacke_ztftri_work.c

  • lapack_int LAPACKE_ztfttp (int matrix_layout, char transr, char uplo, lapack_int n, const lapack_complex_double * arf, lapack_complex_double * ap)
lapack_int LAPACKE_ztfttp (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_double * arf, lapack_complex_double *
    ap)

Copy time 💅 RFP-stored arf goes in, packed-triangular ap comes out. It's giving "translation layer between two storage girlies." Definition at line 36 of file lapacke_ztfttp.c 🎀

  • lapack_int LAPACKE_ztfttp_work (int matrix_layout, char transr, char uplo, lapack_int n, const lapack_complex_double * arf, lapack_complex_double * ap)
lapack_int LAPACKE_ztfttp_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_double * arf, lapack_complex_double *
    ap)

Exact same signature, _work edition 💖 Definition at line 36 of file lapacke_ztfttp_work.c

  • lapack_int LAPACKE_ztfttr (int matrix_layout, char transr, char uplo, lapack_int n, const lapack_complex_double * arf, lapack_complex_double * a, lapack_int lda)
lapack_int LAPACKE_ztfttr (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_double * arf, lapack_complex_double *
    a, lapack_int lda)

RFP → full rectangular triangle matrix, with lda because we're being proper about leading dimensions now 👑 Definition at line 36 of file lapacke_ztfttr.c ⭐

  • lapack_int LAPACKE_ztfttr_work (int matrix_layout, char transr, char uplo, lapack_int n, const lapack_complex_double * arf, lapack_complex_double * a, lapack_int lda)
lapack_int LAPACKE_ztfttr_work (int matrix_layout, char transr, char uplo,
    lapack_int n, const lapack_complex_double * arf, lapack_complex_double *
    a, lapack_int lda)

Same seven params, _work suffix, no notes 😌 Definition at line 36 of file lapacke_ztfttr_work.c 🌸


💀 Generalized eigen — the ztg* icons 👑

  • lapack_int LAPACKE_ztgevc (int matrix_layout, char side, char howmny, const lapack_logical * select, lapack_int n, const lapack_complex_double * s, lapack_int lds, const lapack_complex_double * p, lapack_int ldp, lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr, lapack_int ldvr, lapack_int mm, lapack_int * m)
lapack_int LAPACKE_ztgevc (int matrix_layout, char side, char howmny, const
    lapack_logical * select, lapack_int n, const lapack_complex_double * s,
    lapack_int lds, const lapack_complex_double * p, lapack_int ldp,
    lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr,
    lapack_int ldvr, lapack_int mm, lapack_int * m)

Computes eigenvectors of a complex-double pencil (S, P) 😭 howmny decides whether you want all of them or just the ones flagged in select, mm is your column budget for vl/vr, and m tells you how many you actually got. Definition at line 36 of file lapacke_ztgevc.c 🔥

  • lapack_int LAPACKE_ztgevc_work (int matrix_layout, char side, char howmny, const lapack_logical * select, lapack_int n, const lapack_complex_double * s, lapack_int lds, const lapack_complex_double * p, lapack_int ldp, lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr, lapack_int ldvr, lapack_int mm, lapack_int * m, lapack_complex_double * work, double * rwork)
lapack_int LAPACKE_ztgevc_work (int matrix_layout, char side, char howmny,
    const lapack_logical * select, lapack_int n, const lapack_complex_double
    * s, lapack_int lds, const lapack_complex_double * p, lapack_int ldp,
    lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr,
    lapack_int ldvr, lapack_int mm, lapack_int * m, lapack_complex_double *
    work, double * rwork)

Same as above but you're supplying work and rwork yourself because you're an independent queen 💅 Definition at line 36 of file lapacke_ztgevc_work.c 🫶

  • lapack_int LAPACKE_ztgexc (int matrix_layout, lapack_logical wantq, lapack_logical wantz, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z, lapack_int ldz, lapack_int ifst, lapack_int ilst)
lapack_int LAPACKE_ztgexc (int matrix_layout, lapack_logical wantq,
    lapack_logical wantz, lapack_int n, lapack_complex_double * a,
    lapack_int lda, lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z,
    lapack_int ldz, lapack_int ifst, lapack_int ilst)

Swaps diagonal blocks ifst and ilst in a generalized Schur form, and wantq/wantz say whether q and z come along for the ride ✨ Definition at line 36 of file lapacke_ztgexc.c 🌈

  • lapack_int LAPACKE_ztgexc_work (int matrix_layout, lapack_logical wantq, lapack_logical wantz, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z, lapack_int ldz, lapack_int ifst, lapack_int ilst)
lapack_int LAPACKE_ztgexc_work (int matrix_layout, lapack_logical wantq,
    lapack_logical wantz, lapack_int n, lapack_complex_double * a,
    lapack_int lda, lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z,
    lapack_int ldz, lapack_int ifst, lapack_int ilst)

Yep, identical param list, _work file 🧚 Definition at line 36 of file lapacke_ztgexc_work.c

  • lapack_int LAPACKE_ztgsen (int matrix_layout, lapack_int ijob, lapack_logical wantq, lapack_logical wantz, const lapack_logical * select, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z, lapack_int ldz, lapack_int * m, double * pl, double * pr, double * dif)
lapack_int LAPACKE_ztgsen (int matrix_layout, lapack_int ijob,
    lapack_logical wantq, lapack_logical wantz, const lapack_logical *
    select, lapack_int n, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double *
    alpha, lapack_complex_double * beta, lapack_complex_double * q,
    lapack_int ldq, lapack_complex_double * z, lapack_int ldz, lapack_int *
    m, double * pl, double * pr, double * dif)

Reorders the generalized Schur decomposition so your selected eigenvalues are up front 👑 ijob controls whether you get pl/pr condition numbers, dif differences, or both. Definition at line 36 of file lapacke_ztgsen.c 💀

  • lapack_int LAPACKE_ztgsen_work (int matrix_layout, lapack_int ijob, lapack_logical wantq, lapack_logical wantz, const lapack_logical * select, lapack_int n, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * alpha, lapack_complex_double * beta, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * z, lapack_int ldz, lapack_int * m, double * pl, double * pr, double * dif, lapack_complex_double * work, lapack_int lwork, lapack_int * iwork, lapack_int liwork)
lapack_int LAPACKE_ztgsen_work (int matrix_layout, lapack_int ijob,
    lapack_logical wantq, lapack_logical wantz, const lapack_logical *
    select, lapack_int n, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb, lapack_complex_double *
    alpha, lapack_complex_double * beta, lapack_complex_double * q,
    lapack_int ldq, lapack_complex_double * z, lapack_int ldz, lapack_int *
    m, double * pl, double * pr, double * dif, lapack_complex_double * work,
    lapack_int lwork, lapack_int * iwork, lapack_int liwork)

The full manual-buffer edition: work + lwork + iwork + liwork all handed over by you, bestie 🫶 Definition at line 36 of file lapacke_ztgsen_work.c 🌟

  • lapack_int LAPACKE_ztgsja (int matrix_layout, char jobu, char jobv, char jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k, lapack_int l, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double tola, double tolb, double * alpha, double * beta, lapack_complex_double * u, lapack_int ldu, lapack_complex_double * v, lapack_int ldv, lapack_complex_double * q, lapack_int ldq, lapack_int * ncycle)
lapack_int LAPACKE_ztgsja (int matrix_layout, char jobu, char jobv, char
    jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k, lapack_int
    l, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b,
    lapack_int ldb, double tola, double tolb, double * alpha, double * beta,
    lapack_complex_double * u, lapack_int ldu, lapack_complex_double * v,
    lapack_int ldv, lapack_complex_double * q, lapack_int ldq, lapack_int *
    ncycle)

Generalized SVD via the Kogbetliantz-style Jacobi grind 🔥 jobu/jobv/jobq tell her which of u, v, q you actually want computed, tola/tolb are your tolerances, and ncycle reports how many sweeps it took. Definition at line 36 of file lapacke_ztgsja.c ⭐

  • lapack_int LAPACKE_ztgsja_work (int matrix_layout, char jobu, char jobv, char jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k, lapack_int l, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, double tola, double tolb, double * alpha, double * beta, lapack_complex_double * u, lapack_int ldu, lapack_complex_double * v, lapack_int ldv, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * work, lapack_int * ncycle)
lapack_int LAPACKE_ztgsja_work (int matrix_layout, char jobu, char jobv,
    char jobq, lapack_int m, lapack_int p, lapack_int n, lapack_int k,
    lapack_int l, lapack_complex_double * a, lapack_int lda,
    lapack_complex_double * b, lapack_int ldb, double tola, double tolb,
    double * alpha, double * beta, lapack_complex_double * u, lapack_int
    ldu, lapack_complex_double * v, lapack_int ldv, lapack_complex_double *
    q, lapack_int ldq, lapack_complex_double * work, lapack_int * ncycle)

Same generalized-SVD situation, except a work buffer slides in right before ncycle 💅 Definition at line 36 of file lapacke_ztgsja_work.c 🎀

  • lapack_int LAPACKE_ztgsna (int matrix_layout, char job, char howmny, const lapack_logical * select, lapack_int n, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb, const lapack_complex_double * vl, lapack_int ldvl, const lapack_complex_double * vr, lapack_int ldvr, double * s, double * dif, lapack_int mm, lapack_int * m)
lapack_int LAPACKE_ztgsna (int matrix_layout, char job, char howmny, const
    lapack_logical * select, lapack_int n, const lapack_complex_double * a,
    lapack_int lda, const lapack_complex_double * b, lapack_int ldb, const
    lapack_complex_double * vl, lapack_int ldvl, const lapack_complex_double
    * vr, lapack_int ldvr, double * s, double * dif, lapack_int mm,
    lapack_int * m)

Eigenvalue condition numbers for the pencil (A, B) 😭 job picks whether you're here for s, dif, or both, howmny + select narrow it down, mm caps the eigenvector columns and m reports the count. Definition at line 36 of file lapacke_ztgsna.c 💖

  • lapack_int LAPACKE_ztgsna_work (int matrix_layout, char job, char howmny, const lapack_logical * select, lapack_int n, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb, const lapack_complex_double * vl, lapack_int ldvl, const lapack_complex_double * vr, lapack_int ldvr, double * s, double * dif, lapack_int mm, lapack_int * m, lapack_complex_double * work, lapack_int lwork, lapack_int * iwork)
lapack_int LAPACKE_ztgsna_work (int matrix_layout, char job, char howmny,
    const lapack_logical * select, lapack_int n, const lapack_complex_double
    * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb,
    const lapack_complex_double * vl, lapack_int ldvl, const
    lapack_complex_double * vr, lapack_int ldvr, double * s, double * dif,
    lapack_int mm, lapack_int * m, lapack_complex_double * work, lapack_int
    lwork, lapack_int * iwork)

Condition numbers, but DIY buffers: work, lwork, iwork — collect all three 🫶 Definition at line 36 of file lapacke_ztgsna_work.c 🦋

  • lapack_int LAPACKE_ztgsyl (int matrix_layout, char trans, lapack_int ijob, lapack_int m, lapack_int n, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * c, lapack_int ldc, const lapack_complex_double * d, lapack_int ldd, const lapack_complex_double * e, lapack_int lde, lapack_complex_double * f, lapack_int ldf, double * scale, double * dif)
lapack_int LAPACKE_ztgsyl (int matrix_layout, char trans, lapack_int ijob,
    lapack_int m, lapack_int n, const lapack_complex_double * a, lapack_int
    lda, const lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * c, lapack_int ldc, const lapack_complex_double *
    d, lapack_int ldd, const lapack_complex_double * e, lapack_int lde,
    lapack_complex_double * f, lapack_int ldf, double * scale, double * dif)

Solves the Sylvester-ish equation for the pencils (A, D) and (B, E), and hands you back scale plus dif 🔥 six matrices total, she's booked and busy. Definition at line 36 of file lapacke_ztgsyl.c 👑

  • lapack_int LAPACKE_ztgsyl_work (int matrix_layout, char trans, lapack_int ijob, lapack_int m, lapack_int n, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * c, lapack_int ldc, const lapack_complex_double * d, lapack_int ldd, const lapack_complex_double * e, lapack_int lde, lapack_complex_double * f, lapack_int ldf, double * scale, double * dif, lapack_complex_double * work, lapack_int lwork, lapack_int * iwork)
lapack_int LAPACKE_ztgsyl_work (int matrix_layout, char trans, lapack_int
    ijob, lapack_int m, lapack_int n, const lapack_complex_double * a,
    lapack_int lda, const lapack_complex_double * b, lapack_int ldb,
    lapack_complex_double * c, lapack_int ldc, const lapack_complex_double *
    d, lapack_int ldd, const lapack_complex_double * e, lapack_int lde,
    lapack_complex_double * f, lapack_int ldf, double * scale, double * dif,
    lapack_complex_double * work, lapack_int lwork, lapack_int * iwork)

Add work/lwork/iwork and you've got the _work version, periodt 💜 Definition at line 36 of file lapacke_ztgsyl_work.c ⭐


🌸 Packed triangular girlies — ztp* 🌸

  • lapack_int LAPACKE_ztpcon (int matrix_layout, char norm, char uplo, char diag, lapack_int n, const lapack_complex_double * ap, double * rcond)
lapack_int LAPACKE_ztpcon (int matrix_layout, char norm, char uplo, char
    diag, lapack_int n, const lapack_complex_double * ap, double * rcond)

Condition number estimate for a packed triangular complex-double matrix — ap is the packed storage, rcond comes back as a double 💅 Definition at line 36 of file lapacke_ztpcon.c ✨

  • lapack_int LAPACKE_ztpcon_work (int matrix_layout, char norm, char uplo, char diag, lapack_int n, const lapack_complex_double * ap, double * rcond, lapack_complex_double * work, double * rwork)
lapack_int LAPACKE_ztpcon_work (int matrix_layout, char norm, char uplo,
    char diag, lapack_int n, const lapack_complex_double * ap, double *
    rcond, lapack_complex_double * work, double * rwork)

Same packed condition-number check, now with work and rwork appended 🫶 Definition at line 36 of file lapacke_ztpcon_work.c 🎀

  • lapack_int LAPACKE_ztpmqrt (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int nb, const lapack_complex_double * v, lapack_int ldv, const lapack_complex_double * t, lapack_int ldt, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb)
lapack_int LAPACKE_ztpmqrt (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int nb,
    const lapack_complex_double * v, lapack_int ldv, const
    lapack_complex_double * t, lapack_int ldt, lapack_complex_double * a,
    lapack_int lda, lapack_complex_double * b, lapack_int ldb)

Applies a complex-double block reflector (v + t) to a packed a and a rectangular b 🔥 side, trans, nb — she's got range, fr fr. Definition at line 36 of file lapacke_ztpmqrt.c 💖

🫶 LAPACKE_ztpmqrt_work

lapack_int LAPACKE_ztpmqrt_work (int matrix_layout, char side, char trans, lapack_int m, lapack_int n, lapack_int k, lapack_int l, lapack_int nb, const lapack_complex_double * v, lapack_int ldv, const lapack_complex_double * t, lapack_int ldt, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work)

okay so this is the _work sibling of ztpmqrt — the one where you bring the scratch space, bestie. All the usual suspects are here: matrix_layout, side, trans, then the dims m, n, k, l, the blocking factor nb, the const inputs v/t with their ldv/ldt, the outputs a/b with lda/ldb, and of course work at the end carrying the payload. 💅

Definition at line 36 of file lapacke_ztpmqrt_work.c.


🌸 LAPACKE_ztpqrt

lapack_int LAPACKE_ztpqrt (int matrix_layout, lapack_int m, lapack_int n, lapack_int l, lapack_int nb, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * t, lapack_int ldt)

the QR factorization-flavored one, no _work energy, she handles her own internals. you pass matrix_layout, m, n, l, nb, then a/lda, b/ldb, and the t factor with ldt. iconic. ✨

Definition at line 36 of file lapacke_ztpqrt.c.


🦋 LAPACKE_ztpqrt2

lapack_int LAPACKE_ztpqrt2 (int matrix_layout, lapack_int m, lapack_int n, lapack_int l, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * t, lapack_int ldt)

ztpqrt2 is the "2" version — note the missing nb bestie, no blocking param here, she's built different. still got matrix_layout, m, n, l, a/lda, b/ldb, t/ldt though. 💜

Definition at line 36 of file lapacke_ztpqrt2.c.


🎀 LAPACKE_ztpqrt2_work

lapack_int LAPACKE_ztpqrt2_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int l, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * t, lapack_int ldt)

exactly the same roster of arguments as LAPACKE_ztpqrt2 — matrix_layout, m, n, l, a/lda, b/ldb, t/ldt — but she's the _work variant. same squad, different filing cabinet. 🗂️

Definition at line 36 of file lapacke_ztpqrt2_work.c.


🌈 LAPACKE_ztpqrt_work

lapack_int LAPACKE_ztpqrt_work (int matrix_layout, lapack_int m, lapack_int n, lapack_int l, lapack_int nb, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * t, lapack_int ldt, lapack_complex_double * work)

yup, ztpqrt again but now with work riding along at the end 🫶 — everything else is unchanged: matrix_layout, m, n, l, nb, a/lda, b/ldb, t/ldt.

Definition at line 36 of file lapacke_ztpqrt_work.c.


💅 LAPACKE_ztprfb

lapack_int LAPACKE_ztprfb (int matrix_layout, char side, char trans, char direct, char storev, lapack_int m, lapack_int n, lapack_int k, lapack_int l, const lapack_complex_double * v, lapack_int ldv, const lapack_complex_double * t, lapack_int ldt, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb)

the triangular packed "apply" routine — she's got a whole personality lineup of char args: side, trans, direct, storev, plus dims m, n, k, l. then the const v/ldv and t/ldt, and the mutable a/lda, b/ldb. main character behavior fr. 👑

Definition at line 36 of file lapacke_ztprfb.c.


🔥 LAPACKE_ztprfb_work

lapack_int LAPACKE_ztprfb_work (int matrix_layout, char side, char trans, char direct, char storev, lapack_int m, lapack_int n, lapack_int k, lapack_int l, const lapack_complex_double * v, lapack_int ldv, const lapack_complex_double * t, lapack_int ldt, lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb, lapack_complex_double * work, lapack_int ldwork)

the _work glow-up of ztprfb — same side, trans, direct, storev, m, n, k, l, v/ldv, t/ldt, a/lda, b/ldb, and then she brings work and ldwork to the party. two extra guests, no cap. 🎉

Definition at line 36 of file lapacke_ztprfb_work.c.


⭐ LAPACKE_ztprfs

lapack_int LAPACKE_ztprfs (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs, const lapack_complex_double * ap, const lapack_complex_double * b, lapack_int ldb, const lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr)

refinement time 💖 — this one computes error bounds, so she takes ferr and berr as double * outputs at the end. before those: matrix_layout, uplo, trans, diag, n, nrhs, const ap, const b/ldb, const x/ldx. so many consts.

Definition at line 36 of file lapacke_ztprfs.c.


🍓 LAPACKE_ztprfs_work

lapack_int LAPACKE_ztprfs_work (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs, const lapack_complex_double * ap, const lapack_complex_double * b, lapack_int ldb, const lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork)

same as LAPACKE_ztprfs — matrix_layout, uplo, trans, diag, n, nrhs, ap, b/ldb, x/ldx, ferr, berr — but now with work (complex) and rwork (real) tacked on because she does her own bookkeeping. ✨

Definition at line 36 of file lapacke_ztprfs_work.c.


🧚 LAPACKE_ztptri

lapack_int LAPACKE_ztptri (int matrix_layout, char uplo, char diag, lapack_int n, lapack_complex_double * ap)

inverse of a triangular packed matrix, short and sweet. matrix_layout, uplo, diag, n, and the packed ap that gets overwritten in place. tiny cast, big impact. 🎀

Definition at line 36 of file lapacke_ztptri.c.


🌸 LAPACKE_ztptri_work

lapack_int LAPACKE_ztptri_work (int matrix_layout, char uplo, char diag, lapack_int n, lapack_complex_double * ap)

identical argument list to LAPACKE_ztptri — matrix_layout, uplo, diag, n, ap — she's just the _work entry. same energy, different filename. 🦋

Definition at line 36 of file lapacke_ztptri_work.c.


💜 LAPACKE_ztptrs

lapack_int LAPACKE_ztptrs (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs, const lapack_complex_double * ap, lapack_complex_double * b, lapack_int ldb)

triangular packed solve — she takes matrix_layout, uplo, trans, diag, n, nrhs, const ap, and the mutable b/ldb that comes back solved. work smarter not harder bestie. 💅

Definition at line 36 of file lapacke_ztptrs.c.


🫶 LAPACKE_ztptrs_work

lapack_int LAPACKE_ztptrs_work (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs, const lapack_complex_double * ap, lapack_complex_double * b, lapack_int ldb)

same signature as LAPACKE_ztptrs: matrix_layout, uplo, trans, diag, n, nrhs, ap, b, ldb. the _work twin strikes again. 😭

Definition at line 36 of file lapacke_ztptrs_work.c.


🌈 LAPACKE_ztpttf

lapack_int LAPACKE_ztpttf (int matrix_layout, char transr, char uplo, lapack_int n, const lapack_complex_double * ap, lapack_complex_double * arf)

packed → rectangular full (RFP) conversion, iykyk. args are matrix_layout, transr, uplo, n, const ap, and the arf output. she's a format-shifter, a real transformer. 🦋

Definition at line 36 of file lapacke_ztpttf.c.


⭐ LAPACKE_ztpttf_work

lapack_int LAPACKE_ztpttf_work (int matrix_layout, char transr, char uplo, lapack_int n, const lapack_complex_double * ap, lapack_complex_double * arf)

same cast as LAPACKE_ztpttf — matrix_layout, transr, uplo, n, ap, arf — just the _work name tag. 🌟

Definition at line 36 of file lapacke_ztpttf_work.c.


🎀 LAPACKE_ztpttr

lapack_int LAPACKE_ztpttr (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double * ap, lapack_complex_double * a, lapack_int lda)

the reverse vibe of ztpttf — packed goes back to full triangular-ish storage. matrix_layout, uplo, n, const ap, output a/lda. iconic little unpacking moment. 🍓

Definition at line 36 of file lapacke_ztpttr.c.


🧚 LAPACKE_ztpttr_work

lapack_int LAPACKE_ztpttr_work (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double * ap, lapack_complex_double * a, lapack_int lda)

literally the same args as LAPACKE_ztpttr: matrix_layout, uplo, n, ap, a, lda. nothing new, just the _work badge. 💜

Definition at line 36 of file lapacke_ztpttr_work.c.


👑 LAPACKE_ztrcon

lapack_int LAPACKE_ztrcon (int matrix_layout, char norm, char uplo, char diag, lapack_int n, const lapack_complex_double * a, lapack_int lda, double * rcond)

condition number estimator for a triangular matrix — she gives you rcond as a double * at the end 🫶. before that: matrix_layout, norm, uplo, diag, n, const a, lda. precision queen.

Definition at line 36 of file lapacke_ztrcon.c.


🔥 LAPACKE_ztrcon_work

lapack_int LAPACKE_ztrcon_work (int matrix_layout, char norm, char uplo, char diag, lapack_int n, const lapack_complex_double * a, lapack_int lda, double * rcond, lapack_complex_double * work, double * rwork)

ztrcon but she's carrying her own bags: matrix_layout, norm, uplo, diag, n, a/lda, rcond, plus work and rwork. slay. 💅

Definition at line 36 of file lapacke_ztrcon_work.c.


🦋 LAPACKE_ztrevc

lapack_int LAPACKE_ztrevc (int matrix_layout, char side, char howmny, const lapack_logical * select, lapack_int n, lapack_complex_double * t, lapack_int ldt, lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr, lapack_int ldvr, lapack_int mm, lapack_int * m)

eigenvector central right here 🌈 — note the lapack_logical * select const pointer, the side and howmny chars, n, t/ldt, vl/ldvl, vr/ldvr, mm, and the m output pointer. two outputs live in this house.

Definition at line 36 of file lapacke_ztrevc.c.


🌟 LAPACKE_ztrevc_work

lapack_int LAPACKE_ztrevc_work (int matrix_layout, char side, char howmny, const lapack_logical * select, lapack_int n, lapack_complex_double * t, lapack_int ldt, lapack_complex_double * vl, lapack_int ldvl, lapack_complex_double * vr, lapack_int ldvr, lapack_int mm, lapack_int * m, lapack_complex_double * work, double * rwork)

ztrevc with the workspace flex: everything from matrix_layout through m is the same — side, howmny, select, n, t/ldt, vl/ldvl, vr/ldvr, mm, m — plus work and rwork on the tail. 💖

Definition at line 36 of file lapacke_ztrevc_work.c.


🎀 LAPACKE_ztrexc

lapack_int LAPACKE_ztrexc (int matrix_layout, char compq, lapack_int n, lapack_complex_double * t, lapack_int ldt, lapack_complex_double * q, lapack_int ldq, lapack_int ifst, lapack_int ilst)

reorders that Schur form, bestie — she shuffles things from position ifst to ilst and doesn't apologize. args: matrix_layout, compq, n, t/ldt, q/ldq, ifst, ilst. 🌀

Definition at line 36 of file lapacke_ztrexc.c.


💜 LAPACKE_ztrexc_work

lapack_int LAPACKE_ztrexc_work (int matrix_layout, char compq, lapack_int n, lapack_complex_double * t, lapack_int ldt, lapack_complex_double * q, lapack_int ldq, lapack_int ifst, lapack_int ilst)

exact same roster as LAPACKE_ztrexc — matrix_layout, compq, n, t/ldt, q/ldq, ifst, ilst — just with _work in the name. no notes. 🫶

Definition at line 36 of file lapacke_ztrexc_work.c.


🍓 LAPACKE_ztrrfs

lapack_int LAPACKE_ztrrfs (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb, const lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr)

triangular refinement, so ferr and berr are the whole point 🎯. she needs matrix_layout, uplo, trans, diag, n, nrhs, const a/lda, const b/ldb, const x/ldx. lots of consts, lots of trust.

Definition at line 36 of file lapacke_ztrrfs.c.


✨ LAPACKE_ztrrfs_work

lapack_int LAPACKE_ztrrfs_work (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb, const lapack_complex_double * x, lapack_int ldx, double * ferr, double * berr, lapack_complex_double * work, double * rwork)

ztrrfs + work + rwork. the rest is untouched: matrix_layout, uplo, trans, diag, n, nrhs, a/lda, b/ldb, x/ldx, ferr, berr. 💅

Definition at line 36 of file lapacke_ztrrfs_work.c.


👑 LAPACKE_ztrsen

lapack_int LAPACKE_ztrsen (int matrix_layout, char job, char compq, const lapack_logical * select, lapack_int n, lapack_complex_double * t, lapack_int ldt, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * w, lapack_int * m, double * s, double * sep)

reorder + condition estimate, the triple-threat 💀. matrix_layout, job, compq, const select (lapack_logical *), n, t/ldt, q/ldq, w, and then the outputs m, s, sep — all pointers, she's not copying anything for free.

Definition at line 36 of file lapacke_ztrsen.c.


🔥 LAPACKE_ztrsen_work

lapack_int LAPACKE_ztrsen_work (int matrix_layout, char job, char compq, const lapack_logical * select, lapack_int n, lapack_complex_double * t, lapack_int ldt, lapack_complex_double * q, lapack_int ldq, lapack_complex_double * w, lapack_int * m, double * s, double * sep, lapack_complex_double * work, lapack_int lwork)

same as LAPACKE_ztrsen all the way through sep — matrix_layout, job, compq, select, n, t/ldt, q/ldq, w, m, s, sep — and then she asks for work and lwork too. queen of preparedness. 🌈

Definition at line 36 of file lapacke_ztrsen_work.c.


🦋 LAPACKE_ztrsna

lapack_int LAPACKE_ztrsna (int matrix_layout, char job, char howmny, const lapack_logical * select, lapack_int n, const lapack_complex_double * t, lapack_int ldt, const lapack_complex_double * vl, lapack_int ldvl, const lapack_complex_double * vr, lapack_int ldvr, double * s, double * sep, lapack_int mm, lapack_int * m)

estimates s and sep for selected eigenvalues 🫶 — everything is const except the outputs. args: matrix_layout, job, howmny, select, n, t/ldt, vl/ldvl, vr/ldvr, s, sep, mm, m. big cast, all business.

Definition at line 36 of file lapacke_ztrsna.c.


🌟 LAPACKE_ztrsna_work

lapack_int LAPACKE_ztrsna_work (int matrix_layout, char job, char howmny, const lapack_logical * select, lapack_int n, const lapack_complex_double * t, lapack_int ldt, const lapack_complex_double * vl, lapack_int ldvl, const lapack_complex_double * vr, lapack_int ldvr, double * s, double * sep, lapack_int mm, lapack_int * m, lapack_complex_double * work, lapack_int ldwork, double * rwork)

ztrsna but she brings work, ldwork, and rwork 🎒. the front half is identical: matrix_layout, job, howmny, select, n, t/ldt, vl/ldvl, vr/ldvr, s, sep, mm, m.

Definition at line 36 of file lapacke_ztrsna_work.c.


💜 LAPACKE_ztrsyl

lapack_int LAPACKE_ztrsyl (int matrix_layout, char trana, char tranb, lapack_int isgn, lapack_int m, lapack_int n, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * c, lapack_int ldc, double * scale)

Sylvester equation solver, periodt. 🌀 she takes matrix_layout, trana, tranb, isgn, m, n, const a/lda, const b/ldb, the mutable c/ldc, and the scale output at the end — that last one's important, don't lose her.

Definition at line 36 of file lapacke_ztrsyl.c.


🎀 LAPACKE_ztrsyl_work

lapack_int LAPACKE_ztrsyl_work (int matrix_layout, char trana, char tranb, lapack_int isgn, lapack_int m, lapack_int n, const lapack_complex_double * a, lapack_int lda, const lapack_complex_double * b, lapack_int ldb, lapack_complex_double * c, lapack_int ldc, double * scale)

identical argument list to LAPACKE_ztrsyl — matrix_layout, trana, tranb, isgn, m, n, a/lda, b/ldb, c/ldc, scale. _work suffix only, no plot twist. ✨

Definition at line 36 of file lapacke_ztrsyl_work.c.


🍓 LAPACKE_ztrtri

lapack_int LAPACKE_ztrtri (int matrix_layout, char uplo, char diag, lapack_int n, lapack_complex_double * a, lapack_int lda)

inverts a triangular matrix in place, ngl she's efficient like that. matrix_layout, uplo, diag, n, and a/lda getting completely rewritten. 💅

Definition at line 36 of file lapacke_ztrtri.c.


🧚 LAPACKE_ztrtri_work

lapack_int LAPACKE_ztrtri_work (int matrix_layout, char uplo, char diag, lapack_int n, lapack_complex_double * a, lapack_int lda)

same as LAPACKE_ztrtri: matrix_layout, uplo, diag, n, a, lda. just the _work version being her usual self. 🌸

Definition at line 36 of file lapacke_ztrtri_work.c.


⭐ LAPACKE_ztrtrs

lapack_int LAPACKE_ztrtrs (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb)

triangular solve, the classic 🫶. matrix_layout, uplo, trans, diag, n, nrhs, const a/lda, and b/ldb which comes home solved. we love a working relationship.

Definition at line 36 of file lapacke_ztrtrs.c.


🌈 LAPACKE_ztrtrs_work

lapack_int LAPACKE_ztrtrs_work (int matrix_layout, char uplo, char trans, char diag, lapack_int n, lapack_int nrhs, const lapack_complex_double * a, lapack_int lda, lapack_complex_double * b, lapack_int ldb)

same lineup as LAPACKE_ztrtrs — matrix_layout, uplo, trans, diag, n, nrhs, a/lda, b/ldb. the _work girlies really do keep it consistent. 💜

Definition at line 36 of file lapacke_ztrtrs_work.c.


🔥 LAPACKE_ztrttf

lapack_int LAPACKE_ztrttf (int matrix_layout, char transr, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda, lapack_complex_double * arf)

full triangular → RFP format, the "tf" is doing heavy lifting in the name bestie 💀. args: matrix_layout, transr, uplo, n, const a/lda, output arf. 🎀

Definition at line 36 of file lapacke_ztrttf.c.


🌟 LAPACKE_ztrttf_work

lapack_int LAPACKE_ztrttf_work (int matrix_layout, char transr, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda, lapack_complex_double * arf)

identical args to LAPACKE_ztrttf: matrix_layout, transr, uplo, n, a, lda, arf. only the filename's different, fr fr. 🦋

Definition at line 36 of file lapacke_ztrttf_work.c.


💖 LAPACKE_ztrttp

lapack_int LAPACKE_ztrttp (int matrix_layout, char uplo, lapack_int n, const lapack_complex_double * a, lapack_int lda, lapack_complex_double * ap)

and the last one for this batch: full triangular → packed, the reverse trip 💅. she's got matrix_layout, uplo, n, const a/lda, and the ap output waiting to be filled. go off, format converter.

Definition at line 36 of file lapacke_ztrttp.c.

LAPACKE_ztrttp_work

lapack_int LAPACKE_ztrttp_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double * a, lapack_int lda, lapack_complex_double *
    ap)

bestie this is the _work twin of ztrttp and it's giving very much "I brought the scratch space so you don't have to" 💅 — as always, <purple>Definition at line 36 of file lapacke_ztrttp_work.c</purple>.


LAPACKE_ztzrzf

lapack_int LAPACKE_ztzrzf (int matrix_layout, lapack_int m, lapack_int n,
    lapack_complex_double * a, lapack_int lda, lapack_complex_double * tau)

m, n, an lda, and a tau — sounds like a snack order but it's actually just the params 🍓 <purple>Definition at line 36 of file lapacke_ztzrzf.c</purple>.


LAPACKE_ztzrzf_work

lapack_int LAPACKE_ztzrzf_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_complex_double * a, lapack_int lda, lapack_complex_double *
    tau, lapack_complex_double * work, lapack_int lwork)

same energy as above but now with work + lwork in the mix 🔥 <purple>Definition at line 36 of file lapacke_ztzrzf_work.c</purple>.


LAPACKE_zunbdb

lapack_int LAPACKE_zunbdb (int matrix_layout, char trans, char signs,
    lapack_int m, lapack_int p, lapack_int q, lapack_complex_double * x11,
    lapack_int ldx11, lapack_complex_double * x12, lapack_int ldx12,
    lapack_complex_double * x21, lapack_int ldx21, lapack_complex_double *
    x22, lapack_int ldx22, double * theta, double * phi,
    lapack_complex_double * taup1, lapack_complex_double * taup2,
    lapack_complex_double * tauq1, lapack_complex_double * tauq2)

not the quadrants x11, x12, x21, x22 each with their own ldx — this one's busy in the best way, trans AND signs AND a whole fleet of taus 😭 <purple>Definition at line 36 of file lapacke_zunbdb.c</purple>.


LAPACKE_zunbdb_work

lapack_int LAPACKE_zunbdb_work (int matrix_layout, char trans, char signs,
    lapack_int m, lapack_int p, lapack_int q, lapack_complex_double * x11,
    lapack_int ldx11, lapack_complex_double * x12, lapack_int ldx12,
    lapack_complex_double * x21, lapack_int ldx21, lapack_complex_double *
    x22, lapack_int ldx22, double * theta, double * phi,
    lapack_complex_double * taup1, lapack_complex_double * taup2,
    lapack_complex_double * tauq1, lapack_complex_double * tauq2,
    lapack_complex_double * work, lapack_int lwork)

literal same cast as zunbdb but they brought work and lwork along for the ride 🫶 <purple>Definition at line 36 of file lapacke_zunbdb_work.c</purple>.


LAPACKE_zuncsd

lapack_int LAPACKE_zuncsd (int matrix_layout, char jobu1, char jobu2, char
    jobv1t, char jobv2t, char trans, char signs, lapack_int m, lapack_int p,
    lapack_int q, lapack_complex_double * x11, lapack_int ldx11,
    lapack_complex_double * x12, lapack_int ldx12, lapack_complex_double *
    x21, lapack_int ldx21, lapack_complex_double * x22, lapack_int ldx22,
    double * theta, lapack_complex_double * u1, lapack_int ldu1,
    lapack_complex_double * u2, lapack_int ldu2, lapack_complex_double *
    v1t, lapack_int ldv1t, lapack_complex_double * v2t, lapack_int ldv2t)

four job flags (jobu1, jobu2, jobv1t, jobv2t), trans, signs, all the X blocks, theta, both us and both v1t/v2t — a whole main-character ensemble 👑 <purple>Definition at line 36 of file lapacke_zuncsd.c</purple>.


LAPACKE_zuncsd2by1

lapack_int LAPACKE_zuncsd2by1 (int matrix_layout, char jobu1, char jobu2,
    char jobv1t, lapack_int m, lapack_int p, lapack_int q,
    lapack_complex_double * x11, lapack_int ldx11, lapack_complex_double *
    x21, lapack_int ldx21, double * theta, lapack_complex_double * u1,
    lapack_int ldu1, lapack_complex_double * u2, lapack_int ldu2,
    lapack_complex_double * v1t, lapack_int ldv1t)

the 2by1 version keeps it to x11 and x21 — trimming the cast but still serving the job flags, theta, and v1t ✨ <purple>Definition at line 36 of file lapacke_zuncsd2by1.c</purple>.


LAPACKE_zuncsd2by1_work

lapack_int LAPACKE_zuncsd2by1_work (int matrix_layout, char jobu1, char
    jobu2, char jobv1t, lapack_int m, lapack_int p, lapack_int q,
    lapack_complex_double * x11, lapack_int ldx11, lapack_complex_double *
    x21, lapack_int ldx21, double * theta, lapack_complex_double * u1,
    lapack_int ldu1, lapack_complex_double * u2, lapack_int ldu2,
    lapack_complex_double * v1t, lapack_int ldv1t, lapack_complex_double *
    work, lapack_int lwork, double * rwork, lapack_int lrwork, lapack_int *
    iwork)

okay so this one is stacked — work/lwork, rwork/lrwork, AND iwork all showing up 🙈 <purple>Definition at line 36 of file lapacke_zuncsd2by1_work.c</purple>.


LAPACKE_zuncsd_work

lapack_int LAPACKE_zuncsd_work (int matrix_layout, char jobu1, char jobu2,
    char jobv1t, char jobv2t, char trans, char signs, lapack_int m,
    lapack_int p, lapack_int q, lapack_complex_double * x11, lapack_int
    ldx11, lapack_complex_double * x12, lapack_int ldx12,
    lapack_complex_double * x21, lapack_int ldx21, lapack_complex_double *
    x22, lapack_int ldx22, double * theta, lapack_complex_double * u1,
    lapack_int ldu1, lapack_complex_double * u2, lapack_int ldu2,
    lapack_complex_double * v1t, lapack_int ldv1t, lapack_complex_double *
    v2t, lapack_int ldv2t, lapack_complex_double * work, lapack_int lwork,
    double * rwork, lapack_int lrwork, lapack_int * iwork)

zuncsd plus the whole work-family (work, rwork, iwork, each with a length) — a full house, no cap 🔥 <purple>Definition at line 36 of file lapacke_zuncsd_work.c</purple>.


LAPACKE_zungbr

lapack_int LAPACKE_zungbr (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int k, lapack_complex_double * a, lapack_int lda,
    const lapack_complex_double * tau)

vect, m, n, k, a, lda, tau — short, sweet, and tau is const so hands off bestie 🎀 <purple>Definition at line 36 of file lapacke_zungbr.c</purple>.


LAPACKE_zungbr_work

lapack_int LAPACKE_zungbr_work (int matrix_layout, char vect, lapack_int m,
    lapack_int n, lapack_int k, lapack_complex_double * a, lapack_int lda,
    const lapack_complex_double * tau, lapack_complex_double * work,
    lapack_int lwork)

same vect-blessed lineup, now with work + lwork tucked in at the end 💜 <purple>Definition at line 36 of file lapacke_zungbr_work.c</purple>.


LAPACKE_zunghr

lapack_int LAPACKE_zunghr (int matrix_layout, lapack_int n, lapack_int ilo,
    lapack_int ihi, lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * tau)

n, ilo, ihi, a, lda, and a const tau — yes the range is literally named ilo/ihi, lowkey iconic 🦋 <purple>Definition at line 36 of file lapacke_zunghr.c</purple>.


LAPACKE_zunghr_work

lapack_int LAPACKE_zunghr_work (int matrix_layout, lapack_int n, lapack_int
    ilo, lapack_int ihi, lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * tau, lapack_complex_double * work, lapack_int
    lwork)

ilo/ihi stay in the chat, and now work/lwork joined too 🌸 <purple>Definition at line 36 of file lapacke_zunghr_work.c</purple>.


LAPACKE_zunglq

lapack_int LAPACKE_zunglq (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * tau)

the lq girlie with m, n, k, a, lda, tau 💅 <purple>Definition at line 36 of file lapacke_zunglq.c</purple>.


LAPACKE_zunglq_work

lapack_int LAPACKE_zunglq_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * tau, lapack_complex_double * work, lapack_int
    lwork)

exact same lineup, plus work and lwork doing their thing ✨ <purple>Definition at line 36 of file lapacke_zunglq_work.c</purple>.


LAPACKE_zungql

lapack_int LAPACKE_zungql (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * tau)

careful — this is ql, not lq, don't mix them up bestie 😭 <purple>Definition at line 36 of file lapacke_zungql.c</purple>.


LAPACKE_zungql_work

lapack_int LAPACKE_zungql_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * tau, lapack_complex_double * work, lapack_int
    lwork)

zungql + work + lwork, that's the whole vibe 🫶 <purple>Definition at line 36 of file lapacke_zungql_work.c</purple>.


LAPACKE_zungqr

lapack_int LAPACKE_zungqr (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * tau)

the qr one, same m/n/k/a/lda/tau skeleton, zero notes 🌈 <purple>Definition at line 36 of file lapacke_zungqr.c</purple>.


LAPACKE_zungqr_work

lapack_int LAPACKE_zungqr_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * tau, lapack_complex_double * work, lapack_int
    lwork)

qr with the work/lwork add-on, slay ⭐ <purple>Definition at line 36 of file lapacke_zungqr_work.c</purple>.


LAPACKE_zungrq

lapack_int LAPACKE_zungrq (int matrix_layout, lapack_int m, lapack_int n,
    lapack_int k, lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * tau)

rq this time — the family reunion continues 🧚 <purple>Definition at line 36 of file lapacke_zungrq.c</purple>.


LAPACKE_zungrq_work

lapack_int LAPACKE_zungrq_work (int matrix_layout, lapack_int m, lapack_int
    n, lapack_int k, lapack_complex_double * a, lapack_int lda, const
    lapack_complex_double * tau, lapack_complex_double * work, lapack_int
    lwork)

rq + work + lwork, periodt 💜 <purple>Definition at line 36 of file lapacke_zungrq_work.c</purple>.


LAPACKE_zungtr

lapack_int LAPACKE_zungtr (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * a, lapack_int lda, const lapack_complex_double *
    tau)

uplo makes its entrance here, alongside n, a, lda, tau 💖 <purple>Definition at line 36 of file lapacke_zungtr.c</purple>.


LAPACKE_zungtr_work

lapack_int LAPACKE_zungtr_work (int matrix_layout, char uplo, lapack_int n,
    lapack_complex_double * a, lapack_int lda, const lapack_complex_double *
    tau, lapack_complex_double * work, lapack_int lwork)

uplo-having zungtr with the standard work/lwork encore 🎀 <purple>Definition at line 36 of file lapacke_zungtr_work.c</purple>.


LAPACKE_zunmbr

lapack_int LAPACKE_zunmbr (int matrix_layout, char vect, char side, char
    trans, lapack_int m, lapack_int n, lapack_int k, const
    lapack_complex_double * a, lapack_int lda, const lapack_complex_double *
    tau, lapack_complex_double * c, lapack_int ldc)

three chars deep (vect, side, trans) and now there's a c with its own ldc — the unm* era has begun 🔥 <purple>Definition at line 36 of file lapacke_zunmbr.c</purple>.


LAPACKE_zunmbr_work

lapack_int LAPACKE_zunmbr_work (int matrix_layout, char vect, char side,
    char trans, lapack_int m, lapack_int n, lapack_int k, const
    lapack_complex_double * a, lapack_int lda, const lapack_complex_double *
    tau, lapack_complex_double * c, lapack_int ldc, lapack_complex_double *
    work, lapack_int lwork)

vect/side/trans trio intact, c and ldc present, plus work/lwork for the road 🦋 <purple>Definition at line 36 of file lapacke_zunmbr_work.c</purple>.


LAPACKE_zunmhr

lapack_int LAPACKE_zunmhr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const
    lapack_complex_double * a, lapack_int lda, const lapack_complex_double *
    tau, lapack_complex_double * c, lapack_int ldc)

no vect here — instead you get side, trans, ilo, ihi, a/lda, tau, and c/ldc 🙈 <purple>Definition at line 36 of file lapacke_zunmhr.c</purple>.


LAPACKE_zunmhr_work

lapack_int LAPACKE_zunmhr_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int ilo, lapack_int ihi, const
    lapack_complex_double * a, lapack_int lda, const lapack_complex_double *
    tau, lapack_complex_double * c, lapack_int ldc, lapack_complex_double *
    work, lapack_int lwork)

same zunmhr guests, and yes work + lwork are on the list too 💅 <purple>Definition at line 36 of file lapacke_zunmhr_work.c</purple>.


LAPACKE_zunmlq

lapack_int LAPACKE_zunmlq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *
    a, lapack_int lda, const lapack_complex_double * tau,
    lapack_complex_double * c, lapack_int ldc)

side + trans + m/n/k + a/lda + tau + c/ldc — the lq member of the unm squad 🌸 <purple>Definition at line 36 of file lapacke_zunmlq.c</purple>.


LAPACKE_zunmlq_work

lapack_int LAPACKE_zunmlq_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *
    a, lapack_int lda, const lapack_complex_double * tau,
    lapack_complex_double * c, lapack_int ldc, lapack_complex_double * work,
    lapack_int lwork)

zunmlq with work/lwork appended like a little bow on top 🎀 <purple>Definition at line 36 of file lapacke_zunmlq_work.c</purple>.


LAPACKE_zunmql

lapack_int LAPACKE_zunmql (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *
    a, lapack_int lda, const lapack_complex_double * tau,
    lapack_complex_double * c, lapack_int ldc)

ql this round — again, not the same as lq, respect the letter order bestie 😭 <purple>Definition at line 36 of file lapacke_zunmql.c</purple>.


LAPACKE_zunmql_work

lapack_int LAPACKE_zunmql_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *
    a, lapack_int lda, const lapack_complex_double * tau,
    lapack_complex_double * c, lapack_int ldc, lapack_complex_double * work,
    lapack_int lwork)

ql energy plus the familiar work/lwork duo ✨ <purple>Definition at line 36 of file lapacke_zunmql_work.c</purple>.


LAPACKE_zunmqr

lapack_int LAPACKE_zunmqr (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *
    a, lapack_int lda, const lapack_complex_double * tau,
    lapack_complex_double * c, lapack_int ldc)

qr flavor, same side/trans/m/n/k lineup 💜 <purple>Definition at line 36 of file lapacke_zunmqr.c</purple>.


LAPACKE_zunmqr_work

lapack_int LAPACKE_zunmqr_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *
    a, lapack_int lda, const lapack_complex_double * tau,
    lapack_complex_double * c, lapack_int ldc, lapack_complex_double * work,
    lapack_int lwork)

and the qr close-out gets its work/lwork too — a very satisfying finish to this run of z entries 🌟 <purple>Definition at line 36 of file lapacke_zunmqr_work.c</purple>.

Okay bestie, final stretch — these are the last of the z crew, the complex-double glow-ups. Same deal, same line numbers, all slay, no skips 💅


  • LAPACKE_zunmrq
lapack_int LAPACKE_zunmrq (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *
    a, lapack_int lda, const lapack_complex_double * tau,
    lapack_complex_double * c, lapack_int ldc)

Definition at line 36 of file lapacke_zunmrq.c.

  • LAPACKE_zunmrq_work
lapack_int LAPACKE_zunmrq_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, const lapack_complex_double *
    a, lapack_int lda, const lapack_complex_double * tau,
    lapack_complex_double * c, lapack_int ldc, lapack_complex_double * work,
    lapack_int lwork)

Definition at line 36 of file lapacke_zunmrq_work.c.

  • LAPACKE_zunmrz
lapack_int LAPACKE_zunmrz (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, const
    lapack_complex_double * a, lapack_int lda, const lapack_complex_double *
    tau, lapack_complex_double * c, lapack_int ldc)

Definition at line 36 of file lapacke_zunmrz.c.

  • LAPACKE_zunmrz_work
lapack_int LAPACKE_zunmrz_work (int matrix_layout, char side, char trans,
    lapack_int m, lapack_int n, lapack_int k, lapack_int l, const
    lapack_complex_double * a, lapack_int lda, const lapack_complex_double *
    tau, lapack_complex_double * c, lapack_int ldc, lapack_complex_double *
    work, lapack_int lwork)

Definition at line 36 of file lapacke_zunmrz_work.c.

  • LAPACKE_zunmtr
lapack_int LAPACKE_zunmtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const lapack_complex_double * a,
    lapack_int lda, const lapack_complex_double * tau, lapack_complex_double
    * c, lapack_int ldc)

Definition at line 36 of file lapacke_zunmtr.c.

  • LAPACKE_zunmtr_work
lapack_int LAPACKE_zunmtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const lapack_complex_double * a,
    lapack_int lda, const lapack_complex_double * tau, lapack_complex_double
    * c, lapack_int ldc, lapack_complex_double * work, lapack_int lwork)

Definition at line 36 of file lapacke_zunmtr_work.c.

  • LAPACKE_zupgtr
lapack_int LAPACKE_zupgtr (int matrix_layout, char uplo, lapack_int n, const
    lapack_complex_double * ap, const lapack_complex_double * tau,
    lapack_complex_double * q, lapack_int ldq)

Definition at line 36 of file lapacke_zupgtr.c.

  • LAPACKE_zupgtr_work
lapack_int LAPACKE_zupgtr_work (int matrix_layout, char uplo, lapack_int n,
    const lapack_complex_double * ap, const lapack_complex_double * tau,
    lapack_complex_double * q, lapack_int ldq, lapack_complex_double * work)

Definition at line 36 of file lapacke_zupgtr_work.c.

  • LAPACKE_zupmtr
lapack_int LAPACKE_zupmtr (int matrix_layout, char side, char uplo, char
    trans, lapack_int m, lapack_int n, const lapack_complex_double * ap,
    const lapack_complex_double * tau, lapack_complex_double * c, lapack_int
    ldc)

Definition at line 36 of file lapacke_zupmtr.c.

  • LAPACKE_zupmtr_work
lapack_int LAPACKE_zupmtr_work (int matrix_layout, char side, char uplo,
    char trans, lapack_int m, lapack_int n, const lapack_complex_double *
    ap, const lapack_complex_double * tau, lapack_complex_double * c,
    lapack_int ldc, lapack_complex_double * work)

Definition at line 36 of file lapacke_zupmtr_work.c.


👑 Author

No cap, you could tell me a whole human wrote every single one of these by hand and I'd believe it, but nope: Generated automatically by Doxygen for LAPACK from the source code. The robots ate and left no crumbs 🫶


Bestie we did it, the whole page, start to finish, nothing dropped ✨ This was Version 3.8.0, dated Tue Nov 14 2017, and you've officially reached the end of lapacke.h(3). Go close that terminal tab like the main character you are 💖🎀🌸

📦 where this page comes from