cgesylv(3)
πΈ cgesylv β C-Interface πΈ
okay so bestie, we're in the MEPACK manual, section 3, and this page is cgesylv π it's the C-side of the standard Sylvester equation game, and it is long, so buckle up π
π NAME π
cgesylv β C-Interface
- C-Interface for standard Sylvester equations.
β¨ SYNOPSIS β¨
Functions
okay so here's the whole squad, no cap π«Ά every single one of them:
mepack_double_gesylv
void mepack_double_gesylv (const char *FACTA, const char *FACTB, const char *TRANSA, const char *TRANSB, double SGN, int M, int N, double *A, int LDA, double *B, int LDB, double *QA, int LDQA, double *QB, int LDQB, double *X, int LDX, double *SCALE, double *WORK, size_t LDWORK, int *INFO)
Frontend for the solution of Standard Sylvester Equations.
mepack_single_gesylv
void mepack_single_gesylv (const char *FACTA, const char *FACTB, const char *TRANSA, const char *TRANSB, float SGN, int M, int N, float *A, int LDA, float *B, int LDB, float *QA, int LDQA, float *QB, int LDQB, float *X, int LDX, float *SCALE, float *WORK, size_t LDWORK, int *INFO)
Frontend for the solution of Standard Sylvester Equations.
mepack_double_gesylv2
void mepack_double_gesylv2 (const char *FACTA, const char *FACTB, const char *TRANSA, const char *TRANSB, double SGN, int M, int N, double *A, int LDA, double *B, int LDB, double *QA, int LDQA, double *QB, int LDQB, double *X, int LDX, double *SCALE, double *WORK, size_t LDWORK, int *INFO)
Frontend for the solution of Standard Sylvester Equations.
mepack_single_gesylv2
void mepack_single_gesylv2 (const char *FACTA, const char *FACTB, const char *TRANSA, const char *TRANSB, float SGN, int M, int N, float *A, int LDA, float *B, int LDB, float *QA, int LDQA, float *QB, int LDQB, float *X, int LDX, float *SCALE, float *WORK, size_t LDWORK, int *INFO)
Frontend for the solution of Standard Sylvester Equations.
mepack_double_gesylv_refine
void mepack_double_gesylv_refine (const char *TRANSA, const char *TRANSB, const char *GUESS, double SGN, int M, int N, double *A, int LDA, double *B, int LDB, double *X, int LDX, double *Y, int LDY, double *AS, int LDAS, double *BS, int LDBS, double *Q, int LDQ, double *U, int LDU, int *MAXIT, double *TAU, double *CONVLOG, double *WORK, size_t LDWORK, int *INFO)
Iterative Refinement for the standard Sylvester Equations.
mepack_single_gesylv_refine
void mepack_single_gesylv_refine (const char *TRANSA, const char *TRANSB, const char *GUESS, float SGN, int M, int N, float *A, int LDA, float *B, int LDB, float *X, int LDX, float *Y, int LDY, float *AS, int LDAS, float *BS, int LDBS, float *Q, int LDQ, float *U, int LDU, int *MAXIT, float *TAU, float *CONVLOG, float *WORK, size_t LDWORK, int *INFO)
Iterative Refinement for the standard Sylvester Equations.
mepack_double_gesylv2_refine
void mepack_double_gesylv2_refine (const char *TRANSA, const char *TRANSB, const char *GUESS, double SGN, int M, int N, double *A, int LDA, double *B, int LDB, double *X, int LDX, double *Y, int LDY, double *AS, int LDAS, double *BS, int LDBS, double *Q, int LDQ, double *U, int LDU, int *MAXIT, double *TAU, double *CONVLOG, double *WORK, size_t LDWORK, int *INFO)
Iterative Refinement for the standard Sylvester Equations.
mepack_single_gesylv2_refine
void mepack_single_gesylv2_refine (const char *TRANSA, const char *TRANSB, const char *GUESS, float SGN, int M, int N, float *A, int LDA, float *B, int LDB, float *X, int LDX, float *Y, int LDY, float *AS, int LDAS, float *BS, int LDBS, float *Q, int LDQ, float *U, int LDU, int *MAXIT, float *TAU, float *CONVLOG, float *WORK, size_t LDWORK, int *INFO)
Iterative Refinement for the standard Sylvester Equations.
π« Detailed Description π«
C-Interface for standard Sylvester equations.
so like, the Fortran routines that solve the standard Sylvester equation with arbitrary coefficients got wrapped in C so you don't have to suffer, bestie π§ easier access, that's the whole point.
and here's the tea: all the wrapper routines are direct wrappers to the corresponding Fortran subroutines, and they do no sanity checks of their own. none. zero. the Fortran routines do all of that. π
the only difference is that the C interface does not</> allow LAPACK-like work_space queries. for that you gotta go use the mepack_memory_frontend function instead, periodt π
π§ Function Documentation π§
π mepack_double_gesylv π
void mepack_double_gesylv (const char * FACTA, const char * FACTB, const char * TRANSA, const char * TRANSB, double SGN, int M, int N, double * A, int LDA, double * B, int LDB, double * QA, int LDQA, double * QB, int LDQB, double * X, int LDX, double * SCALE, double * WORK, size_t LDWORK, int * INFO)
Frontend for the solution of Standard Sylvester Equations.
Purpose:
mepack_double_gesylv solves a Sylvester equation of the following forms
op1(A) * X + X * op2(B) = SCALE * Y (1)
or
op1(A) * X - X * op2(B) = SCALE * Y (2)
where A is a M-by-M matrix and B is a N-by-N matrix π¦ the right hand side Y and the solution X are M-by-N matrices. and the matrices A and B can be either a general unreduced matrix, or an upper Hessenberg form, or a (quasi-) upper triangular factor π in that last case, QA and QB are the ones handing you the Schur-vectors of the matrices A and B, iykyk.
Remarks
- This function is a wrapper for
dla_gesylv.
See also
dla_gesylv
Parameters
FACTAβFACTAis String. Specifies how the matrixAis given.== 'N': The matrixAis given as a general matrix and its Schur decompositionA = QA*S*QA**Twill be computed.== 'F': The matrixAis given as its Schur decomposition in terms ofSandQAformA = QA*S*QA**T== 'H': The matrixAis given in upper Hessenberg form and its Schur decompositionA = QA*S*QA**Twill be computed
FACTBβFACTBis String. Specifies how the matrixBis given.== 'N': The matrixBis given as a general matrix and its Schur decompositionB = QB*R*QB**Twill be computed.== 'F': The matrixBis given as its Schur decomposition in terms ofRandQBformB = QB*R*QB**T== 'H': The matrixBis given in upper Hessenberg form and its Schur decompositionB = QB*R*QB**Twill be computed
TRANSAβTRANSAis String. Specifies the form of the system of equations with respect toA:== 'N':op1(A) = A== 'T':op1(A) = A**T
TRANSBβTRANSBis String. Specifies the form of the system of equations with respect toB:== 'N':op2(B) = B,== 'T':op2(B) = B**T
SGNβSGNis DOUBLE PRECISION, allowed values:+/-1. Specifies the sign between the two parts of the Sylvester equation.= 1: Solve Equation (1)== -1: Solve Equation (2)
MβMis INTEGER. The order of the matricesAandC.M >= 0.NβNis INTEGER. The order of the matricesBandD.N >= 0.AβAis DOUBLE PRECISION array, dimension(LDA,M).- If
FACTA == "N", the matrixAis a general matrix and it is overwritten with its schur decompositionS. - If
FACTA == "F", the matrixAcontains its (quasi-) upper triangular matrixSbeing the Schur decomposition ofA. - If
FACTA == "H", the matrixAis an upper Hessenberg matrix and it is overwritten with its schur decompositionS.
- If
LDAβLDAis INTEGER. The leading dimension of the arrayA.LDA >= max(1,M).BβBis DOUBLE PRECISION array, dimension(LDB,N).- If
FACTB == "N", the matrixBis a general matrix and it is overwritten with its schur decompositionR. - If
FACTB == "F", the matrixBcontains its (quasi-) upper triangular matrixRbeing the Schur decomposition ofB. - If
FACTB == "N", the matrixBis an upper Hessenberg matrix and it is overwritten with its schur decompositionR.
- If
LDBβLDBis INTEGER. The leading dimension of the arrayB.LDB >= max(1,N).QAβQAis DOUBLE PRECISION array, dimension(LDQA,M).- If
FACT == "N", the matrixQAis an emptyM-by-Mmatrix on input and contains the Schur vectors ofAon output. - If
FACT == "F", the matrixQAcontains the Schur vectors ofA. - If
FACT == "H", the matrixQAis an emptyM-by-Mmatrix on input and contains the Schur vectors ofAon output.
- If
LDQAβLDQAis INTEGER. The leading dimension of the arrayQA.LDQA >= max(1,M).QBβQBis DOUBLE PRECISION array, dimension(LDQB,N).- If
FACT == "N", the matrixQBis an emptyN-by-Nmatrix on input and contains the Schur vectors ofBon output. - If
FACT == "F", the matrixQBcontains the Schur vectors ofB. - If
FACT == "H", the matrixQBis an emptyN-by-Nmatrix on input and contains the Schur vectors ofBon output.
- If
LDQBβLDQBis INTEGER. The leading dimension of the arrayQB.LDQB >= max(1,N).XβXis DOUBLE PRECISION array, dimension(LDX,N).- On input, the matrix
Xcontains the right hand sideY. - On output, the matrix
Xcontains the solution of Equation (1) or (2) - Right hand side
Yand the solutionXareM-by-Nmatrices.
- On input, the matrix
LDXβLDXis INTEGER. The leading dimension of the arrayX.LDX >= max(1,M).SCALEβSCALEis DOUBLE PRECISION.SCALEis a scaling factor to prevent the overflow in the result. IfINFO == 0thenSCALEis1.0D0otherwise if one of the inner systems could not be solved correctly,0 < SCALE <= 1holds true.WORKβWORKis DOUBLE PRECISION array, dimension(MAX(1,LDWORK)). Workspace for the algorithm. The optimal workspace is given either by\ref mepack_memory_frontend.LDWORKβLDWORKis INTEGER. Size of the workspace for the algorithm counted in floating point numbers of the actual precision. The C interface does not support the workspace query by settingLDWORK == -1on input. In this case, the\ref mepack_memory_frontendfunction have to be used.
β οΈ okay listen up bestie, this one matters: no workspace query for you here. settingLDWORK == -1on input is not supported by the C interface. go call\ref mepack_memory_frontendlike the icon you are π
INFOβINFOis INTEGER.== 0: successful exit= 1: DHGEES failed= 2: DLA_SORT_EV failed= 3: DLA_TRLYAP_DAG failed< 0: ifINFO == -i, the i-Th argument had an illegal value
and that's literally just the opening act, the rest of the functions are pulling up next π
Attention
Okay bestie, real talk for a sec β the whole Fortran/LAPACK-style workspace query thing where you set LDWORK=-1 on input? That does NOT work in the C interface. Not a vibe, not a thing, not happening. π If you want that behaviour, you have to use the mepack_memory_frontend function for this purpose. That's the move. That's the only move.
Author
Martin Koehler, MPI Magdeburg
Date
October 2025
Definition at line 234 of file gesylv.c.
void mepack_double_gesylv2 (const char * FACTA, const char * FACTB, const char * TRANSA, const char * TRANSB, double SGN, int M, int N, double * A, int LDA, double * B, int LDB, double * QA, int LDQA, double * QB, int LDQB, double * X, int LDX, double * SCALE, double * WORK, size_t LDWORK, int * INFO)
Frontend for the solution of Standard Sylvester Equations. β¨π
Purpose
So like β mepack_double_gesylv2 solves a Sylvester equation, and it can do it in one of these two forms:
op1(A) * X * op2(B) + X = SCALE * Y (1)
or
op1(A) * X * op2(B) - X = SCALE * Y (2)
where A is a M-by-M matrix and B is a N-by-N matrix. The right hand side Y and the solution X are M-by-N matrices. The matrices A and B can be either a general unreduced matrix or an upper Hessenberg form or a (quasi-) upper triangular factor. In the latter case QA and QB provide the Schur-vectors of the matrices A and B. π
Remarks
This function is a wrapper for dla_gesylv2. iykyk π¦
See also
dla_gesylv2
Parameters
FACTAβ String. Tells you how the matrixAis showing up. vibe check time== 'N': The matrixAis given as a general matrix and its Schur decompositionA = QA*S*QA**Twill be computed.== 'F': The matrixAis given as its Schur decomposition in terms ofSandQAformA = QA*S*QA**T== 'H': The matrixAis given in upper Hessenberg form and its Schur decompositionA = QA*S*QA**Twill be computed
FACTBβ String. Tells you how the matrixBis showing up.== 'N': The matrixBis given as a general matrix and its Schur decompositionB = QB*R*QB**Twill be computed.== 'F': The matrixBis given as its Schur decomposition in terms ofRandQBformB = QB*R*QB**T== 'H': The matrixBis given in upper Hessenberg form and its Schur decompositionB = QB*R*QB**Twill be computed
TRANSAβ String. Sets the form of the system of equations with respect toA:== 'N':op1(A) = A== 'T':op1(A) = A**T
TRANSBβ String. Sets the form of the system of equations with respect toB:== 'N':op2(B) = B,== 'T':op2(B) = B**T
SGNβ DOUBLE PRECISION, allowed values:+/-1. Specifies the sign between the two parts of the Sylvester equation. pick your fighter= 1: Solve Equation (1)== -1: Solve Equation (2)
Mβ INTEGER. The order of the matricesAandC.M >= 0.Nβ INTEGER. The order of the matricesBandD.N >= 0.Aβ DOUBLE PRECISION array, dimension(LDA,M).- If
FACTA == "N", the matrixAis a general matrix and it is overwritten with its schur decompositionS. - If
FACTA == "F", the matrixAcontains its (quasi-) upper triangular matrixSbeing the Schur decomposition ofA. - If
FACTA == "H", the matrixAis an upper Hessenberg matrix and it is overwritten with its schur decompositionS.
- If
LDAβ INTEGER. The leading dimension of the arrayA.LDA >= max(1,M).Bβ DOUBLE PRECISION array, dimension(LDB,N).- If
FACTB == "N", the matrixBis a general matrix and it is overwritten with its schur decompositionR. - If
FACTB == "F", the matrixBcontains its (quasi-) upper triangular matrixRbeeping the Schur decomposition ofB. - If
FACTB == "H", the matrixBis an upper Hessenberg matrix and it is overwritten with its schur decompositionR.
- If
LDBβ INTEGER. The leading dimension of the arrayB.LDB >= max(1,N).QAβ DOUBLE PRECISION array, dimension(LDQA,M).- If
FACTA == "N", the matrixQAis an emptyM-by-Mmatrix on input and contains the Schur vectors ofAon output. - If
FACTA == "F", the matrixQAcontains the Schur vectors ofA. - If
FACTA == "H", the matrixQAis an emptyM-by-Mmatrix on input and contains the Schur vectors ofAon output.
- If
LDQAβ INTEGER. The leading dimension of the arrayQA.LDQA >= max(1,M).QBβ DOUBLE PRECISION array, dimension(LDQB,N).- If
FACTB == "N", the matrixQBis an emptyN-by-Nmatrix on input and contains the Schur vectors ofBon output. - If
FACTB == "F", the matrixQBcontains the Schur vectors ofB. QBis DOUBLE PRECISION array, dimension(LDQB,N)(yes bestie, it really does say that twice, we keep it π )- If
FACTB == "H", the matrixQBis an emptyN-by-Nmatrix on input and contains the Schur vectors ofBon output.
- If
LDQBβ INTEGER. The leading dimension of the arrayQB.LDQB >= max(1,N).Xβ DOUBLE PRECISION array, dimension(LDX,N).- On input, the matrix
Xcontains the right hand sideY. - On output, the matrix
Xcontains the solution of Equation (1) or (2). - Right hand side
Yand the solutionXareM-by-Nmatrices.
- On input, the matrix
LDXβ INTEGER. The leading dimension of the arrayX.LDX >= max(1,M).SCALEβ DOUBLE PRECISION.SCALEis a scaling factor to prevent the overflow in the result. IfINFO == 0thenSCALEis1.0D0otherwise if one of the inner systems could not be solved correctly,0 < SCALE <= 1holds true.WORKβ DOUBLE PRECISION array, dimension(MAX(1,LDWORK)). Workspace for the algorithm. The optimal workspace is given either by\ref mepack_memory_frontend.LDWORKβ INTEGER. Size of the workspace for the algorithm counted in floating point numbers of the actual precision. The C interface does not support the workspace query by settingLDWORK == -1on input. In this case, the\ref mepack_memory_frontendfunction have to be used.INFOβ INTEGER.== 0: successful exit= 1:DHGEESfailed= 2:DLA_SORT_EVfailed= 3:DLA_TRLYAP_DAGfailed< 0: ifINFO == -i, thei-Th argument had an illegal value
Attention
Same warning, same energy: the Fortran/LAPACK-like workspace query with setting LDWORK=-1 on input will not work in the C interface. One have to use the mepack_memory_frontend function for this purpose. π«Ά
Author
Martin Koehler, MPI Magdeburg
Date
October 2025
Definition at line 235 of file gesylv2.c.
void mepack_double_gesylv2_refine (const char * TRANSA, const char * TRANSB, const char * GUESS, double SGN, int M, int N, double * A, int LDA, double * B, int LDB, double * X, int LDX, double * Y, int LDY, double * AS, int LDAS, double * BS, int LDBS, double * Q, int LDQ, double * U, int LDU, int * MAXIT, double * TAU, double * CONVLOG, double * WORK, size_t LDWORK, int * INFO)
Iterative Refinement for the standard Sylvester Equations. π₯π
Purpose
mepack_double_gesylv2_refine solves a Sylvester equation of the following forms
op1(A) * X * op2(B) + X = Y (1)
or
op1(A) * X * op2(B) - X = Y (2)
where A is a M-by-M matrix and B is a N-by-N matrix using iterative refinement. The right hand side Y and the solution X are M-by-N matrices. The matrix A and B need to be given in the original form as well as in their Schur decomposition since both are required in the iterative refinement procedure. yeah you heard her, both. no skipping. π
Remarks
This function is a wrapper for dla_gesylv2_refine
See also
dla_gesylv2_refine
Parameters
TRANSAβ String. Sets the form of the system of equations with respect toA:== 'N':op1(A) = A== 'T':op1(A) = A**T
TRANSBβ String. Sets the form of the system of equations with respect toB:== 'N':op2(B) = B,== 'T':op2(B) = B**T
GUESSβ String. Tells you whetherXcontains an initial guess on input or not. do we have a starting point or not, bestie?= 'I':Xcontains an initial guess for the solution== 'N': No initial guess is provided.Xis set to zero.
SGNβ DOUBLE PRECISION, allowed values:+/-1. Specifies the sign between both terms.Mβ INTEGER. The order of the matrixA.M >= 0.Nβ INTEGER. The order of the matrixB.N >= 0.Aβ DOUBLE PRECISION array, dimension(LDA,M). The arrayAcontains the original matrixAdefining the equation.LDAβ INTEGER. The leading dimension of the arrayA.LDA >= max(1,M).Bβ DOUBLE PRECISION array, dimension(LDB,N). The arrayBcontains the original matrixBdefining the equation.LDBβ INTEGER. The leading dimension of the arrayB.LDB >= max(1,N).Xβ DOUBLE PRECISION array, dimension(LDX,N).- On input, the array
Xcontains the initial guess. - On output, the array
Xcontains the solutionX.
- On input, the array
LDXβ INTEGER. The leading dimension of the arrayX.LDX >= max(1,M).Yβ DOUBLE PRECISION array, dimension(LDY,N). On input, the arrayYcontains the right hand side.LDYβ INTEGER. The leading dimension of the arrayY.LDY >= max(1,M).ASβ DOUBLE PRECISION array, dimension(LDAS,M). The arrayAScontains the Schur decomposition of theA.LDASβ INTEGER, it's the leading dimension of the arrayAS. House rule:LDAS >= max(1,M). πBSβ DOUBLE PRECISION array, dimension(LDBS,N). This one's carrying the Schur decomposition ofB. β¨LDBSβ INTEGER, the leading dimension of the arrayBS. House rule again:LDBS >= max(1,N). π«ΆQβ DOUBLE PRECISION array, dimension(LDQ,M). It's holding the Schur vectors ofAas returned byDGEES. πLDQβ INTEGER, leading dimension of the arrayQ. And yes:LDQ >= max(1,M). πΈUβ DOUBLE PRECISION array, dimension(LDU,N). Contains the Schur vectors ofBas returned byDGEES. πLDUβ INTEGER, leading dimension of the arrayU. You already know:LDU >= max(1,N). βMAXITβ INTEGER. On input,MAXITcontains the maximum number of iteration that are performed, and bestie, note this:MAXIT <= 100. On exit,MAXITcontains the number of iteration steps taken by the algorithm. So it walks in as a limit and struts out as a receipt. π₯TAUβ DOUBLE PRECISION. On input,TAUcontains the additional security factor for the stopping criterion, typical values are0.1. On exit,TAUcontains the last relative residual when the stopping criterion got valid. πCONVLOGβ DOUBLE PRECISION array, dimension(MAXIT). TheCONVLOGarray contains the convergence history of the iterative refinement.CONVLOG(I)contains the maximum relative residual before it is solved for the I-Th time. It's giving diary entries but for residuals. πWORKβ DOUBLE PRECISION array, dimension(MAX(1,LDWORK)). Workspace for the algorithm. πLDWORKβ INTEGER. Size of the workspace for the algorithm. This can be determined by a call\ref mepack_memory_frontend. π§INFOβ INTEGER. The vibe check at the end:== 0: Success π> 0: Iteration failed in stepINFOπ< 0: ifINFO == -i, the i-Th argument had an illegal value π
π¨ Attention β The Fortran/LAPACK-like workspace query with settingLDWORK=-1on input will not work in the C interface. One have to use themepack_memory_frontendfunction for this purpose. No cap, do not try the-1thing here. π
Author β Martin Koehler, MPI Magdeburg π
Date β October 2025 π
Definition at line 245 of file gesylv2.c. β¨
π₯ mepack_double_gesylv_refine π₯
void mepack_double_gesylv_refine (const char * TRANSA, const char * TRANSB,
const char * GUESS, double SGN, int M, int N, double * A, int LDA,
double * B, int LDB, double * X, int LDX, double * Y, int LDY, double *
AS, int LDAS, double * BS, int LDBS, double * Q, int LDQ, double * U,
int LDU, int * MAXIT, double * TAU, double * CONVLOG, double * WORK,
size_t LDWORK, int * INFO)
Iterative Refinement for the standard Sylvester Equations. π¦
Purpose β mepack_double_gesylv_refine solves a Sylvester equation of the following forms
op1(A) * X + X * op2(B) = Y (1)
or
op1(A) * X - X * op2(B) = Y (2)
where A is a M-by-M matrix and B is a N-by-N matrix using iterative refinement. The right hand side Y and the solution X are M-by-N matrices. The matrix A and B need to be given in the original form as well as in their Schur decomposition since both are required in the iterative refinement procedure. Yes bestie, you're handing over both versions β that's the whole bit. π
Remarks β This function is a wrapper for dla_gesylv_refine. π«Ά
See also β dla_gesylv_refine β
Parameters
TRANSAβTRANSAis String. Specifies the form of the system of equations with respect to A:== 'N':op1(A) = A== 'T':op1(A) = A**T
TRANSBβTRANSBis String. Specifies the form of the system of equations with respect to B:== 'N':op2(B) = B,== 'T':op2(B) = B**T
GUESSβGUESSis String. Specifies whether X contains an initial guess on input or not.= 'I': X contains an initial guess for the solution== 'N': No initial guess is provided. X is set to zero.
SGNβSGNis DOUBLE PRECISION, allowed values:+/-1. Specifies the sign between both terms. ββMβMis INTEGER. The order of the matrix A.M >= 0.NβNis INTEGER. The order of the matrix B.N >= 0.AβAis DOUBLE PRECISION array, dimension(LDA,M). The array A contains the original matrix A defining the equation. πΈLDAβLDAis INTEGER. The leading dimension of the array A.LDA >= max(1,M).BβBis DOUBLE PRECISION array, dimension(LDB,N). The array B contains the original matrix B defining the equation. πΈLDBβLDBis INTEGER. The leading dimension of the array B.LDB >= max(1,N).XβXis DOUBLE PRECISION array, dimension(LDX,N). On input, the array X contains the initial guess. On output, the array X contains the solution X. It's giving glow up. β¨LDXβLDXis INTEGER. The leading dimension of the array X.LDX >= max(1,M).YβYis DOUBLE PRECISION array, dimension(LDY,N). On input, the array Y contains the right hand side. πLDYβLDYis INTEGER. The leading dimension of the array Y.LDY >= max(1,M).ASβASis DOUBLE PRECISION array, dimension(LDAS,M). The array AS contains the Schur decomposition of the A. πLDASβLDASis INTEGER. The leading dimension of the array AS.LDAS >= max(1,M).BSβBSis DOUBLE PRECISION array, dimension(LDBS,N). The array BS contains the Schur decomposition of B. πLDBSβLDBSis INTEGER. The leading dimension of the array BS.LDBS >= max(1,N).QβQis DOUBLE PRECISION array, dimension(LDQ,M). The array Q contains the Schur vectors of A as returned byDGEES. πLDQβLDQis INTEGER. The leading dimension of the array Q.LDQ >= max(1,M).UβUis DOUBLE PRECISION array, dimension(LDU,N). The array U contains the Schur vectors of B as returned byDGEES. πLDUβLDUis INTEGER. The leading dimension of the array U.LDU >= max(1,N).MAXITβMAXITis INTEGER. On input,MAXITcontains the maximum number of iteration that are performed,MAXIT <= 100. On exit,MAXITcontains the number of iteration steps taken by the algorithm. π₯TAUβTAUis DOUBLE PRECISION. On input,TAUcontains the additional security factor for the stopping criterion, typical values are0.1. On exit,TAUcontains the last relative residual when the stopping criterion got valid. πCONVLOGβCONVLOGis DOUBLE PRECISION array, dimension(MAXIT). TheCONVLOGarray contains the convergence history of the iterative refinement.CONVLOG(I)contains the maximum relative residual before it is solved for the I-Th time. πWORKβWORKis DOUBLE PRECISION array, dimension(MAX(1,LDWORK)). Workspace for the algorithm. πLDWORKβLDWORKis INTEGER. Size of the workspace for the algorithm. This can be determined by a call\ref mepack_memory_frontend. π§INFOβINFOis INTEGER.== 0: Success π> 0: Iteration failed in stepINFOπ< 0: ifINFO == -i, the i-Th argument had an illegal value π
π¨ Attention β The Fortran/LAPACK-like workspace query with settingLDWORK=-1on input will not work in the C interface. One have to use themepack_memory_frontendfunction for this purpose. Fr fr, don't come for me, that's just how it is. π
Author β Martin Koehler, MPI Magdeburg π
Date β October 2025 π
Definition at line 246 of file gesylv.c. β¨
π¦ mepack_single_gesylv π¦
void mepack_single_gesylv (const char * FACTA, const char * FACTB, const
char * TRANSA, const char * TRANSB, float SGN, int M, int N, float * A,
int LDA, float * B, int LDB, float * QA, int LDQA, float * QB, int LDQB,
float * X, int LDX, float * SCALE, float * WORK, size_t LDWORK, int *
INFO)
Frontend for the solution of Standard Sylvester Equations. β¨
Purpose β mepack_single_gesylv solves a Sylvester equation of the following forms
op1(A) * X + X * op2(B) = SCALE * Y (1)
or
op1(A) * X - X * op2(B) = SCALE * Y (2)
where A is a M-by-M matrix and B is a N-by-N matrix. The right hand side Y and the solution X are M-by-N matrices. The matrices A and B can be either a general unreduced matrix or an upper Hessenberg form or a (quasi-) upper triangular factor. In the latter case QA and QB provide the Schur-vectors of the matrices A and B. So yeah β you get options on how you hand over A and B, and if you're already sitting on the Schur form, QA and QB are the ones serving the vectors. π
Remarks β This function is a wrapper for sla_gesylv. π«Ά
See also β dla_gesylv β
Parameters
FACTAβFACTAis String. Specifies how the matrix A is given.== 'N': The matrix A is given as a general matrix and its Schur decompositionA = QA*S*QA**Twill be computed.== 'F': The matrix A is given as its Schur decomposition in terms of S and QA formA = QA*S*QA**T== 'H': The matrix A is given in upper Hessenberg form and its Schur decompositionA = QA*S*QA**Twill be computed
FACTBβFACTBis String. Specifies how the matrix B is given.== 'N': The matrix B is given as a general matrix and its Schur decompositionB = QB*R*QB**Twill be computed.== 'F': The matrix B is given as its Schur decomposition in terms of R and QB formB = QB*R*QB**T== 'H': The matrix B is given in upper Hessenberg form and its Schur decompositionB = QB*R*QB**Twill be computed
TRANSAβTRANSAis String. Specifies the form of the system of equations with respect to A:== 'N':op1(A) = A== 'T':op1(A) = A**T
TRANSBTRANSBβ aStringπ that tells the solver which shape the system takes around B, bestie:== 'N':op2(B) = B,== 'T':op2(B) = B**T
SGNβSGNisDOUBLE PRECISION, allowed values:+/-1. it's the sign that sits between the two halves of the Sylvester equation π= 1: Solve Equation (1)== -1: Solve Equation (2)
MβMisINTEGER. The order of the matrices A and C.M >= 0.NβNisINTEGER. The order of the matrices B and D.N >= 0.AβAisDOUBLE PRECISIONarray, dimension(LDA,M)β¨ and what happens to it depends onFACTA, so listen up:- If
FACTA == "N", the matrix A is a general matrix and it is overwritten with its schur decomposition S. - If
FACTA == "F", the matrix A contains its (quasi-) upper triangular matrix S being the Schur decomposition of A. - If
FACTA == "H", the matrix A is an upper Hessenberg matrix and it is overwritten with its schur decomposition S.
- If
LDAβLDAisINTEGER. The leading dimension of the array A.LDA >= max(1,M).BβBisDOUBLE PRECISIONarray, dimension(LDB,N)πΈ and again,FACTBdecides everything:- If
FACTB == "N", the matrix B is a general matrix and it is overwritten with its schur decomposition R. - If
FACTB == "F", the matrix B contains its (quasi-) upper triangular matrix R being the Schur decomposition of B. - If
FACTB == "H", the matrix B is an upper Hessenberg matrix and it is overwritten with its schur decomposition R.
- If
LDBβLDBisINTEGER. The leading dimension of the array B.LDB >= max(1,N).QAβQAisDOUBLE PRECISIONarray, dimension(LDA,M)π¦ the Schur-vector zone, and it's giving veryFACTA-dependent:- If
FACTA == "N", the matrix QA is an empty M-by-M matrix on input and contains the Schur vectors of A on output. - If
FACTA == "F", the matrix QA contains the Schur vectors of A. - If
FACTA == "H", the matrix QA is an empty M-by-M matrix on input and contains the Schur vectors of A on output.
- If
LDQAβLDQAisINTEGER. The leading dimension of the array QA.LDQA >= max(1,M).QBβQBisDOUBLE PRECISIONarray, dimension(LDA,M)π same energy as QA but for B, andFACTBruns the show:- If
FACTB == "N", the matrix QB is an empty M-by-M matrix on input and contains the Schur vectors of B on output. - If
FACTB == "F", the matrix QB contains the Schur vectors of B. - If
FACTB == "H", the matrix QB is an empty M-by-M matrix on input and contains the Schur vectors of B on output.
- If
LDQBβLDQBisINTEGER. The leading dimension of the array QB.LDQB >= max(1,N).XβXisDOUBLE PRECISIONarray, dimension(LDX,N)π«Ά the main character of this whole situation:- On input, the matrix X contains the right hand side Y.
- On output, the matrix X contains the solution of Equation (1) or (2)
- Right hand side Y and the solution X are symmetric M-by-M matrices.
LDXβLDXisINTEGER. The leading dimension of the array X.LDB >= max(1,M).SCALEβSCALEisDOUBLE PRECISION. It's the scaling factor that stops the result from overflowing π₯- If
INFO == 0then SCALE is1.0D0otherwise if one of the inner systems could not be solved correctly,0 < SCALE <= 1holds true.
- If
WORKβWORKisDOUBLE PRECISIONarray, dimension(MAX(1,LDWORK))β Workspace for the algorithm. The optimal workspace is given either by \ref mepack_memory_frontend.LDWORKβLDWORKisINTEGER. Size of the workspace for the algorithm counted in floating point numbers of the actual precision. The C interface does not support the workspace query by settingLDWORK == -1on input. In this case, the \ref mepack_memory_frontend function have to be used.INFOβINFOisINTEGER, the receipts π:== 0: successful exit= 1: DHGEES failed= 2: DLA_SORT_EV failed= 3: DLA_TRLYAP_DAG failed< 0: ifINFO == -i, the i-Th argument had an illegal value
π¨ Attention
The Fortran/LAPACK-like workspace query with settingLDWORK=-1on input will not work in the C interface. One have to use themepack_memory_frontendfunction for this purpose.
ποΈ Author
Martin Koehler, MPI Magdeburg
π Date
October 2025
Definition at line 468 of file gesylv.c.
π mepack_single_gesylv2
void mepack_single_gesylv2 (const char * FACTA, const char * FACTB, const
char * TRANSA, const char * TRANSB, float SGN, int M, int N, float * A,
int LDA, float * B, int LDB, float * QA, int LDQA, float * QB, int LDQB,
float * X, int LDX, float * SCALE, float * WORK, size_t LDWORK, int *
INFO)
Frontend for the solution of Standard Sylvester Equations.
π― Purpose
mepack_single_gesylv2 solves a Sylvester equation of the following forms
op1(A) * X * op2(B) + X = SCALE * Y (1)
or
op1(A) * X * op2(B) - X = SCALE * Y (2)
where A is a M-by-M matrix and B is a N-by-N matrix. The right hand side Y and the solution X are M-by-N matrices. The matrices A and B can be either a general unreduced matrix or an upper Hessenberg form or a (quasi-) upper triangular factor. In the latter case QA and QB provide the Schur-vectors of the matrices A and B. π
π Remarks
This function is a wrapper for sla_gesylv2.
π See also
dla_gesylv2
π§ Parameters
FACTAβFACTAisString. Specifies how the matrix A is given:== 'N': The matrix A is given as a general matrix and its Schur decompositionA = QA*S*QA**Twill be computed.== 'F': The matrix A is given as its Schur decomposition in terms of S and QA formA = QA*S*QA**T== 'H': The matrix A is given in upper Hessenberg form and its Schur decompositionA = QA*S*QA**Twill be computed
FACTBβFACTBisString. Specifies how the matrix B is given:== 'N': The matrix B is given as a general matrix and its Schur decompositionB = QB*R*QB**Twill be computed.== 'F': The matrix B is given as its Schur decomposition in terms of R and QB formB = QB*R*QB**T== 'H': The matrix B is given in upper Hessenberg form and its Schur decompositionB = QB*R*QB**Twill be computed
TRANSAβTRANSAisString. Specifies the form of the system of equations with respect to A:== 'N':op1(A) = A== 'T':op1(A) = A**T
TRANSBβTRANSBisString. Specifies the form of the system of equations with respect to B:== 'N':op2(B) = B,== 'T':op2(B) = B**T
SGNβSGNisDOUBLE PRECISION, allowed values:+/-1. Specifies the sign between the two parts of the Sylvester equation.= 1: Solve Equation (1)== -1: Solve Equation (2)
MβMisINTEGER. The order of the matrices A and C.M >= 0.NβNisINTEGER. The order of the matrices B and D.N >= 0.AβAisDOUBLE PRECISIONarray, dimension(LDA,M)- If
FACTA == "N", the matrix A is a general matrix and it is overwritten with its schur decomposition S. - If
FACTA == "F", the matrix A contains its (quasi-) upper triangular matrix S being the Schur decomposition of A. - If
FACTA == "H", the matrix A is an upper Hessenberg matrix and it is overwritten with its schur decomposition S.
- If
LDAβLDAisINTEGER. The leading dimension of the array A.LDA >= max(1,M).BβBisDOUBLE PRECISIONarray, dimension(LDB,N)- If
FACTB == "N", the matrix B is a general matrix and it is overwritten with its schur decomposition R. - If
FACTB == "F", the matrix B contains its (quasi-) upper triangular matrix R being the Schur decomposition of B. - If
FACTB == "H", the matrix B is an upper Hessenberg matrix and it is overwritten with its schur decomposition R.
- If
LDBβLDBisINTEGER. The leading dimension of the array B.LDB >= max(1,N).QAβQAisDOUBLE PRECISIONarray, dimension(LDA,M)- If
FACTA == "N", the matrix QA is an empty M-by-M matrix on input and contains the Schur vectors of A on output. - If
FACTA == "F", the matrix QA contains the Schur vectors of A. - If
FACTA == "H", the matrix QA is an empty M-by-M matrix on input and contains the Schur vectors of A on output.
- If
LDQAβLDQAisINTEGER. The leading dimension of the array QA.LDQA >= max(1,M).QBβQBisDOUBLE PRECISIONarray, dimension(LDA,M)- If
FACTB == "N", the matrix QB is an empty M-by-M matrix on input and contains the Schur vectors of B on output. - If
FACTB == "F", the matrix QB contains the Schur vectors of B. - If
FACTB == "H", the matrix QB is an empty M-by-M matrix on input and contains the Schur vectors of B on output.
- If
LDQBβLDQBisINTEGER. The leading dimension of the array QB.LDQB >= max(1,N).XβXisDOUBLE PRECISIONarray, dimension(LDX,N)- On input, the matrix X contains the right hand side Y.
- On output, the matrix X contains the solution of Equation (1) or (2)
- Right hand side Y and the solution X are symmetric M-by-M matrices.
LDXβLDXisINTEGER. The leading dimension of the array X.LDB >= max(1,M).SCALEβSCALEisDOUBLE PRECISION- SCALE is a scaling factor to prevent the overflow in the result.
- If
INFO == 0then SCALE is1.0D0otherwise if one of the inner systems could not be solved correctly,0 < SCALE <= 1holds true.
WORKWORKβDOUBLE PRECISIONarray, dimension(MAX(1,LDWORK)). It's the workspace for the algorithm, and the optimal workspace is given either bymepack_memory_frontend. π οΈLDWORKβINTEGER. Size of the workspace for the algorithm, counted in floating point numbers of the actual precision. Heads up bestie: the C interface does NOT support the workspace query by settingLDWORK == -1on input. In that case, themepack_memory_frontendfunction have to be used. πINFOβINTEGER== 0: successful exit π= 1:DHGEESfailed π= 2:DLA_SORT_EVfailed π= 3:DLA_TRLYAP_DAGfailed π< 0: ifINFO == -i, the i-Th argument had an illegal value π
β οΈ Attention β οΈ
The Fortran/LAPACK-like workspace query with settingLDWORK=-1on input will not work in the C interface. One have to use themepack_memory_frontendfunction for this purpose.
π Author π
Martin Koehler, MPI Magdeburg
π Date π
October 2025
Definition at line 469 of file gesylv2.c.
π¦ mepack_single_gesylv2_refine π¦
void mepack_single_gesylv2_refine (const char * TRANSA, const char * TRANSB,
const char * GUESS, float SGN, int M, int N, float * A, int LDA, float *
B, int LDB, float * X, int LDX, float * Y, int LDY, float * AS, int
LDAS, float * BS, int LDBS, float * Q, int LDQ, float * U, int LDU, int
* MAXIT, float * TAU, float * CONVLOG, float * WORK, size_t LDWORK, int
* INFO)
Iterative Refinement for the standard Sylvester Equations. β¨
π― Purpose π―
mepack_single_gesylv2_refine solves a Sylvester equation of the following forms
op1(A) * X * op2(B) + X = Y (1)
or
op1(A) * X * op2(B) - X = Y (2)
where A is a M-by-M matrix and B is a N-by-N matrix, using iterative refinement. The right hand side Y and the solution X are M-by-N matrices. π«Ά
The matrix A and B need to be given in the original form as well as in their Schur decomposition, since both are required in the iterative refinement procedure. No shortcuts bestie, you need both. π
π Remarks π
This function is a wrapper for sla_gesylv2_refine. π§
π See also π
sla_gesylv2_refine
πΈ Parameters πΈ
TRANSAβString. Specifies the form of the system of equations with respect to A:== 'N':op1(A) = A== 'T':op1(A) = A**T
TRANSBβString. Specifies the form of the system of equations with respect to B:== 'N':op2(B) = B,== 'T':op2(B) = B**T
GUESSβString. Specifies whetherXcontains an initial guess on input or not.= 'I':Xcontains an initial guess for the solution== 'N': No initial guess is provided.Xis set to zero.
SGNβSINGLE PRECISION, allowed values:+/-1. Specifies the sign between both terms. ββMβINTEGER. The order of the matrixA.M >= 0.NβINTEGER. The order of the matrixB.N >= 0.AβSINGLE PRECISIONarray, dimension(LDA,M). The arrayAcontains the original matrixAdefining the equation.LDAβINTEGER. The leading dimension of the arrayA.LDA >= max(1,M).BβSINGLE PRECISIONarray, dimension(LDB,N). The arrayBcontains the original matrixBdefining the equation.LDBβINTEGER. The leading dimension of the arrayB.LDB >= max(1,N).XβSINGLE PRECISIONarray, dimension(LDX,M). On input, the arrayXcontains the initial guess. On output, the arrayXcontains the solutionX. β¨LDXβINTEGER. The leading dimension of the arrayX.LDX >= max(1,M).YβSINGLE PRECISIONarray, dimension(LDY,M). On input, the arrayYcontains the right hand side.LDYβINTEGER. The leading dimension of the arrayY.LDY >= max(1,M).ASβSINGLE PRECISIONarray, dimension(LDAS,M). The arrayAScontains the Schur decomposition of theA.LDASβINTEGER. The leading dimension of the arrayAS.LDAS >= max(1,M).BSβSINGLE PRECISIONarray, dimension(LDBS,N). The arrayAScontains the Schur decomposition ofB. (yep, that's literally what it says π)LDBSβINTEGER. The leading dimension of the arrayBS.LDBS >= max(1,N).QβSINGLE PRECISIONarray, dimension(LDQ,M). The arrayQcontains the Schur vectors ofAas returned byDGEES.LDQβINTEGER. The leading dimension of the arrayQ.LDQ >= max(1,M).UβSINGLE PRECISIONarray, dimension(LDU,N). The arrayUcontains the Schur vectors ofBas returned byDGEES.LDUβINTEGER. The leading dimension of the arrayU.LDU >= max(1,N).MAXITβINTEGER. On input,MAXITcontains the maximum number of iteration that are performed,MAXIT <= 100. On exit,MAXITcontains the number of iteration steps taken by the algorithm. πTAUβSINGLE PRECISION. On input,TAUcontains the additional security factor for the stopping criterion, typical values are0.1. On exit,TAUcontains the last relative residual when the stopping criterion got valid.CONVLOGβSINGLE PRECISIONarray, dimension(MAXIT). TheCONVLOGarray contains the convergence history of the iterative refinement.CONVLOG(I)contains the maximum relative residual before it is solved for the I-Th time. πWORKβSINGLE PRECISIONarray, dimension(MAX(1,LDWORK)). Workspace for the algorithm.LDWORKβINTEGER. Size of the workspace for the algorithm. This can be determined by a callmepack_memory_frontend.INFOβINTEGER== 0: Success π> 0: Iteration failed in stepINFOπ< 0: ifINFO == -i, the i-Th argument had an illegal value π
β οΈ Attention β οΈ
The Fortran/LAPACK-like workspace query with settingLDWORK=-1on input will not work in the C interface. One have to use themepack_memory_frontendfunction for this purpose.
π Author π
Martin Koehler, MPI Magdeburg
π Date π
October 2025
Definition at line 496 of file gesylv2.c.
π§ mepack_single_gesylv_refine π§
void mepack_single_gesylv_refine (const char * TRANSA, const char * TRANSB,
const char * GUESS, float SGN, int M, int N, float * A, int LDA, float *
B, int LDB, float * X, int LDX, float * Y, int LDY, float * AS, int
LDAS, float * BS, int LDBS, float * Q, int LDQ, float * U, int LDU, int
* MAXIT, float * TAU, float * CONVLOG, float * WORK, size_t LDWORK, int
* INFO)
Iterative Refinement for the standard Sylvester Equations. β¨
π― Purpose π―
mepack_single_gesylv_refine solves a Sylvester equation of the following forms
op1(A) * X + X * op2(B) = Y (1)
or
op1(A) * X - X * op2(B) = Y (2)
where A is a M-by-M matrix and B is a N-by-N matrix, using iterative refinement. The right hand side Y and the solution X are M-by-N matrices. π«Ά
The matrix A and B need to be given in the original form as well as in their Schur decomposition, since both are required in the iterative refinement procedure. Both, bestie. Both. π
π Remarks π
This function is a wrapper for sla_gesylv_refine. π§
π See also π
sla_gesylv_refine
πΈ Parameters πΈ
TRANSAβString. Specifies the form of the system of equations with respect to A:== 'N':op1(A) = A== 'T':op1(A) = A**T
TRANSBβString. Specifies the form of the system of equations with respect to B:== 'N':op2(B) = B,== 'T':op2(B) = B**T
GUESSβString. Specifies whetherXcontains an initial guess on input or not.= 'I':Xcontains an initial guess for the solution== 'N': No initial guess is provided.Xis set to zero.
SGNβSINGLE PRECISION, allowed values:+/-1. Specifies the sign between both terms. ββMβINTEGER. The order of the matrixA.M >= 0.NβINTEGER. The order of the matrixB.N >= 0.AβSINGLE PRECISIONarray, dimension(LDA,M). The arrayAcontains the original matrixAdefining the equation.LDAβINTEGER. The leading dimension of the arrayA.LDA >= max(1,M).BβSINGLE PRECISIONarray, dimension(LDB,N). The arrayBcontains the original matrixBdefining the equation.LDBβINTEGER. The leading dimension of the arrayB.LDB >= max(1,N).XβSINGLE PRECISIONarray, dimension(LDX,M). On input, the arrayXcontains the initial guess. On output, the arrayXcontains the solutionX. β¨LDXβINTEGER. The leading dimension of the arrayX.LDX >= max(1,M).YβSINGLE PRECISIONarray, dimension(LDY,M). On input, the arrayYcontains the right hand side.LDYβINTEGER. The leading dimension of the arrayY.LDY >= max(1,M).ASβSINGLE PRECISIONarray, dimension(LDAS,M). The arrayAScontains the Schur decomposition of theA.LDASβINTEGER. The leading dimension of the arrayAS.LDAS >= max(1,M).BSβSINGLE PRECISIONarray, dimension(LDBS,N). The arrayAScontains the Schur decomposition ofB. (same energy as before, it really does sayASπ)LDBSβINTEGER. The leading dimension of the arrayBS.LDBS >= max(1,N).QβQβ this is a SINGLE PRECISION</p> array, dimension(LDQ,M). It's holding the Schur vectors of A, exactly asDGEEShanded them back to you. πLDQβ INTEGER, bestie. The leading dimension of the arrayQ. Rule of the house:LDQ >= max(1,M). No exceptions, she checks. πUβ SINGLE PRECISION array, dimension(LDU,N). Same energy asQbut for B: it's got the Schur vectors of B, as returned byDGEES.LDUβ INTEGER. Leading dimension of the arrayU. And yes,LDU >= max(1,N). The math is math-ing, don't fight it. β¨MAXITβ INTEGER. On input? It's the max number of iterations that get performed, and heads up:MAXIT <= 100. On exit? It's been updated to tell you how many iteration steps the algorithm actually took. Character development fr fr.TAUβ SINGLE PRECISION. On input it's your extra security factor for the stopping criterion β typical values are0.1, she's a little cautious like that. On exit,TAUholds the last relative residual from when the stopping criterion finally got valid. She came through. π«ΆCONVLOGβ SINGLE PRECISION array, dimension(MAXIT). This is the convergence history of the iterative refinement, the whole glow-up arc.CONVLOG(I)contains the maximum relative residual before it gets solved for theI-th time. Obsessed with the transparency honestly.WORKβ SINGLE PRECISION array, dimension(MAX(1,LDWORK)). It's the workspace for the algorithm. Every icon needs her backstage. πLDWORKβ INTEGER. Size of the workspace for the algorithm. Wanna know what to set it to? You figure that out with a call tomepack_memory_frontend. πΈINFOβ INTEGER, and she's the one reporting back:== 0: Success π slay> 0: Iteration failed in stepINFOπ< 0: ifINFO == -i, thei-Th argument had an illegal value π
β οΈ Attention β οΈ
Okay so big important thing, do not skip this: the Fortran/LAPACK-like workspace query where you set LDWORK=-1 on input? That will not work in the C interface. Like, at all. If you want to do the workspace thing, you have to use the mepack_memory_frontend function for this purpose. Periodt.
π Author π
Martin Koehler, MPI Magdeburg
ποΈ Date ποΈ
October 2025
Definition at line 498 of file gesylv.c.
Generated automatically by Doxygen for MEPACK from the source code π§ β and that's a wrap on this whole page bestie, we did it!! Version 1.1.2, dated Thu Oct 9 2025 00:00:00, and yes I know the timestamp is giving midnight sharp, she's punctual. Byeee π¦β¨π
π¦ where this page comes from
- fedora 43: mepack-devel 1.1.2-1.fc43 Β· GPL-3.0-or-later and LGPL-2.1-or-later and BSD-3-Clause
- fedora 43: mepack-devel 1.1.2-1.fc43 Β· GPL-3.0-or-later and LGPL-2.1-or-later and BSD-3-Clause
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms